MyBatis底层原理----查询工作流程
https://blog.csdn.net/qq_42798661/article/details/90138529
MyBatis应用程序根据XML配置文件创建SqlSessionFactory,SqlSessionFactory在根据配置,配置来源于两个地方,一处是配置文件,一处是Java代码的注解,获取一个SqlSession。SqlSession包含了执行sql所需要的所有方法,可以通过SqlSession实例直接运行映射的sql语句,完成对数据的增删改查和事务提交等,用完之后关闭SqlSession
Mybatis封装了JDBC,也就是说,把对数据库的会话和事务控制封装在SqlSession对象中
注 : Mybatis在初始化时,会将配置信息全部加载到内存中并且通过org.apache.ibatis.session.Configuration实例来维护
1. 使用SqlSession时会传递statementId(即配置在Mapper中的Select的Id属性值)给它里面的SelectList函数,并返回结果
2. SelectList方法会根据statrmentId去键值对Configuration(key为namespace+id)中查找相对应的MappedStatement(在初始化的时候被加载,值是Mapper中的sql),将查询任务派给执行器Executor返回结果
3. 执行器Executor会根据MappedStatement等参数去query中解析动态sql生成保存sq的BoundSql对象,供给StatementHandler使用
执行器Executor会生成缓存key,调用重载query方法进行判断,有key值就返回,没有就将各种参数传递给queryFormDatabase方法(依靠doQuery方法)直接从数据库中读取数据,放入缓存
doQuery先创建java.lang.Statement(JDBC连接)对象,接着根据参数创建出StatementHandler对象来执行查询操作,然后将StatementHandler通过Statement的prepareStatement进行预编译,最后调用StatementHandler.query()方法,返回List结果集
4. StatementHandler对象主要完成两个工作:
(1)通过parameterize方法对Statement对象进行设值连接(由prepareStatement方法可了解到)。
在parameterize方法的中使用ParameterHandler对象setParameters来完成对Statement的设值
setParameters负责根据我们输入的参数,对statement对象的 ? 占位符处进行赋值,即使用了typeHandler来完成java对象到jdbc对象的映射
TypeHandler,类型转换器,在mybatis中用于实现java类型和JDBC类型的相互转换
(2)通过query方法完成执行statement,并且将statement执行返回的resultset封装为List返回。
StatementHandler 的List query是调用了ResultSetHandler的handleResultSets(Statement) 方法。ResultSetHandler的handleResultSets(Statement) 方法会将Statement语句执行后生成的resultSet 结果集转换成List 结果集
插一条实现过程: