通过前面的学习可知,MyBatis的持久化解决方案将用户从原始的JDBC访问中解放出来,用户只需要定义SQL语句,无须关注底层的JDBC操作。MyBatis通过配置文件管理JDBC连接,实现数据库的持久化访问。
使用 MyBatis 框架解决持久化问题,主要涉及3个核心对象,分别是 SqlSessionFactoryBuilder、SqlSessionFactory和SqlSession,它们在MyBatis框架中起着至关重要的作用。下面将对这3个对象进行详细讲解。
所有的MyBatis应用都是以SqlSessionFactory对象为中心,而 SqlSessionFactoryBuilder 就是 SqlSessionFactory的构造者。SqlSessionFactoryBuilder 通过 build()方法构建SqlSessionFactory对象,SqlSessionFactoryBuilder提供了多个重载的build()方法,如图2-1所示。
图2-1 SqlSessionFactoryBuilder中重载的build()方法
在图2-1中,这些重载的build()方法,按照配置信息的传入方式可以分为三种形式,具体如下。
第一种形式:
build(InputStream inputStream,String environment,Properties properties)
上述build()方法中,参数inputStream是字节流,它封装了XML文件形式的配置信息;参数environment和参数properties为可选参数。其中,参数environment用于指定将要加载的环境,包括数据源和事务管理器;参数properties用于指定将要加载的properties文件。
第二种形式:
build(Reader reader,String environment,Properties properties)
由上述build()方法可知,第二种形式的build()方法参数作用与第一种形式大体一致,唯一不同的是,第一种形式的build()方法使用InputStream字节流封装了XML文件形式的配置信息,而第二种形式的build()方法使用Reader字符流封装了XML文件形式的配置信息。
第三种形式:
build(Configuration config)
上述build()方法中,Configuration对象用于封装MyBatis项目中的配置信息。
通过以上代码可知,配置信息可以通过InputStream(字节流)、Reader(字符流)、Configuration(类)3种形式提供给SqlSessionFactoryBuilder的build()方法。
下面通过读取XML配置文件的方式来构造SqlSessionFactory对象,其关键代码如下:
// 读取配置文件 InputStream inputStream = Resources.getResourceAsStream("配置文件位置"); // 根据配置文件构建SqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSessionFactory 对象是线程安全的,它一旦被创建,在整个应用程序执行期间都会存在。如果多次创建同一个数据库的SqlSessionFactory对象,那么该数据库的资源将很容易被耗尽。为了解决此问题,通常一个数据库只创建一个 SqlSessionFactory 对象,因此在构建 SqlSessionFactory 对象时,建议使用单例模式。
SqlSessionFactory是MyBatis框架中十分重要的对象,用于创建SqlSession对象,所有的MyBatis应用都是以SqlSessionFactory为对象中心。在SqlSessionFactoryBuilder构建SqlSessionFactory对象之后,就可以使用SqlSessionFactory对象调用openSession()方法创建SqlSession对象,SqlSessionFactory有多个重载的openSession()方法,具体如表2-1所示。
表2-1 SqlSessionFactory的openSession()方法
续表
openSession()方法的参数为boolean值时,若传入true表示关闭事务控制,自动提交;若传入false表示开启事务控制。若不传入参数,默认为true。
SqlSession是MyBatis框架中另一个重要的对象,它是应用程序与持久层之间执行交互操作的对象,主要作用是执行持久化操作,类似于JDBC中的Connection。SqlSession对象包含了执行SQL操作的方法,由于其底层封装了JDBC连接,所以可以直接使用SqlSession对象来执行已映射的SQL语句。
SqlSession对象中包含了很多方法,其常用方法如表2-2所示。
表2-2 SqlSession对象中的常用方法
续表
每一个线程都应该有一个自己的SqlSession对象,并且该对象不能共享。SqlSession对象是线程不安全的,因此其使用范围最好在一次请求或一个方法中,绝不能将其放在类的静态字段、对象字段或任何类型的管理范围(如Servlet的HttpSession)中使用。使用完SqlSession对象后要及时关闭,SqlSession对象通常放在finally块中关闭,示例代码如下:
SqlSession sqlSession = sqlSessionFactory.openSession(); try { // 此处执行持久化操作 } finally { sqlSession.close(); }