1.背景
我们经常使用mybatis作为ORM框架,快捷地进行数据库操作代码的编写,但是,我们在享受它的便捷时,总是存在某些疑惑,它内部到底是怎么运行的呢?
2.使用表象
Spring Bean配置文件:SqlSessionFactoryBean,MapperScannerConfigurer
Mapper.xml文件:自动生成(mybatis-generator插件)
Mapper.java类:自动生成(mybatis-generator插件)
3.启动流程
a) SqlSessionFactoryBean实例化,调用buildSqlSessionFactory方法,开始配置文件的读取(XMLConfigBuilder类)主要读取mybatis-config.xml文件
b) 组装Configuration对象
c) MapperScannerConfigurer实例化,读取某些路径下的Mapper.xml配置文件,填充Configuration对象
4.调用流程
a) Mapper接口会生成MapperProxy代理对象,调用Invoke方法
b)调用MapperMethod对象,该对象含有接口的定义方法,入参,出参;
c) 调用SqlSession接口的实现类SqlSessionTemplate对象
d) 调用SqlSessionUtils类获取SqlSession接口的实现DefaultSqlSession对象
e) DefaultSqlSession对象开启Session,实例化事务对象,Executor对象
d) Executor对象实例化一些处理器:Sql执行前的PreparedStatementHandler,Sql执行后的DefaultResultSetHandler
f) 执行sql,处理返回值,封装到DefaultResultSetHandler
g) 逐级返回执行结果
5. 事务管理
a) 通过数据库连接来控制自动提交还是手动提交,autoCommit=true/false。
b) 事务管理器在执行sql之前开启事务,执行失败,回滚事务;执行成功,提交事务。
6.问题
a) 调用Mapper接口,如何返回值?
Mapper接口生成了代理对象,最终调用的是MapperProxy对象的Invoke方法,继而调用MapperMethod的方法,接着是SqlSessionTemplate和SqlSessionUtils,最终是Executor对象执行Sql,得到返回值。
b) 分页插件的实现原理
Mybatis的Plugin