主要总结一下mybaitis的基础配置,基本特性,最后简单分析一下sqlsession的原理,了解了运行过程。
简单来说,Mybatis的配置主要分为以下几步:
注意:以上的配置并没有严格的前后顺序;
借用一个比较清晰的配置流程图
可以看出mapper接口实现类的获得是通过mybatis-config.xml->SqlSessionFactoryBuilder->SqlSessionFacotry->SqlSession->mapper
SqlSessionFactory
,它的任务就算完成了,可以回收。SqlSession
,而SqlSession
相当于JDBC的一个Connection
对象,每次应用程序需要访问数据库,我们就要通过SqlSessionFactory
创建一个SqlSession
,所以SqlSessionFactory
在Mybatis整个生命周期中存在(每个数据库对应一个SqlSessionFactory
,是单例产生的)。SqlSession
内,是一个方法级别的东西。当SqlSession
销毁的时候,Mapper也会销毁。即系统延迟执行查询,一般用于嵌套查询的时候,嵌套在内的SQL查询会延迟加载,等到真正需要使用该查询的时候才加载。就像懒人你说一下,他动一下,绝不会多执行半步,因此该特性也称之为懒加载。
懒加载必须配置config.xml
,并且只能通过association
或collection
实现,毕竟只有在存在映射关系的业务场景里你需要使用懒加载
配置语句
<settings>
<setting name="lazyLoadingEnabled" value="true"/> <setting name="aggressiveLazyLoading" value="false"/>
</settings>
使用时需要注意延迟加载必须使用resultMap,resultType不具有延迟加载功能。
SqlSession
解决SqlSession
相互隔离的情况,缓存范围为一个Mapper
接口
二级缓存默认是不开启的,需要进行配置,Mybatis要求返回的POJO必须是可序列化的,即POJO实现Serializable接口。
缓存的配置只需要在XML
配置<cache/>
即可,或者指定算法,刷新时间间隔,缓存状态,大小等
例:
通过Mybatis实现的接口,使用redis等进行缓存
待补充
SqlSession
提供select/insert/update/delete方法
映射器(Mapper
)其实就是一个动态代理对象,进入到MapperMethod
的execute
方法就能简单找到SqlSession
的删除、更新、查询、选择方法.
从底层实现来说:通过动态代理技术,让接口跑起来,之后采用命令模式,最后还是采用了SqlSession
的接口方法(getMapper()
方法等到Mapper
)执行SQL查询(也就是说Mapper接口方法的实现底层还是采用SqlSession
接口方法实现的)。
SqlSession重要的四个对象
StatementHandler
、ParmmeterHandler
、ResultHandler
执行相应的SQL语句;Statement(PrepareStatement)
执行操作,即底层是封装好了的prepareStatement
起java和数据库交互桥梁的作用,参与整个SQL执行过程。分类
源码
package org.apache.ibatis.session;
public enum ExecutorType { SIMPLE, REUSE, BATCH}
作用
调度其他对象,完成预编译、配置参数和返回结果集
分类(分别对应不同执行器)
作用
专门处理数据库会话。进行预编译并调用ParameterHandler配置参数。大致来讲只是对数据库的连接做了封装
工作流程
作用
对预编译的参数进行设置
工作流程
作用
组装结果返回结果集
神人的总结
参考链接