如何基于config.xml实现Spring Boot与MyBatis多数据库连接?
在Spring Boot中通过MyBatis config.xml连接多个数据库
嘿,我刚好处理过Spring Boot结合MyBatis config.xml配置多数据库的场景,给你一步步捋清楚怎么做:
第一步:完善MyBatis的config.xml配置
首先得给每个数据库单独添加environment节点,每个节点的id要唯一,这样后续Spring才能精准指定用哪个库。你原来的配置只有一个环境,现在补全成多环境的样子:
<?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> <!-- 默认环境可以随便设一个,后续Spring会指定具体用哪个 --> <environments default="db1"> <!-- 第一个数据库:db1(比如你的AS400库) --> <environment id="db1"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.ibm.as400.access.AS400JDBCDriver"/> <property name="url" value="jdbc:as400://your-db1-host;databaseName=DB1"/> <property name="username" value="db1-user"/> <property name="password" value="db1-pass"/> </dataSource> </environment> <!-- 第二个数据库:db2(可以是另一个AS400或者其他类型库) --> <environment id="db2"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.ibm.as400.access.AS400JDBCDriver"/> <property name="url" value="jdbc:as400://your-db2-host;databaseName=DB2"/> <property name="username" value="db2-user"/> <property name="password" value="db2-pass"/> </dataSource> </environment> </environments> <!-- 这里可以统一配置各个库对应的Mapper XML路径,也可以后续在Spring配置里指定 --> <mappers> <mapper resource="mappers/db1/UserMapper.xml"/> <mapper resource="mappers/db2/OrderMapper.xml"/> </mappers> </configuration>
第二步:Spring Boot中配置多SqlSessionFactory
每个数据库对应一个SqlSessionFactory,通过指定environment id来绑定到config.xml里的对应环境。创建一个配置类:
@Configuration public class MyBatisMultiDbConfig { // 为db1创建SqlSessionFactory @Bean(name = "db1SqlSessionFactory") public SqlSessionFactory db1SqlSessionFactory() throws Exception { SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); // 指定你的config.xml所在路径 factoryBean.setConfigLocation(new ClassPathResource("mybatis/config.xml")); // 绑定config.xml里的db1环境 factoryBean.setEnvironment("db1"); return factoryBean.getObject(); } // 可选:为db1创建SqlSessionTemplate,简化Mapper调用 @Bean(name = "db1SqlSessionTemplate") public SqlSessionTemplate db1SqlSessionTemplate(@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); } // 为db2创建SqlSessionFactory @Bean(name = "db2SqlSessionFactory") public SqlSessionFactory db2SqlSessionFactory() throws Exception { SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); factoryBean.setConfigLocation(new ClassPathResource("mybatis/config.xml")); factoryBean.setEnvironment("db2"); return factoryBean.getObject(); } @Bean(name = "db2SqlSessionTemplate") public SqlSessionTemplate db2SqlSessionTemplate(@Qualifier("db2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) { return new SqlSessionTemplate(sqlSessionFactory); } }
第三步:配置Mapper扫描,绑定到对应SqlSessionFactory
把不同库的Mapper分开到不同的包,然后通过@MapperScan指定每个包对应的SqlSessionFactory:
// 扫描db1的Mapper包,绑定到db1的SqlSessionFactory @Configuration @MapperScan( basePackages = "com.your-project.mapper.db1", sqlSessionFactoryRef = "db1SqlSessionFactory" ) public class Db1MapperConfig { } // 扫描db2的Mapper包,绑定到db2的SqlSessionFactory @Configuration @MapperScan( basePackages = "com.your-project.mapper.db2", sqlSessionFactoryRef = "db2SqlSessionFactory" ) public class Db2MapperConfig { }
第四步:在业务代码中使用
现在就可以正常注入不同库的Mapper来操作对应数据库了:
@Service public class UserService { // 这个Mapper来自db1 @Autowired private UserMapper userMapper; public User getUserById(Long userId) { return userMapper.selectUserById(userId); } } @Service public class OrderService { // 这个Mapper来自db2 @Autowired private OrderMapper orderMapper; public Order getOrderById(Long orderId) { return orderMapper.selectOrderById(orderId); } }
一些注意事项
- 确保config.xml里每个
environment的id和Spring配置里setEnvironment()传入的字符串完全一致,别打错字! - 如果你的Mapper XML文件路径和上面示例不同,记得调整config.xml里的
<mappers>配置,或者在@MapperScan里通过mapperLocations指定。 - 事务管理:每个SqlSessionFactory会自动使用对应环境里配置的事务管理器(这里是JDBC),如果需要跨库事务,得额外配置JTA事务管理器,但一般单库事务用JDBC就够了。
内容的提问来源于stack exchange,提问作者Mohit Anand
相关产品推荐
相关产品推荐

