在MyBatis框架中,properties文件是一种非常实用的配置方式,它允许我们将数据库连接信息、系统参数等配置项从主配置文件中分离出来,实现配置的模块化管理。这种方式不仅提高了配置的可维护性,还能有效保护敏感信息。
properties文件在MyBatis中主要承担以下几个重要角色:
在实际项目中,我通常会为每个环境创建独立的properties文件,例如:
dev.properties(开发环境)test.properties(测试环境)prod.properties(生产环境)这种组织方式极大简化了多环境配置管理的工作量。
创建一个规范的properties文件需要注意以下几点:
.properties作为后缀,如db.propertieskey=value的键值对形式jdbc.username一个典型的数据库配置properties文件内容如下:
code复制# 数据库连接配置
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis_demo?useSSL=false&serverTimezone=UTC
jdbc.username=root
jdbc.password=123456
# 连接池配置
pool.initialSize=5
pool.maxActive=20
pool.maxWait=60000
注意:在实际项目中,数据库密码等敏感信息不应该直接明文存储在配置文件中。可以考虑使用加密工具对敏感信息进行加密,或者在部署时通过环境变量注入。
MyBatis提供了多种方式来引入properties文件,每种方式都有其适用场景:
通过resource属性引入(最常用):
xml复制<properties resource="db.properties"/>
这种方式会从classpath根目录下查找指定的properties文件。
通过url属性引入:
xml复制<properties url="file:///D:/config/db.properties"/>
使用绝对路径引入本地文件系统上的properties文件。
直接内嵌properties:
xml复制<properties>
<property name="jdbc.driver" value="com.mysql.cj.jdbc.Driver"/>
</properties>
直接在配置文件中定义属性,适用于少量固定不变的配置。
在实际开发中,我通常会采用第一种方式,因为它不依赖于文件系统的具体路径,更适合项目部署和迁移。
当使用多种方式定义相同属性时,MyBatis会按照以下优先级进行处理:
properties元素体内指定的属性resource或url指定的properties文件中的属性(会覆盖已存在的同名属性)这种覆盖机制非常实用,特别是在多环境配置的场景下。例如,我们可以在测试环境中这样覆盖生产配置:
xml复制<properties resource="prod.properties">
<property name="jdbc.url" value="jdbc:mysql://test-server:3306/test_db"/>
</properties>
在MyBatis配置文件中,可以通过${}表达式引用properties中定义的属性:
xml复制<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
这种引用方式使得配置更加灵活和可维护。当需要修改数据库连接信息时,只需更新properties文件,而不需要改动主配置文件。
在实际企业级应用中,我推荐采用以下多环境配置管理方案:
目录结构组织:
code复制src/main/resources
├── config
│ ├── dev
│ │ └── db.properties
│ ├── test
│ │ └── db.properties
│ └── prod
│ └── db.properties
└── mybatis-config.xml
Maven Profile集成:
在pom.xml中配置不同环境的资源过滤:
xml复制<profiles>
<profile>
<id>dev</id>
<properties>
<env>dev</env>
</properties>
</profile>
<!-- 其他环境配置 -->
</profiles>
<build>
<resources>
<resource>
<directory>src/main/resources/config/${env}</directory>
<includes>
<include>*.properties</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
配置引用:
xml复制<properties resource="config/${env}/db.properties"/>
这种方案通过Maven的profile机制实现环境隔离,只需在构建时指定profile即可自动选择对应的配置文件。
对于数据库密码等敏感信息,我建议采用以下保护措施:
Jasypt加密方案:
code复制jdbc.password=ENC(G6N718UuyPE5bHyWKyuLQSm02auQPUtm)
xml复制<properties resource="db.properties">
<property name="jasypt.encryptorPassword" value="mySecretKey"/>
</properties>
环境变量注入:
code复制jdbc.password=${DB_PASSWORD}
在使用properties配置时,经常会遇到以下问题:
文件找不到错误:
getResourceAsStream测试文件可访问性属性引用失败:
编码问题:
一个实用的调试技巧是在配置中加入临时日志输出,验证属性是否正确加载:
java复制InputStream input = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(input);
System.out.println(sqlSessionFactory.getConfiguration().getVariables());
在某电商平台项目中,我们采用了分模块的properties管理方案:
按功能模块划分:
db-core.properties:核心数据库配置db-order.properties:订单库配置redis.properties:Redis缓存配置mq.properties:消息队列配置主配置文件整合:
xml复制<properties resource="config/db-core.properties"/>
<properties resource="config/db-order.properties"/>
<properties resource="config/redis.properties"/>
属性引用:
xml复制<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${core.jdbc.driver}"/>
<property name="url" value="${core.jdbc.url}"/>
<!-- 其他数据源配置 -->
</dataSource>
</environment>
</environments>
这种方案使得各模块配置清晰分离,便于团队协作和维护。
属性缓存机制:
MyBatis在初始化时会加载并缓存所有properties,后续操作直接使用缓存值。这意味着:
预解析优化:
对于复杂的属性表达式,可以在应用启动时进行预解析:
java复制Properties props = new Properties();
// 加载和预处理属性
SqlSessionFactory factory = new SqlSessionFactoryBuilder()
.build(reader, props);
最小化原则:
资源关闭:
虽然MyBatis会自动关闭资源,但显式关闭是个好习惯:
java复制try (InputStream input = Resources.getResourceAsStream("db.properties")) {
Properties props = new Properties();
props.load(input);
// 使用props
}
在实际项目中合理使用properties配置,可以显著提高MyBatis应用的可维护性和灵活性。根据我的经验,良好的配置管理往往能让后期维护工作事半功倍。特别是在微服务架构中,将配置中心化后,properties文件的管理方式也需要相应调整,可以考虑与Spring Cloud Config等配置中心方案集成。