三大对象的作用域及生命周期
SqlSessionFactoryBuilder对象
使用MyBatis提供的类库可以直接创建一个SqlSessionFactoryBuilder
对象
SqlSessionFactoryBuilder对象的作用域和生命周期
- SqlSessionFactoryBuilder实例的
最佳作⽤域是⽅法作⽤域(局部方法变量)
,⼀旦使用它创建了SqlSessionFactory实例就不再需要它了 - SqlSessionFactoryBuilder实例可以留着用来创建多个SqlSessionFactory实例,但最好别⼀直保留着它,以保证更多的
XML解析资源
被释放去做其他事情
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public static void main(String[] args) {
try {
// 声明局部⽅法变量
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
}
}
SqlSessionFactory对象
通过SqlSessionFactoryBuilder对象的build方法
创建SqlSessionFactory对象时需要加载MyBatis核心配置文件
即指定要连接的数据库的信息参数
- 不需要频繁的创建SqlSessionFactory对象,保证
一个environment对应一个数据库,一个数据库对应一个SqlSessionFactory对象
即可
SqlSessionFactory对象的作用域和生命周期
- SqlSessionFactory实例的
最佳作⽤域是应⽤作⽤域
,服务器启动时创建一个然后一直应用在服务器运⾏期间,千万不要多次重新创建SqlSessionFactory实例
public class MyBatisCompleteTest {
// 最佳作⽤域是应⽤作⽤域
SqlSessionFactory sqlSessionFactory;
SqlSessionFactory sqlSessionFactory1;
public static void main(String[] args) {
try {
// 不指定环境的id加载的就是默认环境(默认的数据库)
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));
// 通过指定环境id加载指定的环境(使用指定的数据库)
SqlSessionFactory sqlSessionFactory1 = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "powernodeDB"));
}
}
}
SqlSession对象
通过SqlSessionFactory工厂来生产SqlSession对象执行SQL语句
,SqlSession对象是一个Java程序和数据库之间的一次会话,一个数据库可以对应多个会话
- SqlSession对象封装了
JDBC中的Connection对象
用来连接数据库和perparedStatement对象
用来执行SQL语句
SqlSession作用域和生命周期
- SqlSession实例
最佳作⽤域是请求域或⽅法作⽤域
,SqlSession实例是不能被共享的,每个线程都应该有它⾃⼰的SqlSession实例
- 绝对不能将SqlSession实例的引⽤放在⼀个类的静态域,⼀个类的实例变量,Servlet框架中的会话域和应用域中
SqlSession实例可以放在Httprequest对象的请求域中
,实现每次收到HTTP请求就可以打开⼀个SqlSession会话
- 为了确保服务器每次响应完结果后一定能执⾏关闭SqlSession会话的操作,
我们要把这个关闭操作放到finally块中
public static void main(String[] args) {
// 最佳的作⽤域是请求域或⽅法作⽤域
SqlSession sqlSession = null;
try {
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));
// 开启会话底层会开启事务
sqlSession = sqlSessionFactory.openSession();
// 通过SQL语句的Id执行SQL映射文件中对应的SQL语句处理相关业务
int count = sqlSession.insert("insertCar");
System.out.println(count);
// 如果没有发生任何异常提交事务
sqlSession.commit();
// 手动关闭sqlSession
sqlSession.close();
}
}
SqlSession实例创建的标准模式try(){}语法糖
,括号里获取的sqlSession对象会自动关闭
,不需要我们手动关闭
public static void main(String[] args) {
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
// 使用SqlSession执行SQL映射文件的SQL语句
}
}