MyBatis全局配置文件(上)

143 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第25天,点击查看活动详情

全局配置文件

掌握了简单的查询操作之后,我们来看看MyBatis的全局配置文件究竟能做些什么?

引入外部属性文件

还记得我们在全局配置文件中如何配置数据源的吗?

<dataSource type="POOLED">
  <property name="driver" value="com.mysql.jdbc.Driver"/>
  <property name="url" value="jdbc:mysql:///mybatis"/>
  <property name="username" value="root"/>
  <property name="password" value="123456"/>
</dataSource>

这种方式将属性值写死在了配置文件中,显然不是一个好的办法,为此,我们可以使用MyBatis提供的 properties 标签来引入外部的属性文件,所以在类路径下编写一个属性文件(dbconfig.properties):

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///mybatis
jdbc.username=root
jdbc.password=123456

此时将该文件引入即可:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
  <!-- 引入外部属性文件 -->
  <properties resource="dbconfig.properties"/>
  <environments default="development">
    <environment id="development">
      <transactionManager type="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>
  ......
</configuration>

properties 标签有两种方式来引入外部属性文件:

  • resource:引入本地属性文件
  • url:引入网络属性文件

将属性文件引入后,我们就可以通过 ${键名} 的方式取出属性文件中键名对应的键值,实现数据源的动态配置。

settings

全局配置文件中有一个非常重要的标签: settings ,通过该标签能够设置MyBatis的一些运行时行为,比如我们在入门案例中开启了MyBatis的驼峰命名。

settings标签能够设置非常多的行为,具体列举如下:

设置名描述有效值默认值
cacheEnabled全局性地开启或关闭所有映射器配置文件中已配置的任何缓存。truefalsetrue
lazyLoadingEnabled延迟加载的全局开关。当开启时,所有关联对象都会延迟加载。 特定关联关系中可通过设置 fetchType属性来覆盖该项的开关状态。truefalsefalse
aggressiveLazyLoading开启时,任一方法的调用都会加载该对象的所有延迟加载属性。 否则,每个延迟加载属性会按需加载(参考 lazyLoadTriggerMethods)。truefalsefalse (在 3.4.1 及之前的版本中默认为 true)
multipleResultSetsEnabled是否允许单个语句返回多结果集(需要数据库驱动支持)。truefalsetrue
useColumnLabel使用列标签代替列名。实际表现依赖于数据库驱动,具体可参考数据库驱动的相关文档,或通过对比测试来观察。truefalsetrue
useGeneratedKeys允许 JDBC 支持自动生成主键,需要数据库驱动支持。如果设置为 true,将强制使用自动生成主键。尽管一些数据库驱动不支持此特性,但仍可正常工作(如 Derby)。truefalseFalse
autoMappingBehavior指定 MyBatis 应如何自动映射列到字段或属性。 NONE 表示关闭自动映射;PARTIAL 只会自动映射没有定义嵌套结果映射的字段。 FULL 会自动映射任何复杂的结果集(无论是否嵌套)。NONE, PARTIAL, FULLPARTIAL
autoMappingUnknownColumnBehavior指定发现自动映射目标未知列(或未知属性类型)的行为。- NONE: 不做任何反应
  • WARNING: 输出警告日志('org.apache.ibatis.session.AutoMappingUnknownColumnBehavior' 的日志等级必须设置为 WARN
  • FAILING: 映射失败 (抛出 SqlSessionException)

所有属性的默认值,及其各值对应的功能在表中都已详细介绍。

typeAliases

typeAliases意为类型别名,该标签能够为Java类型设置一个缩短的名字,以此方便程序的书写。

比如EmployeeMapper.xml文件中:

<select id="getEmpById" resultType="com.wwj.mybatis.bean.Employee">
  select * from tbl_employee where id = #{id}
</select>

resultType的属性值为Employee的全类名,我们可以在全局配置文件中设置Employee的别名:

<typeAliases>
  <typeAlias type="com.wwj.mybatis.bean.Employee" alias="emp"/>
</typeAliases>

type属性指定需要设置别名的Java类型,默认别名为类名首字母小写,也可以设置alias属性来指定别名,现在EmployeeMapper.xml文件中就可以简写为:

<select id="getEmpById" resultType="emp">
  select * from tbl_employee where id = #{id}
</select>

当我们需要起别名的Java类型过多时,一个一个地进行设置显然不太合理,为此,我们可以使用 package 标签来实现批量起别名,比如:

<typeAliases>
  <package name="com.wwj.mybatis.bean"/>
</typeAliases>

此时 com.wwj.mybatis.bean 包及其子包下的所有类都将被设置别名,默认为类名首字母小写;然而别名是不区分大小写的,所以大小写均可。