MyBatis配置文件并不复杂,他所有的元素如下:
<?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></properties> <!-- 属性 -->
<settings></settings> <!-- 设置 -->
<typeAliases></typeAliases> <!-- 类型命名 -->
<typeHandlers></typeHandlers> <!-- 类型处理器 -->
<objectFactory type=""></objectFactory> <!-- 对象工厂 -->
<plugins></plugins> <!-- 插件 -->
<environments default=""> <!-- 配置环境 -->
<environment id=""> <!-- 环境变量 -->
<transactionManager type=""></transactionManager> <!-- 事务管理器 -->
<dataSource type=""></dataSource> <!-- 数据源 -->
</environment>
</environments>
<databaseIdProvider type=""></databaseIdProvider> <!-- 数据库厂商标识 -->
<mappers></mappers> <!-- 映射器 -->
</configuration>
properties属性
properties属性可以给系统配置一些运行参数,可以放在XML文件或者properties文件中,而不是放在Java编码中,这样的好处就在于方便参数修改,而不会引起代码的重新编译,一般来说,MyBaties提供了3种方式使用properties,分别是:
- property子元素
- properties文件
- 程序代码传递
1)、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/ssm"/>
<property name="database.username" value="root"/>
<property name="database.password" value="123456"/>
</properties>
<typeAliases><!-- 别名-->
<typeAlias alias="role" type="pojo.Role"></typeAlias>
</typeAliases>
<!-- 数据库环境 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="${database.driver}"></property>
<property name="url" value="${database.url}"></property>
<property name="username" value="${database.username}"></property>
<property name="password" value="${database.password}"></property>
</dataSource>
</environment>
</environments>
<!-- 映射文件 -->
<mappers>
<mapper resource="mapper/RoleMapper.xml"></mapper>
</mappers>
</configuration>
这里使用了元素properties下的子元素property定义,用字符串database.username定义数据库用户名,然后就可以在数据库定义中引入这个已经定义好的属性参数,如${database.username},这样就定义一次就可以到处引用了。
2)、使用properties文件
使用properties文件是比较普遍的方法,一方面这个文件十分简单,其逻辑就是键值对应,我们可以配置多个键值放在一个properties文件中,也可以把多个键值放到多个properties文件中。
我们创建一个jdbc.properties放到classpath路径下,代码如下:
database.driver=com.mysql.jdbc.Driver
database.url=jdbc:mysql://localhost:3306/ssm
database.username=root
database.password=123456
在MyBaties中通过properties的属性resource来引入properties文件。
<properties resource="jdbc.properties"/>
这样之后也可以按${database.driver}的方法引入properties文件的属性参数到MyBatis配置文件中。
3)、使用程序传递方式传递参数
有时候不想让别人知道用户和密码,此时往往需要通过加密和解密操作。现在假设系统已经为其提供的一个CodeUtils.decode(str)进行解密,那么我们在创建SqlSessionFactory前,就需要把用户名和密码解密,然后把解密后的字符串重置到properties属性中,代码如下:
String resource="mybatis-config.xml";
InputStream inputStream;
InputStream in= Resources.getResourceAsStream("jdbc.properties");
Properties props=new Properties();
props.load(in);
String username=props.getProperty("database.username");
String password=props.getProperty("database.passwprd");
//解密用户和密码,并在属性中重置
props.put("database.username",CodeUtils.decode(username));
props.put("database.password",CodeUtils.decode(password));
inputStream=Readables.getResourceAsStream(resource);
SqlSessionFactory =new SqlSessionFactoryBuilder().build(inputStream,props);
首先使用Resources对象读取了一个jdbc.properties配置文件,然后获取了它原来配置的用户和密码,进行解密并重置,最后使用SqlSessionFactoryBuilder的build方法,传递多个properties参数来完成。
总结:
我们讨论了MyBatis使用properties的3种方式,这三种方式是有优先级的,最优先的是使用程序传递的方式,其次是使用peoperties文件的方式,最后是使用property子元素的方式,MyBatis会根据优先级来覆盖原先配置的属性值。