使用 MyBatis 连接多个数据库

在实际的应用开发中,常常需要连接多个数据库,这种需求在微服务架构或者大型企业应用中尤为常见。MyBatis 作为一个优秀的 Java 持久化框架,支持灵活地连接多个数据库。本文将介绍如何在 Java 项目中使用 MyBatis 连接多个数据库,并提供相关的代码示例和类图、旅行图。

1. 理论背景

MyBatis 是一个流行的持久层框架,通过映射 SQL 为 Java 对象,实现数据的持久化。它通过 XML 或注解的方式,让开发者可以以简单灵活的方式进行 SQL 操作。为了连接多个数据库,通常我们需要配置多个数据源,以及相应的 MyBatis 配置。

1.1 架构设计

在设计连接多个数据库的应用时,我们可以采用以下架构:

  • 数据源管理:使用不同的数据源来连接不同的数据库。
  • Mapper 映射:每个数据库可以有自己的 Mapper 接口和 XML 文件。
  • 事务管理:确保在多个数据库间的事务一致性(如果需要)。

1.2 类图

我们可以用以下类图来展示程序的结构:

classDiagram
    class DataSourceConfig {
        - String url
        - String username
        - String password
        + DataSource getDataSource()
    }

    class UserMapper {
        + User selectUserById(int id)
    }

    class OrderMapper {
        + Order selectOrderById(int id)
    }

    class UserService {
        - UserMapper userMapper
        + User getUserById(int id)
    }

    class OrderService {
        - OrderMapper orderMapper
        + Order getOrderById(int id)
    }

    DataSourceConfig --> UserMapper
    DataSourceConfig --> OrderMapper
    UserService --> UserMapper
    OrderService --> OrderMapper

2. 实现步骤

接下来,我们将详细讲解如何实现连接多个数据库的过程。

2.1 配置 Maven 依赖

首先,确保你的 pom.xml 文件中包含了 MyBatis 和数据库连接池(例如 HikariCP)的相关依赖:

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.7</version>
</dependency>
<dependency>
    <groupId>com.zaxxer</groupId>
    <artifactId>HikariCP</artifactId>
    <version>3.4.5</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.23</version>
</dependency>

2.2 数据源配置

然后,我们需要定义多个数据源的配置。假设我们要连接两个数据库,分别是 db1db2

import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

public class DataSourceConfig {
    
    public HikariDataSource dataSource1() {
        HikariConfig config = new HikariConfig();
        config.setJdbcUrl("jdbc:mysql://localhost:3306/db1");
        config.setUsername("user1");
        config.setPassword("password1");
        return new HikariDataSource(config);
    }

    public HikariDataSource dataSource2() {
        HikariConfig config = new HikariConfig();
        config.setJdbcUrl("jdbc:mysql://localhost:3306/db2");
        config.setUsername("user2");
        config.setPassword("password2");
        return new HikariDataSource(config);
    }
}

2.3 Mapper 接口和 XML 文件

接下来,我们需要为每个数据库创建 Mapper 接口和 XML 映射文件。例如,对于 db1 的用户表:

UserMapper.java

import org.apache.ibatis.annotations.Select;

public interface UserMapper {
    @Select("SELECT * FROM users WHERE id = #{id}")
    User selectUserById(int id);
}

UserMapper.xml

<mapper namespace="com.example.UserMapper">
    <select id="selectUserById" resultType="User">
        SELECT * FROM users WHERE id = #{id}
    </select>
</mapper>

类似地,我们也可以为 db2 创建一个订单映射:

OrderMapper.java

import org.apache.ibatis.annotations.Select;

public interface OrderMapper {
    @Select("SELECT * FROM orders WHERE id = #{id}")
    Order selectOrderById(int id);
}

OrderMapper.xml

<mapper namespace="com.example.OrderMapper">
    <select id="selectOrderById" resultType="Order">
        SELECT * FROM orders WHERE id = #{id}
    </select>
</mapper>

2.4 Service 层实现

在 Service 层中,我们将调用不同的数据源和 Mapper 接口:

public class UserService {
    private final UserMapper userMapper;

    public UserService(UserMapper userMapper) {
        this.userMapper = userMapper;
    }

    public User getUserById(int id) {
        return userMapper.selectUserById(id);
    }
}

public class OrderService {
    private final OrderMapper orderMapper;

    public OrderService(OrderMapper orderMapper) {
        this.orderMapper = orderMapper;
    }

    public Order getOrderById(int id) {
        return orderMapper.selectOrderById(id);
    }
}

3. 总结

通过以上的步骤,我们可以成功地在 Java 项目中使用 MyBatis 连接多个数据库。我们通过配置不同的数据源以及相应的 Mapper 映射,实现了对不同数据库的访问。

在实际开发中,有时需要协调不同数据库之间的一致性事务处理,这就需要更多的考虑和设计。然而,使用 MyBatis 进行多数据源的管理和操作,为我们的项目提供了灵活性和可维护性。

journey
    title 使用 MyBatis 连接多个数据库
    section 准备工作
      配置 Maven 依赖: 5: User
      数据源配置: 5: User
    section 数据库操作
      用户操作: 4: User
      订单操作: 4: User

希望本文能够帮助你更好地理解如何使用 MyBatis 连接多个数据库,并在实际项目中应用它!