SSM轻量级框架应用实战
上QQ阅读APP看书,第一时间看更新

任务4 掌握MyBatis的核心配置文件

学习完MyBatis的核心对象之后,接下来学习它的核心配置文件(mybatis-config. xml),该文件配置了MyBatis的一些全局信息,包含数据库连接信息和MyBatis运行时所需的各种特性,以及设置和影响MyBatis行为的一些属性。下面先来了解它的文件结构。

1.4.1 配置文件的结构

mybatis-config.xml文件需配置一些基本元素,值得注意的是,该配置文件的元素节点是有先后顺序的,其文件结构如图1.23所示。

图1.23 MyBatis核心配置文件(mybatis-config.xml)结构图

从图1.23中可看出configuration元素是整个XML配置文件的根节点,相当于是MyBatis的总管,MyBatis所有的配置信息都会存放在这里面。MyBatis提供了设置这些配置信息的方法。Configuration可从配置文件里获取属性值,也可以通过程序直接设置。Configuration可供配置的内容如下。

1.properties元素

properties元素描述的都是外部化、可替代的属性。这些属性如何获取?可以通过以下两种方式实现。

(1)可通过外部指定的方式,即配置在典型的Java属性配置文件中(如database. properties),并使用这些属性对配置项实现动态配置。关键代码如下。

database.properties:
  driver=com.mysql.jdbc.Driver
  url=jdbc:mysql://127.0.0.1:3306/smbms
  user=root
  password=root
mybatis-config.xml部分内容:
  <! -- 引入database.properties文件-->
  <properties resource="database.properties"/>
  ……
  <dataSource type="POOLED">
          <property name="driver" value="${driver}"/>
          <property name="url" value="${url}"/>
          <property name="username" value="${user}"/>
          <property name="password" value="${password}"/>
  </dataSource>

在上述代码中,driver、url、username、password属性将会用database.properties文件中的值来替换。

(2)直接配置为xml,并使用这些属性对配置项实现动态配置。关键代码如下。

mybatis-config.xml部分内容:

<! -- properties元素中直接配置property属性-->
<properties>
    <property name="driver" value="com.mysql.jdbc.Driver"/>
    <property name="url" value="jdbc:mysql://127.0.0.1:3306/smbms"/>
    <property name="user" value="root"/>
    <property name="password" value="root"/>
</properties>
……
<dataSource type="POOLED">
    <property name="driver" value="${driver}"/>
    <property name="url" value="${url}"/>
    <property name="username" value="${user}"/>
    <property name="password" value="${password}"/>
</dataSource>

在上述代码中,driver、url、username、password将会由properties元素中设置的值来替换。

思考

若同时用了两种方式,那么哪种方式优先呢?如以下代码所示。

<properties resource="database.properties">
      <property name="user" value="root"/>
      <property name="password" value="123456"/>
</properties>

分析:这个例子中的property子节点设置的user和password的值会先被读取,由于database.properties中也设置了这两个属性,所以resource中的同名属性将会覆盖property子节点的值。

结论:resource属性值的优先级高于property子节点配置的值。

2.settings元素

settings元素的作用是设置一些非常重要的选项,用于设置和改变MyBatis运行中的行为。常用配置如表1-7所示。

表1-7 settings元素支持的属性

提示

其他配置可参考MyBatis开发手册。

3.typeAliases元素

typeAliases元素的作用是配置类型别名,通过与MyBatis的SQL映射文件相关联,减少输入多余的完整类名,以简化操作。具体配置如示例10所示。

示例10

<typeAliases>
  <! --这里给实体类取别名,方便在mapper配置文件中使用-->
  <typeAlias alias="user" type="cn.smbms.pojo.User"/>
  <typeAlias alias="provider" type="cn.smbms.pojo.Provider"/>
  ……
</typeAliases>

以上这种写法的弊端在于,如果一个项目中有多个POJO,需要一一进行配置。有更加简化的写法,就是通过package的name属性直接指定包名,MyBatis会自动扫描指定包下的JavaBean,并设置一个别名,默认名称为JavaBean的非限定类名。具体配置如示例11所示。

示例11

<typeAliases>
  <package name="cn.smbms.pojo"/>
</typeAliases>
那么UserMapper.xml中的配置如下。
<mapper namespace="cn.smbms.dao.user.UserMapper">
  <! -- 查询用户表记录数 -->
  <select id="count" resultType="int">
      select count(1) as count from smbms_user
  </select>
  <! -- 查询用户列表 -->
  <select id="getUserList" resultType="User">
      select * from smbms_user
  /select>
</mapper>

另外,MyBatis已经为许多常见的Java基础数据类型内建了相应的类型别名,一般都与其映射类型一致,并且都是大小写不敏感的,比如映射的类型int、Boolean、String、Integer等,它们的别名就是int、Boolean、String、Integer。关于这部分内容,会在后续章节中详细介绍。

4.environments元素

