开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第2天,点击查看活动详情
mybatis流程那个图:
一、SqlSession(持久化管理器),他是Mybatis的核心
MyBatis 的主要 Java 接口就是 SqlSession。可以通过这个接口来执行命令,获取映射器和管理事务。那要如何获取一个 SqlSession 实例呢。SqlSessions 是由 SqlSessionFactory 实例创建的。SqlSessionFactory 对象包含创建 SqlSession 实例的所有方法。而 SqlSessionFactory 本身是由 SqlSessionFactoryBuilder 创建的,它可以从 XML、注解或手动配置 Java 代码来创建 SqlSessionFactory。
@Bean
public Connection connection(){
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
InputStream resourceAsStream = SqlSessionFactoryBuilder.class.getClassLoader().getResourceAsStream("mybatis-config.xml");
SqlSessionFactory build = builder.build(resourceAsStream);
//创建了持久化管理器 ,所谓工厂模式,是将配置信息放入工厂,最终将创建一个持久化管理器
SqlSession sqlSession = build.openSession();
Connection connection = sqlSession.getConnection();
return connection;
}
二、SqlSessionFactory
SqlSessionFactory 有六个方法创建SqlSession实例。通常来说,选择这些方法时你需要考虑以下几点:
- 事务处理:需要在 session 使用事务或者使用自动提交功能(auto-commit)吗?
- 连接:需要依赖 MyBatis 获得来自数据源的配置吗?还是使用自己提供的配置?
- 执行语句:需要 MyBatis 复用预处理语句和/或批量更新语句(包括插入和删除)吗?
基于以上需求,有下列已重载的多个 openSession() 方法供使用。
SqlSession ope hn BB 土工布 nSession()
SqlSession openSession(boolean autoCommit)
SqlSession openSession(Connection connection)
SqlSession openSession(TransactionIsolationLevel level)
SqlSession openSession(ExecutorType execType,TransactionIsolationLevel level)
SqlSession openSession(ExecutorType execType)
SqlSession openSession(ExecutorType execType, boolean autoCommit)
SqlSession openSession(ExecutorType execType, Connection connection)
Configuration getConfiguration();
默认的 openSession()方法没有参数:会开启一个事务(也就是不自动提交);将从由当前环境配置的 DataSource 实例中获取 Connection 对象;事务隔离级别将会使用驱动或数据源的默认设置;预处理语句不会被复用,也不会批量处理更新。
三、SqlSessionFactoryBuilder
SqlSessionFactoryBuilder 的作用在于创建 SqlSessionFactory,创建成功后,SqlSessionFactoryBuilder 就失去了作用,所以它只能存在于创建 SqlSessionFactory 的方法中,而不要让其长期存在。因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域)。
四、事务控制方法
控制事务作用域有四个方法。如果设置了自动提交或你正在使用外部事务管理器,就没有任何效果了。如果在使用 JDBC 事务管理器,由Connection 实例来控制,那么这四个方法就会派上用场:
void commit()
void commit(boolean force)
void rollback()
void rollback(boolean force)
五、本地缓存
Mybatis 使用到了两种缓存:本地缓存(local cache)和二级缓存(second level cache)。一级缓存是sqlSession级别,二级缓存是namespace级别。一级缓存是默认开启的,二级缓存默认关闭。
每当一个新 session 被创建,MyBatis 就会创建一个与之相关联的本地缓存。任何在 session 执行过的查询语句本身都会被保存在本地缓存中,那么,相同的查询语句和相同的参数所产生的更改就不会二度影响数据库了。本地缓存会被增删改、提交事务、关闭事务以及关闭 session 所清空。
默认情况下,本地缓存数据可在整个 session 的周期内使用,这一缓存需要被用来解决循环引用错误和加快重复嵌套查询的速度,所以它可以不被禁用掉,但是你可以设置 localCacheScope=STATEMENT 表示缓存仅在语句执行时有效。注意,如果 localCacheScope 被设置为 SESSION,那么 MyBatis 所返回的引用将传递给保存在本地缓存里的相同对象。对返回的对象(例如 list)做出任何更新将会影响本地缓存的内容,进而影响存活在 session 生命周期中的缓存所返回的值。因此,不要对 MyBatis 所返回的对象作出更改,以防后患。
你可以随时调用以下方法来清空本地缓存:
void clearCache()