之前写了一篇《如何搭建MyBatis开发环境》,通过一个简单的实例讲解了关于搭建MyBatis的开发环境,这篇将详细讲解MyBatis的配置。
MyBatis配置文件的层次结构
<?xml version="1.0" encoding="UTF-8"?>
<!--配置-->
<configuration>
<properties/><!--属性-->
<settings/><!--设置-->
<typeAliases/><!--类型命名-->
<typeHandlers/><!--类型处理器-->
<objectFactory/><!--对象工厂-->
<plugins/><!--插件-->
<environments><!--配置环境-->
<environment><!--环境变量-->
<transactionManager/><!--事务管理器-->
<dataSource/><!--数据源-->
</environment>
</environments>
<databaseIdProvider/><!--数据库厂商标识-->
<mappers/><!--映射器-->
</configuration>
这是全部MyBatis的配置元素,看起来简单,但是层次顺序一定不能够颠倒。有些配置元素可以被省略不写,但是不影响层次顺序,后续的元素依次补上即可。
properties元素
properties是一个配置属性的元素,让我们能在配置文件的上下文中使用它。
MyBatis提供3种配置文件方式。
- property子元素。
- properties配置文件。
- 程序参数传递。
property子元素
配置方法
<properties>
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</properties>
这样我们就可以在上下文使用已经配置好的属性值了。我们配置数据库时就可以按照如下代码进行配置。
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
其中${name}中的name值一定要与properties中的property子元素name属性的值相同。
properties配置文件
在实际项目中,更多的时候,是使用properties配置文件来配置属性值,这样可以方便开发者在多个配置文件中重复使用它们,也方便日后维护和随时修改。
<properties resource="jdbc.properties"/>
这样就引入了一个名为jdbc的properties文件。jdbc.properties代码如下
#数据库配置文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis
username=root
password=123456
注意:在jdbc.properties不能出现空格
程序参数传递
在实际工作中,数据库用户和密码是不允许以明文的形式存储在配置文件中的,而加密过后的数据库信息无法通过加密的字符串去连接数据库。这时就可以通过编码的形式去满足此场景。
假设在jdbc.properties文件中的username和password两个属性使用了加密的字符串,这个时候需要在生成SqlSessionFactory之前将它转化为明文,而系统已经提供了解密的方法decode(str)。
InputStream cfgStream = null;
Reader cfgReader = null;
InputStream proStream = null;
Reaader proReader = null;
Properties properties = null;
try {
// 读入配置文件流
cfgStream = Resource.getResourceAsStream("mybatis-config.xml");
cfgReader = new InputStreamReader(cfgStream);
// 读入属性文件
proStream = Resource.getResourceAsStream("jdbc.properties");
proReader = new InputStreamReader(proStream);
properties = new Properties();
properties.load(proReader);
// 解密为明文
properties.setProperty("username",decode(properties.getProperty("username")));
properties.setProperty("password",decode(properties.getProperty("password")));
} catch(IOException ex) {
Logger.getLogger(SqlSessionFactoryUtil.class.getName()).log(Level.SEVERE,null,ex)
}
synchronized(CLASS_LOCK) {
if(sqlSessionFactory == null) {
// 使用属性来创建SqlSessionFactory
sqlSessionFactory = new SqlSessionFactoryBuilder().build(cfgReader,properties);
}
}
使用总结
以上三种配置方式在MyBatis配置中可以同时出现,并且属性也会重复配置。所以三种方式是存在优先级的。
通过方法参数传递的属性具有最高优先级,resource/url属性中指定的配置文件次之,最低优先级的是properties属性中指定的属性。
在实际操作中,需要注意以下三点:
1、不要使用混合的方式,这样会使得管理混乱。
2、首选的方式是使用properties文件。
3、如果需要对其进行加密或其他加工以满足需求,不妨按示例的方法处理。这样做的好处是使得配置都来自于同一个配置文件,就不容易产生没有必要的歧义,也为日后统一管理提供了方便。
原创文章,作者:ZERO,如若转载,请注明出处:https://www.edu24.cn/course/mybatis-properties-cfg.html