学习完MyBatis的核心对象之后,下面学习它的核心配置文件,MyBatis核心配置文件配置了MyBatis的一些全局信息,包括数据库连接信息、MyBatis运行时所需的各个特性,以及设置和影响MyBatis行为的一些属性。下面将对MyBatis核心配置文件进行详细讲解。
MyBatis 的核心配置文件包含了很多影响MyBatis 行为的重要信息。一个项目通常只会有一个核心配置文件,并且核心配置文件编写后也不会轻易改动。MyBatis核心配置文件的主要元素如图2-2所示。
图2-2 MyBatis核心配置文件的主要元素
从图2-2中可以看到,<configuration>元素是整个XML配置文件的根元素,相当于MyBatis各元素的管理员。<configuration>有很多子元素,MyBatis的核心配置就是通过这些子元素完成的。需要注意的是,在核心配置文件中,<configuration>的子元素必须按照图2-2中由上到下的顺序进行配置,否则 MyBatis 在解析XML配置文件的时候会报错。下面对<configuration>元素的几个常用子元素进行详细讲解。
<properties>是一个配置属性的元素,该元素的作用是读取外部文件的配置信息。
假设现在有一个配置文件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" />
引入db.properties文件后,如果希望动态获取db.properties文件中的数据库连接信息,可以使用<property>元素配置,示例代码如下:
<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>
上述代码中,<dataSource>元素中连接数据库的4个属性(driver、url、username和password)值将会由db.properties文件中对应的值来动态替换。这样一来,<properties>元素就可以通过db.properties文件实现动态参数配置。
<settings>元素主要用于改变MyBatis运行时的行为,如开启二级缓存、开启延迟加载等。
<settings>元素中的常见配置参数如表2-3所示。
表2-3 <settings>元素中的常见配置参数
表2-3中介绍了<settings>元素中的常见配置参数,这些配置参数在配置文件中的使用方式如下:
<settings> <!--是否开启缓存 --> <setting name="cacheEnabled" value="true" /> <!--是否开启延迟加载,如果开启,所有关联对象都会延迟加载 --> <setting name="lazyLoadingEnabled" value="true" /> <!--是否开启关联对象属性的延迟加载,如果开启,对任意延迟属性的调用都 会使带有延迟加载属性的对象完整加载,否则每种属性都按需加载 --> <setting name="aggressiveLazyLoading" value="true" /> ... </settings>
表2-3中介绍的配置参数在大多数情况下都不需要开发人员去配置,通常只在需要时配置少数几项即可。这里读者了解这些可设置的参数值及其含义即可。
核心配置文件若要引用一个POJO实体类,需要输入POJO实体类的全限定类名,而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>
在核心配置文件mybatis-config.xml中,使用<typeAliases>元素为com.itheima.pojo.User实体类定义别名,示例代码如下:
<typeAliases> <typeAlias alias="User" type="com.itheima.pojo.User"/> </typeAliases>
上述代码为全限定类名com.itheima.pojo.User定义了一个别名User,定义了别名之后,映射文件中只需使用别名User就可以引用POJO实体类com.itheima.pojo.User,具体引用代码如下:
<select id="findById" parameterType="int"
resultType="User"> select * from users where uid = #{id}
</select>
如果有多个全限定类需要设置别名,有以下两种方式可以完成设置。
(1)在<typeAliases>元素下,使用多个<typeAlias>元素为每一个全限定类逐个配置别名,示例代码如下:
<typeAliases> <typeAlias alias="User" type="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>
上述配置方式虽然可以为多个全限定类设置别名,但代码比较冗长。
(2)通过自动扫描包的形式自定义别名。具体示例代码如下:
<typeAliases> <package name="com.itheima.pojo"/> </typeAliases>
按照上述代码配置后,MyBatis会自动扫描<package>元素的name属性指定的包com.itheima.pojo,并自动将该包下的所有实体类以首字母小写的类名作为别名。例如,它会自动给com.itheima.pojo.User设置别名user。
除了可以使用<typeAliases>元素为实体类自定义别名外,MyBatis 框架还为许多常见的Java 类型(如数值、字符串、日期和集合等)提供了相应的默认别名,MyBatis默认的常见Java类型的别名如表2-4所示。
表2-4 MyBatis默认的常见Java类型的别名
续表
表2-4所列举的别名可以在MyBatis中直接使用,但由于别名不区分大小写,所以在使用时要注意重复定义的覆盖问题。
MyBatis 可以配置多套运行环境,如开发环境、测试环境、生产环境等,可以灵活选择不同的配置,从而将SQL映射到不同运行环境的数据库中。不同的运行环境可以通过<environments>元素来配置,但不管增加几套运行环境,都必须要明确选择出当前要用的唯一的一个运行环境。
MyBatis的运行环境信息包括事务管理器和数据源。在MyBatis的核心配置文件中,MyBatis通过<environments>元素定义一个运行环境。<environments>元素有两个子元素:<transactionManager>元素和<dataSource>元素。<transactionManager>元素用于配置运行环境的事务管理器;<dataSource>元素用于配置运行环境的数据源信息。使用<environments>元素进行环境配置的示例代码如下:
1 <environments default="development"> 2 <environment id="development"> 3 <!—设置使用JDBC事务管理 --> 4 <transactionManager type="JDBC" /> 5 <!-配置数据源 --> 6 <dataSource type="POOLED"> 7 <property name="driver" value="${jdbc.driver}" /> 8 <property name="url" value="${jdbc.url}" /> 9 <property name="username" value="${jdbc.username}" /> 10 <property name="password" value="${jdbc.password}" /> 11 </dataSource> 12 </environment> 13 ... 14 </environments>
在上述示例代码中,<environments>元素是环境配置的根元素,它包含一个default属性,该属性用于指定默认环境的id。<environment>是<environments>元素的子元素,一个<environments>元素下可以有多个<environment>子元素,<environment>元素的id属性用于设置所定义环境的id值。在<environment>元素内,使用<transactionManager>元素配置事务管理,它的type属性用于指定事务管理的方式,即使用哪种事务管理器;<dataSource>元素用于配置数据源,它的type属性用于指定所使用的数据源。
在MyBatis中,<transactionManager>元素可以配置两种类型的事务管理器,分别是JDBC和MANAGED。这两个事务管理器的含义如下。
● JDBC:此配置直接使用JDBC的提交和回滚设置,它依赖于从数据源得到的连接来管理事务的作用域。
● MANAGED:此配置不提交或回滚一个连接,而是让容器来管理事务的整个生命周期。默认情况下,它会关闭连接,但有些容器并不希望这样,为此可以将<transactionManager>元素的closeConnection属性设置为false来阻止它默认的关闭行为。
如果项目中使用的是Spring+MyBatis,则没有必要在MyBatis中配置事务管理器,因为实际开发中项目会使用Spring自带的管理器来实现事务管理。
对于数据源的配置,MyBatis框架提供了UNPOOLED、POOLED和JNDI 3种数据源类型,具体如下。
1. UNPOOLED
UNPOOLED 表示数据源为无连接池类型。配置此数据源类型后,程序在每次被请求时会打开和关闭数据库连接。UNPOOLED适用于对性能要求不高的简单应用程序。
UNPOOLED类型的数据源需要配置5种属性,如表2-5所示。
表2-5 UNPOOLED数据源需要配置的属性
2. POOLED
POOLED表示数据源为连接池类型。POOLED数据源利用“池”的概念将JDBC连接对象组织起来,节省了创建新的连接对象时需要初始化和认证的时间。POOLED数据源使并发Web应用可以快速响应请求,是当前比较流行的数据源配置类型,本书中使用的数据源就是POOLED类型。
配置POOLED数据源类型时,除了可以使用表2-5中的5种属性外,还可以配置更多的属性,如表2-6所示。
表2-6 POOLED数据源可额外配置的属性
续表
3. JNDI
JNDI表示数据源可以在EJB或应用服务器等容器中使用。配置JNDI数据源时,只需要配置两个属性,如表2-7所示。
表2-7 JNDI数据源需要配置的属性
在MyBatis的核心配置文件中,<mappers>元素用于引入MyBatis映射文件。映射文件包含了POJO对象和数据表之间的映射信息,MyBatis通过核心配置文件中的<mappers>元素找到映射文件并解析其中的映射信息。
通过<mappers>元素引入映射文件的方法有4种,具体如下。
1.使用类路径引入
使用类路径引入映射文件的示例代码如下:
<mappers> <mapper resource="com/itheima/mapper/UserMapper.xml"/> </mappers>
2.使用本地文件路径引入
使用本地文件路径引入映射文件的示例代码如下:
<mappers> <mapper url="file:///D:/com/itheima/mapper/UserMapper.xml"/> </mappers>
3.使用接口类引入
使用接口类引入映射文件的示例代码如下:
<mappers> <mapper class="com.itheima.mapper.UserMapper"/> </mappers>
4.使用包名引入
使用包名引入映射文件的示例代码如下:
<mappers> <package name="com.itheima.mapper"/> </mappers>
上述4种引入方式非常简单,读者可以根据实际项目需要选择使用。