MyBatis源码的探知
个人对MyBatis源码的理解
大家肯定对MyBatis框架使用技巧都已经滚瓜烂熟了,但大家对于MyBatis中的各种配置的
我查看源码时会用到的快捷功能键:
IDE的快捷键设置(Eclipse方案):
Ctrl + Shift + T快速打开类型
Ctrl + 鼠标左键单击
Ctrl + T 查看实现类/实现方法
Ctrl + O快速查看和定位类的属性、方法
Ctrl + H全局搜索
Alt + ←代码导航之返回
MyBatis的工作原理
1.读取MyBatis配置文件(mybatis-config.xml)这个是为MyBatis设置的全局配置文件,里面有运行环境等包括数据库的连接信息。
2.加载映射文件(mybatis-config.xml)该文件中配置了操作数据库的sql语句,这个里面可以加载多个映射文件。
3.构造绘画工厂:通过MyBatis的环境等配置信息构建会话工厂SqlSeeionFactory。
4.创建会话对象:这个是由会话工厂创建SqlSession对象,该对象中包含了执行SQL语句的所有方法。
5.Executor执行器:MyBatis底层定义了一个Executor接口来操作数据库,他将根据SqlSession传递的参数动态的生成需要执行的SQL语句,同时负责查询缓存的维护。
6.MappedStatement对象:在Executor接口的执行方法中有一个MappedStatement类型的参数,该参数是对映射信息的封装,用于存储要映射的SQL语句的id、参数等信息。
7.输入参数映射:输入参数类型可以是Map、List等集合,也可以是基本数据类型。
8.输出结果映射:输入参数类型可以是Map、List等集合,也可以是基本数据类型。
将MyBatis源码关联到项目中便于调试
首先进入到Configuration类看MyBatis源码中的核心类的组成
本人会围绕这个核心类开始对源码进行探索!
在此之前要先准备好一个测试方法便于观察相关动态赋值的过程
如何映射数据类型?
2.如何映射数据类型?
Configuration中的属性TypeHandlerRegistry的构造函数对数据库的数据类型和java的数据类型进行了一一对应。
protected final TypeHandlerRegistry typeHandlerRegistry = new TypeHandlerRegistry();
public TypeHandlerRegistry() {
register(Boolean.class, new BooleanTypeHandler());
register(boolean.class, new BooleanTypeHandler());
register(JdbcType.BOOLEAN, new BooleanTypeHandler());
register(JdbcType.BIT, new BooleanTypeHandler());
register(Byte.class, new ByteTypeHandler());
register(byte.class, new ByteTypeHandler());
register(JdbcType.TINYINT, new ByteTypeHandler());
register(Short.class, new ShortTypeHandler());
register(short.class, new ShortTypeHandler());
register(JdbcType.SMALLINT, new ShortTypeHandler());
register(Integer.class, new IntegerTypeHandler());
register(int.class, new IntegerTypeHandler());
register(JdbcType.INTEGER, new IntegerTypeHandler());
register(Long.class, new LongTypeHandler());
register(long.class, new LongTypeHandler());
register(Float.class, new FloatTypeHandler());
register(float.class, new FloatTypeHandler());
register(JdbcType.FLOAT, new FloatTypeHandler());
register(Double.class, new DoubleTypeHandler());
register(double.class, new DoubleTypeHandler());
register(JdbcType.DOUBLE, new DoubleTypeHandler());
register(Reader.class, new ClobReaderTypeHandler());
register(String.class, new StringTypeHandler());
register(String.class, JdbcType.CHAR, new StringTypeHandler());
register(String.class, JdbcType.CLOB, new ClobTypeHandler());
register(String.class, JdbcType.VARCHAR, new StringTypeHandler());
register(String.class, JdbcType.LONGVARCHAR, new StringTypeHandler());
register(String.class, JdbcType.NVARCHAR, new NStringTypeHandler());
register(String.class, JdbcType.NCHAR, new NStringTypeHandler())