(2)MyBatis的三大核心对象的作用域及其生命周期

三大对象的作用域及生命周期

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语句
    }
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值