MyBatis(三):MyBatis配置详解(一)
在MyBatis(一)和MyBatis(二)中,只是对MyBatis的组成和用法做了简单描述,本次将对MyBatis的配置进行详细的讲解。MyBatis的配置文件在整个MyBatis体系中起到至关重要的作用,所以想利用好MyBatis,首先要学习好配置文件的层次结构,这些层次是不能颠倒顺序的,如果颠倒,将会出现异常。
先来了解一下配置XML文件的层次结构:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<properties/> <!--配置 -->
<settings/><!--设置-->
<typeAliases/><!--类型命名 -->
<typeAlias/>
</typeAliases>
<typeHandlers/><!--类型处理器 -->
<objectFactory/><!--对象工厂 -->
<plugins/><!--插件 -->
<environments><!--环境配置 -->
<environment><!--环境变量 -->
<transactionManager/><!--事务管理器 -->
<datasSource/><!--数据源 -->
</environment>
</environments>
<databaseIdProvider/><!--数据库厂商标示 -->
<mappers/><!--映射器 -->
</configuration>
我们需要想了解具体的配置方法和使用方法,才能知道MyBatis有什么功能和作用,在之后谈到MyBatis运行原理的时候我们将会知道在整个运行过程中是怎么调度的。关于Plugin元素的用法这次不做谈论,在学习原理之前,是没有办法清晰理解插件的。
一、properties元素
它是一个配置属性的元素,可以在配置文件的上下文汇总使用。MyBatis提供了3种配置方式:
1、property子元素
<properties> <!--配置 -->
<properties name="dirver" value="com.mysql.jdbc.Driver"/>
<properties name="url" value="jdbc:mysql://192.168.15.173:3306/mybatis"/>
<properties name="username" value="root"/>
<properties name="password" value="123456"/>
</properties>
上述代码段,相当是在配置文件中声明了4个属性,在同一配置文件上下文中可以随意使用。
例如在<dataSource>中直接使用:
<dataSource type="POOLED">
<property name="driver" value="${dirver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
</dataSource>
2、properties配置文件
由于子元素不能重复使用,多个文件需要多个配置,为了方便维护以及随时修改,我们通常会一处声明多次使用,
因此会单独创建一个datasource.properties的文件,来配置一些共用的参数
如下:
jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://192.168.15.173:3306/mybatis
username=root
password=123456
然后可以在mybatis-config.xml中利用<properties resource="datasource.properties"/>引入properties文件,即可使用。
3、程序参数传递
在实际工作中,系统是由运维人员配置,生产环境数据库的用户密码对开发人员应当是保密的,而且为了安全,运维
人员要求对配置文件中的数据库用户名和密码进行加密,因此配置文件中往往配置的是加密后的数据库信息。无法通过
加密的字符串去链接数据库,这时候需要编码来满足此场景。假设jdbc.properties文件中的username和password两个属性
使用了加密的字符串,因此在生成SqlSessionFactory之前将它转化为明文,系统已经提供了解密的方法decode(str)。
代码如下:
InputStream cfgStream = null;
Reader cgfReader = null;
InputStream proStream = null;
Reader proReader = null;
properties properties = null;
try{
//读入配置文件流
cfgStream = Resources.getResourceAsStream("mybatis-config.xml");
cfgReader = new InputStreamReader(cfgStream);
//读入属性文件
proStream = Resources.getResourceAsStream("jdbc.properties");
proReader = new InputStamReader(proStream);
properties = new Properties();
properties.load(proReader);
//解密为明文
properties.setProperty("username",docode(properties.getProperty("username")));
properties.setProperty("password",docode(properties.getProperty("password")));
}catch(IOException ex){
Logger.getLogger(SqlSessionFactoryUtil.class.getName()).log(Level.SEVERE,null,ex);
}
synchronized(CLASS_LOCK){
if(sqlSessionFactory == null){
//使用属性来创建SqlSessionFactory
SqlSessionFactory =
newSqlSessionFactoryBuilder().build(cfgReader,properties);
}
}
这样完成可以在jdbc.properties配置密文,满足对系统安全的要求。
二、优先级
上文中的3中配置方式可能同时出现,并且属相还会重复配置,这3种配置存在优先级,MyBatis将按照下面的顺序来加
载。
1、在properties元素体内指定的属性首先被读取。
2、根据properties元素中的resource属性读取类路径下属文件。或者根据url属性指定的路径读取属性文件,并覆盖已读
取的同名属性。
3、读取作为方法参数传递的属性,并覆盖已读取的同名属性。
因此,通过方法参数传递的属性具有最高优先级,resource/url属性中指定的配置文件次之,最低优先级的是
properties属 性中指定的属性,因此,在使用配置时应当 注意3点:
1、不要使用混合的方式,这样会使得管理混乱。
2、首选的方式是使用properties文件。
3、如果需要对其进行加密或者其他加工以满足特殊的要求,可以按照示例的方法处理,这样做的好处是使得配置
都来自于同一个配置文件,就不容易产生没必要的歧义,也为日后统一管理提供方便。
三、设置
settings在MyBatis中是最复杂的配置,也是最重要的配置内容之一,它会改变MyBatis运行时的行为,即使不配置
settings,MyBatis也可以正常的工作,但了解settings的配置内容却十分重要。
下面是一个完整的配置:
配置不需要修改太多,这里只需了解就好,一般来说只需要修改少量的配置即可,后面会详细谈论一些常用功能
。
<settings>
<setting name="cacheEnabled" value="true"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="multipleResultSetsEnabled" value="true"/>
<setting name="useColumnLabel" value="true"/>
<setting name="useGeneratedKeys" value="false"/>
<setting name="autoMappingBehavior" value="PARTIAL"/>
<setting name="defaultExecutorType" value="SIMPLE"/>
<setting name="defaultStatementTimeout" value="25"/>
<setting name="safeRowBoundsEnabled" value="false"/>
<setting name="mapunderscoreToCamelCase" value="false"/>
<setting name="localCacheScope" value="SESSION"/>
<setting name="jdbcTypeForNull" value="OTHER"/>
<setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>
在大部分时候不需要去配置它,或者秩序配置少数几项即可。