主要总结一下mybaitis的基础配置,基本特性,最后简单分析一下sqlsession的原理,了解了运行过程。
简单配置介绍
简单来说,Mybatis的配置主要分为以下几步:
- 编写POJO即JavaBean,最终的目的是将数据库中的查询结果映射到JavaBean上;
- 配置与POJO对应的Mapper接口:里面有各种方法,对应mapper.xml中的查询语句;
- 配置与POJO对应的XML映射:编写缓存,SQL查询等;
- 配置mybatis-config.xml主要的Mybatis配置文件:配置数据源、扫描mapper.xml等。
注意:以上的配置并没有严格的前后顺序;
借用一个比较清晰的配置流程图
可以看出mapper接口实现类的获得是通过mybatis-config.xml->SqlSessionFactoryBuilder->SqlSessionFacotry->SqlSession->mapper
生命周期
- SqlSessionFactoryBuilder:作用就是创建一个构建器,一旦创建了
SqlSessionFactory
,它的任务就算完成了,可以回收。 - SqlSessionFactory:作用是创建
SqlSession
,而SqlSession
相当于JDBC的一个Connection
对象,每次应用程序需要访问数据库,我们就要通过SqlSessionFactory
创建一个SqlSession
,所以SqlSessionFactory
在Mybatis整个生命周期中存在(每个数据库对应一个SqlSessionFactory
,是单例产生的)。 - SqlSession:生命周期是存在于请求数据库处理事务的过程中,是一个线程不安全的对象(在多线程的情况下,需要特别注意),即存活于一个应用的请求和申请,可以执行多条SQL保证事务的一致性。
- Mapper:是一个接口,并没有实现类。它的作用是发送SQL,返回我们需要的结果或者发送SQL修改数据库表,所以它存活于一个
SqlSession
内,是一个方法级别的东西。当SqlSession
销毁的时候,Mapper也会销毁。
基础特性
延迟加载
即系统延迟执行查询,一般用于嵌套查询的时候,嵌套在内的SQL查询会延迟加载,等到真正需要使用该查询的时候才加载。就像懒人你说一下,他动一下,绝不会多执行半步,因此该特性也称之为懒加载。
懒加载必须配置config.xml
,并且只能通过association
或collection
实现,毕竟只有在存在映射关系的业务场景里你需要使用懒加载
配置语句
1 | <settings> |
使用时需要注意延迟加载必须使用resultMap,resultType不具有延迟加载功能。
一级缓存
- 系统默认开启,缓存的范围为一个
SqlSession
- 只有一个SqlSession下的相同查询才会应用缓存,不同sqlSession下的即使查询相同一级缓存也不会生效
二级缓存
解决
SqlSession
相互隔离的情况,缓存范围为一个Mapper
接口二级缓存默认是不开启的,需要进行配置,Mybatis要求返回的POJO必须是可序列化的,即POJO实现Serializable接口。
缓存的配置只需要在
XML
配置<cache/>
即可,或者指定算法,刷新时间间隔,缓存状态,大小等例:
- 映射语句文件中所有select语句将会被缓存;
- 映射语句文件中所有insert、update和delete语句会被刷新缓存;
- 缓存使用默认的LRU最近最少使用算法回收;
- 根据时间表,缓存不会任何时间顺序刷新
- 缓存会存储列表集合或对象的1024个引用
- 缓存被视为可read/write的缓存,意味着是不可以被共享的,而可以被安全地修改。
自定义缓存
通过Mybatis实现的接口,使用redis等进行缓存
实践配置
待补充
SqlSession原理
SqlSession
提供select/insert/update/delete方法
映射器(Mapper
)其实就是一个动态代理对象,进入到MapperMethod
的execute
方法就能简单找到SqlSession
的删除、更新、查询、选择方法.
从底层实现来说:通过动态代理技术,让接口跑起来,之后采用命令模式,最后还是采用了SqlSession
的接口方法(getMapper()
方法等到Mapper
)执行SQL查询(也就是说Mapper接口方法的实现底层还是采用SqlSession
接口方法实现的)。
SqlSession重要的四个对象
- Execute:调度执行
StatementHandler
、ParmmeterHandler
、ResultHandler
执行相应的SQL语句; - StatementHandler:使用数据库中
Statement(PrepareStatement)
执行操作,即底层是封装好了的prepareStatement
- ParammeterHandler:处理SQL参数
- ResultHandler:结果集ResultSet封装处理返回。
SqlSession的四大对象
Execute
起java和数据库交互桥梁的作用,参与整个SQL执行过程。分类
- SIMPLE简易执行器(默认)
- REUSE重用预处理执行器
- BATCH批量更新、批量专用处理器
源码
1 | package org.apache.ibatis.session; |
作用
调度其他对象,完成预编译、配置参数和返回结果集
StatementHanlde
分类(分别对应不同执行器)
- SimpleStatementHandler
- PrepareStatementHandler
- CallableStatementHandler
作用
专门处理数据库会话。进行预编译并调用ParameterHandler配置参数。大致来讲只是对数据库的连接做了封装
工作流程
- 通过调用RoutingStatementHandler对象生成StatemenetHandler
- RoutingStatementHandler查找相应的statementHandler对象
- statementHandler调用数据库的方法
ParameterHandler
作用
对预编译的参数进行设置
工作流程
- 从parameterObject中取到参数,然后使用typeHandler(注册在Configuration中)进行参数处理
ResultSetHandler
作用
组装结果返回结果集
运行过程总结
- prepare预编译
- parameterize设置参数
- doUpdate/doQuery执行SQL
神人的总结
参考链接