如何在Spring配置的MyBatis中设置全局自定义属性
解决MyBatis Java配置中自定义属性无法在XML映射器引用的问题
确保自定义配置的优先级
你的配置类需添加@Configuration注解,若Spring容器中存在多个SqlSessionFactory候选Bean,需在sqlSessionFactory()方法上添加@Primary注解,避免Spring Boot自动配置的实例覆盖你的自定义配置。改用Configuration对象直接设置变量
setConfigurationProperties可能因加载顺序问题导致属性未生效,直接操作Configuration的variables属性更可靠:
@Configuration public class MyBatisConfig { @Bean public DataSource getDataSource() { BasicDataSource dataSource = new BasicDataSource(); dataSource.setDriverClassName(driverClassName); dataSource.setUrl(url); dataSource.setUsername(userName); dataSource.setPassword(password); dataSource.setTestWhileIdle(true); dataSource.setValidationQuery("SELECT 1"); return dataSource; } @Bean @Primary // 当存在多个SqlSessionFactory时,确保优先使用此实例 public SqlSessionFactory sqlSessionFactory() throws Exception { SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); sessionFactory.setDataSource(getDataSource()); // 获取现有Configuration或创建新实例 Configuration configuration = sessionFactory.getConfiguration() != null ? sessionFactory.getConfiguration() : new Configuration(); // 将自定义属性存入Configuration的变量集合 configuration.getVariables().put("userStatus", UserStatusCodeEnum.DELETED.getValue()); sessionFactory.setConfiguration(configuration); return sessionFactory.getObject(); } }
- 验证XML映射器中的引用格式
根据属性类型调整引用方式:- 数值类型直接引用:
<select id="listDeletedUsers" resultType="com.yourpackage.User"> SELECT * FROM user WHERE status = ${userStatus} </select>
- 字符串类型需包裹单引号:
<select id="listDeletedUsers" resultType="com.yourpackage.User"> SELECT * FROM user WHERE status = '${userStatus}' </select>
- 确认枚举值有效性
检查UserStatusCodeEnum.DELETED.getValue()返回的类型(如Integer/String)和具体值是否符合预期,避免因类型不匹配或值错误导致引用失效。
内容的提问来源于stack exchange,提问作者Raff
相关产品推荐
相关产品推荐

