MyBatis配置项的顺序是不能颠倒的,如果颠倒了它们的顺序,那么在MyBatis启动阶段就会发生异常。
properties属性
properties属性可以给系统配置一些运行参数,可以放在XML文件或者properties文件中,而不是放在Java编码中,这样的好处在于方便参数修改,而不会引起代码的重新编译。
property子元素
<?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> <!-- 属性 -->
<property name="database.driver" value="com.mysql.jdbc.Driver"/>
<property name="database.url" value="jdbc:mysql://localhost:3306/test"/>
<property name="database.username" value="root"/>
<property name="database.password" value="root"/>
</properties>
<!-- 数据库环境 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${database.driver}" />
<property name="url" value="${database.url}" />
<property name="username" value="${database.username}" />
<property name="password" value="${database.password}" />
</dataSource>
</environment>
</environments>
</configuration>
使用properties文件
创建一个jdbc.properties文件
database.driver=com.mysql.jdbc.Driver
database.url=jdbc:mysql://localhost:3306/test
database.username=root
database.password=root
在mybatis-config.xml中通过如下方式引入
<properties resource="jdbc.properties"></properties>
也是按照${dabase.username}的方式引入properties文件的属性参数
使用程序传递方式传递参数
在真实的生产环境中,数据库的用户密码都是保密的。一般需要运维人员把用户和密码经过加密成为密文后,配置到properties文件中。所以我们在创建SqlSessionFactory前,就需要把用户名和密码解密,然后再把解密后的字符串充值到properties属性中
String resource = "mybatis-config.xml";
InputStream inputStream;
InputStream in = Resources.getResourceAsStream("jdbc.properties");
Properties properties = new Properties();
properties.load(in);
String username = properties.getProperty("database.username");
String password = properties.getProperty("database.password");
// 解密用户和密码,并在属性中重置
properties.put("database.username", CodeUtils.decode(username));
properties.put("database.password", CodeUtils.decode(password));
inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, properties);
小结
这里介绍了MyBatis三种使用properties的方式。这三种方式是有优先级的,最优先的是使用程序传递的方式,其次是使用properties文件的方式,最后是使用property子元素的方式,MyBatis会根据优先级来覆盖原先配置的属性值。
Settings
settings是MyBatis中最复杂的配置,它能深刻影响MyBatis底层的运行,但是在大部分情况下使用默认值就好了。
这里就只列举出几个常用的配置项说明
配置项 | 作用 | 配置选项说明 | 默认值 |
---|---|---|---|
cacheEnable | 该配置影响所有映射器中配置缓存的全局开关 | true、false | true |
useGeneratedKeys | 允许JDBC支持自动生成主键,需要驱动兼容。如果设置为true,则这个设置强制使用自动生成主键,尽管一些驱动不能兼容但仍可以正常工作(比如Derby) | true、false | false |
autoMappingBehavior | 指定MyBatis应如何自动映射列到字段或属性。NONE表示取消自动映射;PARTIAL表示只会自动映射,没有定义嵌套结果集和映射结果集;FULL会自动映射任意复杂的结果集 | NONE、PARTIAL、FULL | PARTIAL |
mapUnderscoreToCamelCase | 是否开启自动驼峰命名规则映射,即从数据库列名A_COLUMN到Java属性名aColumn的类似映射 | true、false | false |
typeAliases别名
由于类的全限定名很长,需要大量使用的时候不方便。在MyBatis中允许定义一个简写来代表这个类,这就是别名,别名分为系统定义别名和自定义别名。
注意: MyBatis中别名不区分大小写
系统别名
我们之前在configuration
中配置的一些属性,里面就使用到了别名 。
别名的注册一般是通过Configuration获取TypeAliasRegistry类对象,其中有一个getTypeAliasRegistry方法可以获得别名,如configuration.getTypeAliasRegisry()
。 然后就可以通过registerAlias方法对别名注册了
// 事务方式别名
typeAliasRegistry.registerAlias("JDBC", JdbcTransactionFactory.class);
自定义别名
<typeAliases><!-- 别名 -->
<typeAlias alias="role" type="com.whyalwaysmea.pojo.Role" />
</typeAliases>
这样就定义了一个别名。
如果有很多类需要定义别名,那么可以扫描包
<typeAliases><!-- 别名 -->
<package name="com.whyalwaysmea.pojo"/>
</typeAliases>
这样MyBatis将扫描这个包里面的类,将其第一个字母变成小写作为其别名。
比如类com.whyalwaysmea.pojo.Role的别名是role,com.whyalwaysmea.pojo.User的别名是user。
使用这个的规则,有时候会出现重复,比如有com.whyalwaysmea.pojo2.User这个类,同时也设置了com.whyalwaysmea.pojo2
的包扫描,那么就会出现异常。这个时候可以使用MyBatis提供的注解@Alias(“name”)进行区分
package com.whyalwaysmea.pojo2;
@Alias("user2")
public class User {}