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

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

SqlSessionFactoryBuilder对象

使用mybatis提供的类库,直接new一个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对象, 创建时需要XML配置文件 (指定要连接的数据库的信息参数)

  • 一个environment对应一个数据库 , 一个数据库对应一个SqlSessionFactory对象 , 不要频繁的创建SqlSessionFactory对象

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"));

            // build方法的第二个参数 , 这种方式就是通过环境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框架中的HttpSession
  • 如果你在Web框架考虑将SqlSession放在⼀个和HTTP请求相似的作⽤域中, 实现每次收到HTTP请求就可以打开⼀个SqlSession,然后返回⼀个响应后就关闭它, 为了确保每次都能执⾏关闭操作,你应该把这个关闭操作放到finally块中

SqlSession对象的作用域和生命周期

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语句,处理相关业务
        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()) {
        // 通过配置文件中SQL语句的id,执行对应的SQL语句,处理相关业务
        int count = sqlSession.insert("insertCar");
        System.out.println(count);

        // 执行到这里,没有发生任何异常,提交事务并终止事务
        sqlSession.commit();
    }
}

你可能感兴趣的:(MyBatis,mybatis)