先来官网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> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/study?userSSL=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai"/> <property name="username" value="root"/> <property name="password" value="password"/> </dataSource> </environment> </environments> </configuration>
现在可以使用属性properties进行动态配置
先来一个属性文件
driver=com.mysql.cj.jdbc.Driver url = jdbc:mysql://localhost:3306/study?userSSL=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai username = root password = password
接着就可以在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 resource="db.properties"> </properties> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/lingaolu/dao/DeptMapper.xml"/> </mappers> </configuration>
使用内部子元素属性
当然我们的属性值也可以定义在内部,如
<?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="db.properties"> <property name="username" value="root"/> <property name="password" value="password"/> </properties> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> </environment> </environments> <mappers> <mapper resource="com/lingaolu/dao/DeptMapper.xml"/> </mappers> </configuration>
加载属性的顺序
如果一个属性在不只一个地方进行了配置,那么,MyBatis的加载顺序是怎么样的呢
我们就用用户名来举例,在3个地方都定义了用户名这个属性,正确的用户名是root,然后给值都是错的值,看最后报错的用户名的值是多少
db.properties文件使用root1
内部属性给值root2,直接赋值root3
单元测试一下
报错显示的是root3,说明最后使用的是直接赋值的
那么属性文件里的属性,和内部子元素属性的加载顺序如何呢,我们修改一下代码,不直接赋值,而是使用属性赋值
单元测试一下
报错显示的是root3,说明是先加载的是内部子元素属性
所以如果一个属性在不只一个地方进行了配置,那么,MyBatis 将按照下面的顺序来加载:
- 首先读取在 properties 元素体内指定的属性
- 然后根据 properties 元素中的 resource 属性读取类路径下属性文件,或根据 url 属性指定的路径读取属性文件,并覆盖之前读取过的同名属性。
- 最后读取作为方法参数传递的属性,并覆盖之前读取过的同名属性。
也就是官网所说明的
属性默认值
我们启用了属性默认值,并且内部子元素属性也不配置了用户名username
但是我们的属性文件db.properties还是配置了用户名username,先测试一下
单元测试一下
使用的还是属性文件里面的值,为什么没有使用默认的值,因为我们的默认值是指如果没有配置,才使用的
所以我们就得把属性文件里的username注释掉
现在username没有任何地方配置了,单元测试一下
成功了,说明已经使用了默认值root