连接多个MySQL数据库的方法

在实际的开发中,有时候需要连接多个不同的MySQL数据库,比如一个系统需要同时操作用户数据和产品数据,这时候就需要在MyBatis配置中实现连接多个数据库。下面我们来介绍一种简单的方法。

配置数据源

首先,在resources目录下创建多个properties文件,分别用于配置不同数据库的连接信息,比如userDB.propertiesproductDB.properties

userDB.properties

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/userdb
jdbc.username=root
jdbc.password=password

productDB.properties

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/productdb
jdbc.username=root
jdbc.password=password

MyBatis配置

在MyBatis的配置文件中,引入多个数据源的配置,并通过sqlSessionFactoryBean创建多个SqlSessionFactory实例。

mybatis-config.xml

<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <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>
        </environment>
    </environments>

    <mappers>
        <!-- 配置Mapper -->
    </mappers>
</configuration>

SqlSessionFactoryBean

@Configuration
public class SqlSessionFactoryBean {

    @Value("${userDB.driver}")
    private String userDBDriver;

    @Value("${userDB.url}")
    private String userDBUrl;

    @Value("${userDB.username}")
    private String userDBUsername;

    @Value("${userDB.password}")
    private String userDBPassword;


    @Value("${productDB.driver}")
    private String productDBDriver;

    @Value("${productDB.url}")
    private String productDBUrl;

    @Value("${productDB.username}")
    private String productDBUsername;

    @Value("${productDB.password}")
    private String productDBPassword;

    @Bean(name = "userSqlSessionFactory")
    public SqlSessionFactory userSqlSessionFactory() throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource(userDBDriver, userDBUrl, userDBUsername, userDBPassword));
        return sqlSessionFactoryBean.getObject();
    }

    @Bean(name = "productSqlSessionFactory")
    public SqlSessionFactory productSqlSessionFactory() throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource(productDBDriver, productDBUrl, productDBUsername, productDBPassword));
        return sqlSessionFactoryBean.getObject();
    }

    public DataSource dataSource(String driver, String url, String username, String password) {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName(driver);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        return dataSource;
    }
}

使用多数据源

在需要操作不同数据库的地方,通过@Qualifier注解指定具体的SqlSessionFactory实例。

@Repository
public class UserDao {

    @Autowired
    @Qualifier("userSqlSessionFactory")
    private SqlSessionFactory userSqlSessionFactory;

    public User getUserById(int id) {
        try (SqlSession session = userSqlSessionFactory.openSession()) {
            return session.selectOne("getUserById", id);
        }
    }
}

@Repository
public class ProductDao {

    @Autowired
    @Qualifier("productSqlSessionFactory")
    private SqlSessionFactory productSqlSessionFactory;

    public Product getProductById(int id) {
        try (SqlSession session = productSqlSessionFactory.openSession()) {
            return session.selectOne("getProductById", id);
        }
    }
}

状态图

stateDiagram
    state 客户端
    state 服务器1
    state 服务器2

    客户端 --> 服务器1: 请求用户数据
    服务器1 --> 服务器2: 请求产品数据
    服务器2 --> 服务器1: 返回产品数据
    服务器1 --> 客户端: 返回用户数据

关系图

erDiagram
    USER ||--o| ORDER : has
    USER ||--o| COMMENT : has
    PRODUCT ||--o| ORDER : has
    PRODUCT ||--o| COMMENT : has

通过以上方式,我们可以在MyBatis中连接多个MySQL数据库,实现对不同数据库的操作。这种方法简单易懂,方便扩展,适用于大多数业务场景。希望对你有所帮助!