MyBatis学习笔记5、理论知识

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 注入
发布了41 篇原创文章 · 获赞 2 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/dzydzy7/article/details/104959972