关于MyBatis配置文件读取优先级的问题



前言

MyBatis支持在配置文件和mapper文件中使用占位符,而替换这些占位符的系统属性可以通过引入外部配置文件、xml配置和通过接口传入。


提示:以下是本篇文章正文内容,下面案例可供参考

一、系统属性设置方式

1、外部配置文件

在mybatis的配置文件中如下配置即可

<properties resource="org/mybatis/example/config.properties">
</properties>

或者

<properties url="file:./src/test/java/org/apache/ibatis/builder/jdbc.properties">
</properties>

2、xml配置

在mybatis的配置文件中如下配置即可

<properties>
   <property name="username" value="dev_user"/>
   <property name="password" value="F2Fa3!33TYyg"/>
</properties>

3、接口设置

SqlSessionFactory factory =
  sqlSessionFactoryBuilder.build(reader, props);

// ... or ...

SqlSessionFactory factory =
  new SqlSessionFactoryBuilder.build(reader, environment, props);

二、以上方式加载优先级问题

如果一个属性存在于多个位置中(通过以上多种方式配置),则MyBatis将按以下顺序加载它们:
1. 首先读取properties元素主体中指定的属性(xml配置),
2. 从类路径资源或properties元素的url属性加载的属性将被读取,并覆盖已经指定的所有重复属性,(外部配置文件)
3. 作为方法参数传递的属性将最后读取,并覆盖可能已从属性主体和资源/ URL属性加载的所有重复属性(接口设置)。

因此,优先级最高的属性是作为方法参数传入的属性(接口设置),其后是resource / url属性(外部配置文件),最后是properties元素主体中指定的属性(xml配置)。

三、占位符指定默认值注意事项

从MyBatis 3.4.2版本开始,可以在通过占位符引用系统配置的时候设置默认值,如下所示

<dataSource type="POOLED">
  <!-- ... -->
  <property name="username" value="${username:ut_user}"/> <!-- If 'username' property not present, username become 'ut_user' -->
</dataSource>

默认情况下禁用此功能。 如果在占位符中指定默认值,则应通过添加以下特殊属性来启用此功能

<properties resource="org/mybatis/example/config.properties">
  <!-- ... -->
  <property name="org.apache.ibatis.parsing.PropertyParser.enable-default-value" value="true"/> <!-- Enable this feature -->
</properties>

但是,这将与SQL定义上的属性键(例如db:username)或这OGNL表达式的三元运算符(例如$ {tableName!= null?tableName:'global_constants'})中的“:”字符冲突。 如果使用任何一个并想要默认属性值,则必须通过添加此特殊属性来更改默认值分隔符

<properties resource="org/mybatis/example/config.properties">
  <!-- ... -->
  <property name="org.apache.ibatis.parsing.PropertyParser.default-value-separator" value="?:"/> <!-- Change default value of separator -->
</properties>
<dataSource type="POOLED">
  <!-- ... -->
  <property name="username" value="${db:username?:ut_user}"/>
</dataSource>

所以系统配置enable-default-value需要慎重。


总结

MyBatis支持多种方式配置系统属性,其中优先级最高的属性是作为方法参数传入的属性(接口设置),其后是resource / url属性(外部配置文件),最后是properties元素主体中指定的属性(xml配置)。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lang20150928

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值