通过Mybatis进行数据库操作

Mybatis的实现原理和使用方法

Posted by Sun Jianjiao on January 3, 2016

Mybatis 基本原理

代理模式在GoF设计模式尤为突出,Spring AOP 就是代理模式的一个例子,而且它使用的也是JDK的动态代理实现。MyBatis同样在Mapper接口执行时也是使用这个,当你第一次使用Mybatis的Mapper接口时肯定和我一样非常惊讶,为什么主要定义接口,不需要实现,就可以使用了呢?

说说JDK动态代理,主要是三点

A:target-interface // 定义接口

B:target-proxy implements InvocationHandler // 代理实现动态代理接口

C:Proxy.newProxyInstance(Thread.currentThread().getContextClassLoader(),

new Class[]{target-interface.class},

new target-proxy()); // 生成代理对象

只要完成以上三步,生成的代理对象调用接口的任何方法都会去调用 invoke 方法。其中 invoke 方法就是代理对象实现 InvocationHandler 的抽象方法。

Mybatis DAO接口为什么不需要实现类的原理 Mybatis 提供了 Mapper接口的代理对象,在执行 Mapper接口方法时,实际执行的是Mybatis的代理对象,代理对象在 invoke 方法内获取 Mapper接口类全名+方法全名 作为statement的ID,然后通过ID去Statement匹配注册的SQL,然后使用 SqlSession 执行这个 SQL。

所以,这也解释了为什么Mybatis映射文件需要 namespace 和 id , 前者是类全名,后者是方法名。

主要的类 SqlSessionFactoryBean

SqlSessionFactory

XMLConfigBuilder

Configuration

MapperRegistry

MapperProxyFactory

MapperProxy

MapperMethod

SqlCommand

MethodSignature

从源码出发 1)Spring 配置文件配置 SqlSessionFactoryBean

2)SqlSessionFactoryBean 调用 buildSqlSessionFactory() 创建 SqlSessionFactory 时会调用

3)XMLConfigBuilder.parse() ,目的就是构建 Configuration

4)Configuration 主要存储 Mybatis 所有的配置信息,当然也会有Mapper代理对象

5)XMLConfigBuilder.parseConfiguration 里面就注册了 Configuration 的部分配置,含 Mapper

6)执行重点方法 XMLConfigBuilder 的 mapperElement

Mysql和Java类型对应关系

mysql和java的对应关系见[mysql官方文档]https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-reference-type-conversions.html

需要注意的是Mysql的DATETIME/TIMESTAMP都是对应java.sql.Timestamp。

时间可以直接通过字符串进行通信,sql的DATETIME/TIMESTAMP都可以直接和字符串进行比较。