MyBatis可以配置多套运行环境,如开发环境、测试环境、生产环境等,我们可以灵活选择不同的配置,从而将SQL映射到不同的数据库环境上。不同的运行环境可以通过environments元素来配置,但是不管增加几套运行环境,都必须要明确选择出当前唯一的一个运行环境。这是因为每个数据库都对应一个SqlSessionFactory实例,需要指明哪个运行环境将被创建,并把运行环境中设置的参数传递给SqlSessionFactoryBuilder。具体配置代码如下。

<environments default="development">
  <! -- 开发环境 -->
  <environment id="development">
      <transactionManager type="JDBC"/>
      <dataSource type="POOLED">
        <property name="driver" value="${driver}"/>
        <property name="url" value="${url}"/>
        <property name="username" value="${user}"/>
        <property name="password" value="${password}"/>
      </dataSource>
  </environment>
  <! -- 测试环境 -->
  <environment id="test">
  ……
  </environment>
</environments>

上述代码中,需要注意以下几个关键点。

(1)默认的运行环境ID:通过default属性来指定当前的运行环境ID为development,对于环境ID的命名要确保唯一。

(2)transactionManager事务管理器:设置其类型为JDBC(MyBatis有两种事务管理类型,即JDBC和MANAGED),直接使用JDBC的提交和回滚功能,依赖于从数据源获得连接来管理事务的生命周期。

(3)dataSource元素:使用标准的JDBC数据源接口来配置JDBC连接对象的资源。MyBatis提供了三种数据源类型(UNPOOLED、POOLED、JNDI),这里使用POOLED数据源类型。该类型利用“池”的概念将JDBC连接对象组织起来,减少了创建新的连接实例时所必需的初始化和认证时间,是MyBatis实现的简单的数据库连接池类型,它使数据库连接可被复用,不必在每次请求时都去创建一个物理连接。对于高并发的Web应用,这是一种流行的处理方式,有利于快速响应请求。

5.mappers元素

mappers映射器用来定义SQL的映射语句,我们只需要告诉MyBatis去哪里找到这些SQL语句,即去哪里找相应的SQL映射文件,可以使用类资源路径或者URL等,关键代码如下。

(1)使用类资源路径获取资源

<mappers>
    <mapper resource="cn/smbms/dao/user/UserMapper.xml"/>
    <mapper resource="cn/smbms/dao/provider/ProviderMapper.xml"/>
</mappers>

(2)使用URL获取资源

<mappers>
    <mapper url="file:///E:/sqlmappers/UserMapper.xml"/>
    <mapper url="file:///E:/sqlmappers/ProviderMapper.xml"/>
</mappers>

以上这些配置告诉MyBatis如何找到SQL映射文件,而其更详尽的配置信息存放在每个SQL映射文件里,我们将在后续章节中学习。

1.4.2 如何引入DTD文件

MyBatis有两种配置文件:核心配置文件(mybatis-config.xml)和SQL映射文件(mapper. xml)(关于SQL映射文件,我们将在后续章节中深入学习)。这两种配置文件都需要手动引入各自的DTD文件(mybatis-3-config.dtd和mybatis-3-mapper.dtd),并在IDE中进行相应配置,否则在编写配置文件的时候,节点元素以及属性等不能联动。下面介绍具体引入方法。

1.DTD文件的位置

这两个DTD文件放置在mybatis-3.2.2.jar里,解压并打开压缩包,DTD文件路径为mybatis-3.2.2\org\apache\ibatis\builder\xml,如图1.24所示。

图1.24 DTD文件位置

将两个文件复制出来,放置在一个统一的位置(如D:\),以方便下一步手动引入。

2.新增XML Catalog

在MyEclipse的工具栏中,选择“Window→Preferences”选项,弹出如图1.25所示窗口。

图1.25 新增XML Catalog-1

选择XML Catalog,在右侧窗口选中User Specified Entries,单击“Add”按钮,弹出如图1.26所示界面,并添加相关内容。

Location:单击“File System”按钮,选择DTD文件位置(D:\ mybatis-3-config.dtd)或者选择把DTD文件放入本项目工程中的某一固定位置,单击“Workspace”按钮进行引入。

Key type:Public ID(默认即可)。

图1.26 新增XML Catalog-2

Key:-//mybatis.org//DTD Config 3.0//EN(与mybatis-config.xml文件头中的“-//mybatis.org//DTD Config 3.0//EN”相同)。

保存完配置之后,即可在编写mybatis-config.xml的时候,实现自动联想节点元素以及属性等,方便用户操作。

mapper.xml文件配置同上,引入mybatis-3-mapper.dtd文件即可,此处不再赘述。

技能训练

上机练习3——改造供应商表的查询操作

需求说明

在前面练习的基础上,完成以下改造。

(1)增加数据库测试运行环境(如SQL Server数据库或者另一台测试服务器的MySQL数据库),并完成由开发环境到测试环境的切换。

(2)更改properties元素对于数据库信息的配置方式,直接配置为xml,并使用这些属性对配置项实现动态配置,观察resource属性值和property子节点配置的优先级。

(3)使用typeAliases元素给POJO增加类型别名。

(4)对于mappers元素,使用URL方式来获取SQL映射文件。