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

MyBatis程序的总结

MyBatis程序中有两个主要的配置文件

  • mybatis-config.xml,这是核心配置文件,主要配置连接数据库的信息等(一个)

  • XxxxMapper.xml,这个文件是专门用来编写SQL语句的配置文件(一个表对应一个)

    • t_user表,一般会对应一个UserMapper.xml
    • t_student表,一般会对应一个StudentMapper.xml

加载mybatis-config.xml核心配置文件有多种方式

Resources.getResourceAsStream(“mybatis-config.xml”)),表示从类路径当中加载资源文件

  • 在mybatis中提供了⼀个类:Resources【org.apache.ibatis.io.Resources】该类只能从类路径当中获取资源 , 我们通常使⽤它来获取输⼊流InputStream

    • 底层的源代码其实就是:ClassLoader.getSystemClassLoader().getResourceAsStream(“mybatis-config.xml”)
    • 利用ClassLoader 的 getSystemClassLoader方法获取系统类加载器 , 然后调用系统类加载器的 getResourceAsStream 方法从类路径中加载资源
  • 优点:采用这种方式,从类路径当中加载资源,项目的移植性很强。项目从windows移植到linux,代码不需要修改,因为因为这个资源文件一直都在类路径当中

  • 小技巧:以后凡是遇到resource这个单词,大部分情况下,这种加载资源的方式就是从类的根路径下开始查找资源并加载

new FileInputStream(“d:\mybatis-config.xml”) , 表示从绝对路径中加载资源文件

采用这种方式加载核心配置文件也可以 , 缺点:可移植性太差,程序不够健壮。可能会移植到其他的操作系统当中。导致以上路径无效,还需要修改java代码中的路径。这样违背了OCP原则

ClassLoader.getSystemClassLoader().getResourceAsStream(“mybatis-config.xml”) , 从类路径当中加载资源文件

  • ClassLoader.getSystemClassLoader() 先获取系统的类加载器 , 系统类加载器有一个方法叫做:getResourceAsStream表示从类路径中加载资源文件

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

SqlSessionFactoryBuilder对象

使用mybatis提供的类库,直接new一个 SqlSessionFactoryBuilder对象

// 最佳作⽤域是⽅法作⽤域(也就是局部⽅法变量)
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();

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

  • 这个类可以被实例化、使⽤和丢弃,⼀旦创建了 SqlSessionFactory,就不再需要它了
  • 因此 SqlSessionFactoryBuilder 实例的最佳作⽤域是⽅法作⽤域(也就是局部⽅法变量)
  • 你可以重⽤SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例,但最好还是不要⼀直保留着它,以保证所有的 XML 解析资源可以被释放给更重要的事情

SqlSessionFactory对象

通过SqlSessionFactoryBuilder对象的build方法获取

  • 从 XML 中构建 SqlSessionFactory对象 , SqlSessionFactory对象的创建需要XML配置文件 (指定要连接的数据库的信息参数)
  • SqlSessionFactory = environment = 数据库, 一个SqlSessionFactory对应一个environment,一个environment通常是一个数据库 , 即一个数据库会对应一个SqlSessionFactory对象 , 它们三者是等价的
    • 使用不同的SqlSessionFactory创建的SqlSession对象 , 类似就是要创建连接不同数据库的Connection对象
// 这种方式不指定环境的id ,就是获取的默认环境(默认的数据库)
//SqlSessionFactory 的最佳作⽤域是应⽤作⽤域
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"));

// build方法的第二个参数 , 这种方式就是通过环境id来使用指定的环境(指定的数据库)
SqlSessionFactory sqlSessionFactory1 = sqlSessionFactoryBuilder.build(Resources.getResourceAsStream("mybatis-config.xml"), "powernodeDB"));

SqlSessionFactory对象作用域和生命周期

  • SqlSessionFactory ⼀旦被创建就应该在应⽤的运⾏期间⼀直存在,没有任何理由丢弃它或重新创建另⼀个实例
  • 使⽤ SqlSessionFactory 的最佳实践是在应⽤运⾏期间不要重复创建多次,多次重建 SqlSessionFactory 被视为⼀种代码“坏习惯”。因此 SqlSessionFactory 的最佳作⽤域是应⽤作⽤域。
  • 有很多⽅法可以做到,最简单的就是使⽤单例模式或者静态单例模式

SqlSession对象

通过SqlSessionFactory工厂来生产SqlSession对象 , 类似就是要创建连接数据库的Connection对象

  • SqlSession对象是专门用来执行SQL语句的,是一个Java程序和数据库之间的一次会话。一个数据库可以存在多个会话。
  • SqlSession对象封装了JDBC中的 connection对象用来连接数据库perparedStatement对象用来绑定执行SQL语句
//它的最佳的作⽤域是请求或⽅法作⽤域
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会自动关闭 , 不用我们手动关闭 
//它的最佳的作⽤域是请求或⽅法作⽤域
try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
    // 通过配置文件中SQL语句的id,执行对应的SQL语句,处理相关业务
    int count = sqlSession.insert("insertCar");
    System.out.println(count);

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

SqlSession作用域和生命周期

  • 每个线程都应该有它⾃⼰的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作⽤域是请求或⽅法作⽤域。
  • 绝对不能将 SqlSession 实例的引⽤放在⼀个类的静态域,甚⾄⼀个类 的实例变量也不⾏。 也绝不能将 SqlSession 实例的引⽤放在任何类型的托管作⽤域中,⽐如 Servlet 框架中的 HttpSession。
  • 如果你现在正在使⽤⼀种 Web 框架,考虑将 SqlSession 放在⼀个和 HTTP 请求相似的作⽤域 中。 换句话说,每次收到 HTTP 请求,就可以打开⼀个 SqlSession,返回⼀个响应后,就关闭它。 这个关闭操 作很重要,为了确保每次都能执⾏关闭操作,你应该把这个关闭操作放到 finally 块中

你可能感兴趣的:(mybatis,java,开发语言)