Mybatis 基础执行流程:
1. 加载Mybatis 环境信息,如 数据库信息、Mapper 映射文件、数据库驱动等信息
2. 创建 SqlSessionFactory Sql 会话工厂对象,该对象全局只有一个
3. 使用Sql 会话工厂对象创建 Sql 会话 (SqlSession) ,每次数据操作都会创建一个新的会话
4. Executor 根据 SqlSession 传递的参数动态生成要执行 sql 以及维护缓存数据
5. MappedStatement 将 Java 类型的参数类型解析成数据库对应的数据类型,并将数据库返回数据解析成Java语言对应的数据类型
Mybatis 一二级缓存:
mybatis 一级缓存是 Sqlsession 会话缓存,默认开启,如果一个会话中相同的 sql 执行多次且没有做过数据增删改,只有第一次会去数据库中查询数据,后续几次直接获取本地缓存数据,做过数据增删改本地缓存会被清空
mybatis 二级缓存是 namespace 命名空间缓存,需要手动开启在配置文件中添加 Cache Enable 信息并且在 Mapper 文件中添加缓存标签<Cache /> 才会开启,二级缓存也是本地缓存,如果在同一个 namespace 命名空间先执行相同的 sql 语句,第一次会去数据库中查询数据,后续几次直接获取本地缓存数据,但是在同一个 namespace 命名空间下做过一次 增删改操作,会清空当前命名空间下的所有缓存信息
注意:使用二级缓存需要实体类实现序列化接口,因为 mybatis 使用序列化的的方式缓存数据,在获取缓存数据是只需要反序列化出一个新对象 ,mybatis 会先查二级缓存在查一级缓存
Mybatis 一个 SQL 语句的执行流程:
使用 Mybatis 获取一个sql 语句的结果:
1. 先使用SqlSessionFactory 创建一个 SqlSession 会话,SqlSession 会话中创建 事务对象 和 执行器对象(Executor),执行器默认使用简单执行器(SimpleExecutor)对象,如果开启二级缓存,将简单执行器对象包装为缓存执行器(CachingExecutor),
2. 在 SqlSession 调用具体的 sql 语句对应的方法时, 根据方法名称和接口类型去 Configuration 环境信息,获取 MappedStatement 信息包含 sql 语句、参数类型、返回类型等信息,把获取到的MappedStatement 信息传入Executor 执行器中
3. 执行器会根据 MappedStatement 信息 与 sql 参数信息创建缓存key,如果当前执行器是缓存执行器(CachingExecutor),会先使用 key 去二级缓存中获取数据,二级缓存没有数据再去一级缓存中获取数据,一级缓存没有数据才执行 sql 语句在数据库中获取数据
4. 获取数据前MappedStatement 中的 sql 信息,由 PreparedStatement 对象做 sql 语句预处理然后执行拿到数据库数据
5. 返回结果由 ResultSetHandler 结果集处理对象转化为 java 对象