Mybatis的核心对象
SqlSessionFactoryBuilde
SqlSessionFactoryBuilder的多个重载build()方法
由于build()方法中的参数environment和properties都可以为null,所以SqlSessionFactoryBuilder构建SqlSessionFactory对象的build()方法按照配置信息的传入方式,可以分为三种形式。
形式一:SqlSessionFactoryBuilder构建build()方法
build(InputStream inputStream,String environment,Properties properties)
上述build()方法中,参数inputStream是字节流,它封装了XML文件形式的配置信息;参数environment和参数properties为可选参数。其中,参数environment决定将要加载的环境,包括数据源和事务管理器;参数properties决定将要加载的properties文件。
形式二:SqlSessionFactoryBuilder构建build()方法
build(Reader reader,String environment,Properties properties)
由上述build()方法可知,第二种形式的build()方法参数作用与第一种形式大体一致,唯一不同的是,第一种形式的build()方法使用InputStream字节流封装了XML文件形式的配置信息,而第二种形式的build()方法使用Reader字符流封装了xml文件形式的配置信息
build(Configuration config)
通过以上代码可知,配置信息可以通过InputStream(字节流)、Reader(字符流)、Configuration(类)三种形式提供给SqlSessionFactoryBuilder的build()方法。
以读取XML文件的方式构造SqlSessionFactory对象
通过过读取XML配置文件的方式构造SqlSessionFactory对象的关键代码如下所示。
// 读取配置文件
InputStream inputStream = Resources.getResourceAsStream("配置文件位置");
// 根据配置文件构建SqlSessionFactory
SqlSessionFactory sqlSessionFactory =
new SqlSessionFactoryBuilder().build(inputStream);
使用什么模式创建SqlSessionFactory对象
SqlSessionFactory对象是线程安全的,它一旦被创建,在整个应用程序执行期间都会存在。如果我们多次创建同一个数据库的SqlSessionFactory对象,那么该数据库的资源将很容易被耗尽。通常每一个数据库都只创建一个SqlSessionFactory对象,所以在构建SqlSessionFactory对象时,建议使用单例模式。
SqlSessionFactory
SqlSessionFactory的openSession()方法
方法名称 | 描述 |
SqlSession openSession() | 开启一个事务。 |
SqlSession openSession(Boolean autoCommit) | 参数autoCommit可设置是否开启事务。 |
SqlSession openSession(Connection connection) | 参数connection可提供自定义连接。 |
SqlSession openSession(TransactionIsolationLevel level) | 参数level可设置隔离级别。 |
SqlSession openSession(ExecutorType execType) | 参数execType有三个可选值。 |
SqlSession openSession(ExecutorType execType,Boolean autoCommit) | 参数execType有三个可选值。 |
SqlSession openSession(ExecutorType execType,Connection connection) | 参数ExecutorType有三个可选值。 |
openSession(ExecutorType execType)参数值
参数execType有三个可选值:
•ExecutorType.SIMPLE:表示为每条语句创建一条新的预处理语句。
•ExecutorType.REUSE:表示会复用预处理语句。
•ExecutorType.BATCH:表示会批量执行所有更新语句。
openSession(ExecutorType execType,Boolean autoCommit)参数值
参数execType有三个可选值:
•ExecutorType.SIMPLE:表示为每条语句创建一条新的预处理语句。
•ExecutorType.REUSE:表示会复用预处理语句。
•ExecutorType.BATCH:表示会批量执行所有更新语句。
参数autoCommit可设置是否开启事务。
openSession(ExecutorType execType,Connection connection)参数
参数ExecutorType有三个可选值:
•ExecutorType.SIMPLE:表示为每条语句创建一条新的预处理语句。
•ExecutorType.REUSE表示会复用预处理语句。
•ExecutorType.BATCH表示会批量执行所有更新语句。
参数connection可提供自定义连接。
SqlSession
SqlSession对象的作用
SqlSession是MyBatis框架中另一个重要的对象,它是应用程序与持久层之间执行交互操作的一个单线程对象,主要作用是执行持久化操作,类似于JDBC中的Connection。SqlSession对象包含了执行SQL操作的方法,由于其底层封装了JDBC连接,所以可以直接使用SqlSession对象来执行已映射的SQL语句。
SqlSession对象的使用范围
每一个线程都应该有一个自己的SqlSession对象,并且该对象不能共享。SqlSession对象是线程不安全的,因此其使用范围最好在一次请求或一个方法中,绝不能将其放在类的静态字段、对象字段或任何类型的管理范围(如Servlet的HttpSession)中使用。SqlSession对象使用完之后,要及时的关闭,SqlSession对象通常放在finally块中关闭,代码如下所示。
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
// 此处执行持久化操作
} finally { sqlSession.close(); }
Mybatis核心配置文件
MyBatis核心配置文件中的主要元素
<configuration>的子元素的执行顺序
<configuration>元素是整个XML配置文件的根元素,相当于MyBatis各元素的管理员。<configuration>有很多子元素,MyBatis的核心配置就是通过这些子元素完成的。需要注意的是,在核心配置文件中,<configuration>的子元素必须按照上图由上到下的顺序进行配置,否则MyBatis在解析XML配置文件的时候会报错。
<properties>元素
<properties>是一个配置属性的元素,该元素的作用是读取外部文件的配置信息。<properties>元素具体使用方式如下。在项目的src/main/resources目录下,创建一个名称为db.properties的配置文件,该文件主要用于配置数据库的连接信息。
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=root
在MyBatis核心配置文件mybatis-config.xml中使用<properties... />元素引入db.properties文件,以获取数据库连接信息。
<properties resource="db.properties" />
在MyBatis核心配置文件mybatis-config.xml中使用<property... />元素配置数据库驱动、连接数据库的URL、连接数据库的用户名和连接数据库的密码等数据库连接参数。
<dataSource type="POOLED">
<!-- 数据库驱动 -->
<property name="driver" value="${jdbc.driver}" />
<!-- 连接数据库的url -->
<property name="url" value="${jdbc.url}" />
<!-- 连接数据库的用户名 -->
<property name="username" value="${jdbc.username}" />
<!-- 连接数据库的密码 -->
<property name="password" value="${jdbc.password}" />
</dataSource>
db.properties文件实现动态参数配置
完成上述配置后,<dataSource>元素中连接数据库的4个属性(driver、url、username和password)值将会由db.properties文件中对应的值来动态替换。这样一来,<properties>元素就可以通过db.properties文件实现动态参数配置。由于使用properties配置文件来配置属性值可以在多个配置文件中使用这些属性值,并且方便后期的维护和修改,所以在实际开发中,使用properties配置文件来配置属性值是最常用的方式。
<settings>元素
<settings>元素中常见配置参数的使用方式
<settings>
<!-- 是否开启缓存 -->
<setting name="cacheEnabled" value="true" />
<!-- 是否开启延迟加载,如果开启,所有关联对象都会延迟加载 -->
<setting name="lazyLoadingEnabled" value="true" />
<!-- 是否开启关联对象属性的延迟加载,如果开启,对任意延迟属性的调用都
会使用带有延迟加载属性的对象向完整加载,否则每种属性都按需加载 -->
<setting name="aggressiveLazyLoading" value="true" />
...
</settings>
<typeAliases>元素
<typeAliases>元素设置别名
核心配置文件若要引用一个POJO实体类,需要输入POJO实体类的全限定类名,而全限定类名比较冗长,如果直接输入,很容易拼写错误。这时可以使用<typeAliases>元素为POJO实体类设置一个简短的别名,再通过MyBatis的核心配置文件与映射文件相关联。例如,POJO实体类User的全限定类名是com.itheima.pojo.User,未设置别名之前,映射文件的select语句块若要引用POJO类User,必须使用其全限定类名,引用代码如下。
<select id="findById" parameterType="int" resultType="com.itheima.pojo.User"> select * from users where uid = #{id}
</select>
多个全限定类设置别名的方式
方式一:在<typeAliases>元素下,使用多个<typeAlias>元素为每一个全限定类逐个配置别名。
<typeAliases>
<typeAlias alias=“Usertype="com.itheima.pojo.User"/>
<typeAlias alias="Student" type="com.itheima.pojo.Student"/>
<typeAlias alias="Employee" type="com.itheima.pojo.Employee"/>
<typeAlias alias="Animal" type="com.itheima.pojo.Animal"/>
</typeAliases>
方式二:通过自动扫描包的形式自定义别名。
<typeAliases>
<package name="com.itheima.pojo"/>
</typeAliases>
常见Java类型的默认别名问题
除了可以使用<typeAliases>元素为实体类自定义别名外,MyBatis框架还为许多常见的Java类型(如数值、字符串、日期和集合等)提供了相应的默认别名。例如别名_byte映射类型byte、_long映射类型long等,别名可以在MyBatis中直接使用,但由于别名不区分大小写,所以在使用时要注意重复定义的覆盖问题。
<environments>元素
<environments>元素配置运行环境
MyBatis可以配置多套运行环境,如开发环境、测试环境、生产环境等,我们可以灵活选择不同的配置,从而将SQL映射到不同运行环境的数据库中。不同的运行环境可以通过<environments>元素来配置,但不管增加几套运行环境,都必须要明确选择出当前要用的唯一的一个运行环境。
MyBatis的运行环境信息包括事务管理器和数据源。在MyBatis的核心配置文件中,MyBatis通过<environments>元素定义一个运行环境。<environments>元素有两个子元素,<transactionManager>元素和<daraSource>元素。<transactionManager>元素用于配置运行环境的事务管理器;<daraSource>元素用于配置运行环境的数据源信息。
使用<environments>元素进行配置的示例代码
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" /><!—设置使用JDBC事务管理 -->
<dataSource type="POOLED"> <!-配置数据源 -->
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment> ...
</environments>
<transcationManager>元素配置事务管理器
在MyBatis中,<transcationManager>元素可以配置两种类型的事务管理器,分别是JDBC和MANAGED。
• JDBC:此配置直接使用JDBC的提交和回滚设置,它依赖于从数据源得到的连接来管理事务的作用域。
• MANAGED:此配置不提交或回滚一个连接,而是让容器来管理事务的整个生命周期。默认情况下,它会关闭连接,但可以将<transcationManager>元素的closeConnection属性设置为false来阻止它默认的关闭行为。
MyBatis数据源类型
项目中使用Spring+MyBatis,则没必要在MyBatis中配置事务管理器,实际开发中,项目会使用Spring自带的管理器来实现事务管理。对于数据源的配置,MyBatis提供了UNPOOLED、POOLED和JNDI三种数据源类型。