5、理论知识
5.1、生命周期和作用域
生命周期类别是至关重要的,因为错误的使用会导致非常严重的并发问题。
SqlSessionFactoryBuilder
一旦创建了 SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。
SqlSessionFactory
SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。 使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次,多次重建 SqlSessionFactory 被视为一种代码“坏习惯”。因此 SqlSessionFactory 的最佳作用域是应用作用域。 有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。
SqlSession
- 是一个连接到连接池的请求
- 最佳作用域是请求或方法作用域
- 用完只有需要关闭,否则资源被占用
- 绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行
- 一定是 new -> 使用 -> close。
5.2、mybatis执行流程分析
通过Resource对象获取加载全局的配置文件
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
通过 SqlSessionFactoryBuilder 构建 sqlSessionFactory,其中的 build() 方法解析配置文件流。Configuration 对象包含了所有的配置信息。这个配置信息会存在于之后创建的每一个 sqlSession 对象。
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(inputStream);
创建transaction事务管理,创捷executor执行器,创建sqlSession,如果在括号里写个true就是自动提交事务的意思。
SqlSession session = sqlSessionFactory.openSession();
每一个 sqlSession 都持有 transaction,executor 等对象,执行,执行失败就回滚,执行成功就提交事务。
session.commit(); // 提交事务,增删改需要提交事务
5.3、#{}和${}
- #{} 对应 JDBC 的 preparedStatement
- ${} 对应 JDBC 的 statement
- #{} 能防止 sql 注入