You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:30:12