MyBatis-Plus与Druid结合Dynamic-datasource实现多数据源操作数据库的示例

 更新时间:2023年10月30日 09:09:04   作者:I'm Jie  
Dynamic-DataSource 可以和绝大多是连接层插件搭配使用,比如:mybatis,mybatis-plus,hibernate等,本文就来介绍一下MyBatis-Plus与Druid结合Dynamic-datasource实现多数据源操作数据库的示例,感兴趣的可以了解一下

MyBatis-Plus 官网:https://baomidou.com/

MyBatis-Plus 官方文档:https://baomidou.com/pages/24112f/

dynamic-datasource 文档(付费):https://www.kancloud.cn/tracy5546/dynamic-datasource/2264611

创建数据库

  • 在这里我分别创建了两个数据库:test1 和 test2,并分别创建相同结构的数据表 User,当然,你也可以根据实际情况创建不同结构的数据表:

    -- ----------------------------
    -- User 表结构
    -- ----------------------------
    CREATE TABLE `user`  (
      `user_id` bigint(0) NOT NULL AUTO_INCREMENT COMMENT '用户ID',
      `user_name` varchar(30)  NOT NULL COMMENT '用户账号',
      `nick_name` varchar(30)  NOT NULL COMMENT '用户昵称',
      `email` varchar(50)  NULL DEFAULT '' COMMENT '用户邮箱',
      `password` varchar(100)  NULL DEFAULT '' COMMENT '密码',
      PRIMARY KEY (`user_id`) USING BTREE
    ) ENGINE = InnoDB AUTO_INCREMENT = 1 COMMENT = '用户信息表' ROW_FORMAT = Dynamic;
    
  • 分别向两个数据库中插入数据:

    -- ----------------------------
    -- 数据库 test1 插入记录
    -- ----------------------------
    INSERT INTO `user` VALUES (100, 'wangwu', '王五', 'wangwu@qq.com', '123456');
    INSERT INTO `user` VALUES (101, 'zhaoliu', '赵六', 'zhaoliu@qq.com', '123456');
    
    -- ----------------------------
    -- 数据库 test2 插入记录
    -- ----------------------------
    INSERT INTO `user` VALUES (100, 'zhangsan', '张三', 'zhangsan@qq.com', '123456');
    INSERT INTO `user` VALUES (101, 'lisi', '李四', 'lisi@qq.com', '123456');
    

添加依赖

接下来我们需要在pom.xml文件中添加所需的依赖项。包括MyBatis-Plus、Dynamic Datasource、Druid和MySQL驱动程序的依赖:

<dependencies>
    <!-- Mybatis Plus -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>最新版本</version>
    </dependency>
    
    <!-- Dynamic Datasource -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
        <version>最新版本</version>
    </dependency>

    <!-- Druid -->
    <dependency>
        <groupId>com.alibaba</groupId>
        <artifactId>druid-spring-boot-starter</artifactId>
        <version>最新版本</version>
    </dependency>

    <!-- MySQL驱动程序 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>最新版本</version>
    </dependency>
</dependencies>

注:请确保将最新版本替换为实际使用的版本号。

配置数据源

application.ymlapplication.properties文件中配置数据源信息。以下是一个示例的application.yml配置:

spring:
  #数据源配置
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    druid:
      statViewServlet:
        enabled: true
        # 设置白名单,不填则允许所有访问
        allow:
        url-pattern: /druid/*
        # 控制台管理用户名和密码
        login-username: helloworld
        login-password: 123456
    dynamic:
      druid:
        initial-size: 10  # 连接池初始大小
        max-active: 100   # 连接池最大连接数
        min-idle: 10      # 连接池最小空闲连接数
        max-wait: 60000   # 获取连接的最大等待时间,单位为毫秒
        pool-prepared-statements: true  # 是否缓存PreparedStatement,默认为true
        max-pool-prepared-statement-per-connection-size: 20  # 每个连接缓存Statement的最大数目
        time-between-eviction-runs-millis: 60000  # 连接回收器运行的时间间隔,单位为毫秒
        min-evictable-idle-time-millis: 300000  # 连接在池中最小空闲的时间,达到此值后将被移除,单位为毫秒
        test-while-idle: true   # 空闲连接检测是否可用,默认为true
        test-on-borrow: false   # 取连接时检测连接是否可用,默认为false
        test-on-return: false   # 还连接时检测连接是否可用,默认为false
        validationQuery: "select 1"  # 验证连接的SQL语句
        filters: stat,wall    # 连接过滤器,用于统计和防火墙功能
        stat:
          log-slow-sql: true  # 是否打印慢SQL日志
          slow-sql-millis: 1000  # 慢SQL的阈值时间,单位为毫秒
          merge-sql: false   # 是否合并SQL,默认为false
        wall:
          multi-statement-allow: true  # 是否允许一次执行多条语句,默认为true
      primary: test1 #主数据源,在代码中不指定数据源时默认为该主数据源
      datasource:
        test1: #数据源 test1
          url: jdbc:mysql://localhost:3306/test1
          username: root
          password: root
        test2: #数据源 test2
          url: jdbc:mysql://localhost:3306/test2
          username: root
          password: root

这里示例配置了两个数据源,分别是useradmin。你可以根据实际情况进行配置。

编写 Mapper

编写 Mapper 接口和对应的 XML 文件:创建 Mapper 接口,并使用 MyBatis-Plus 提供的注解来定义数据库操作。例如:

@Mapper
public interface UserMapper extends BaseMapper<User> {
    // 定义数据库操作方法
}
<!-- UserMapper.xml -->
<mapper namespace="com.example.mapper.UserMapper">
    <!-- 编写SQL语句 -->
</mapper>

编写 Service

在 UserService 接口中,定义了两个方法:

  • getUsersFromTest1Db():返回一个List类型的列表,表示从test1数据库中获取用户信息。
  • getUsersFromTest2Db():返回一个List类型的列表,表示从test2数据库中获取用户信息。
public interface UserService extends IService<User> {
    /**
     * 从test1数据库中获取用户信息
     */
    List<User> getUsersFromTest1Db() ;

    /**
     * 从test2数据库中获取用户信息
     */
    List<User> getUsersFromTest2Db() ;
}

编写 UserServiceImpl 实现类实现具体的方法:

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    @Autowired
    private UserMapper userMapper;

    @DS("test1") // 指定数据源为 test1
    public List<User> getUsersFromTest1Db() {
        return userMapper.selectList(null);
    }

    @DS("test2") // 指定数据源为 test2
    public List<User> getUsersFromTest2Db() {
        return userMapper.selectList(null);
    }

}

由于我们需要分别查询 test1 和 test2 数据库中的 user 表,所以我们需要在查询时切换数据源,Dynamic-datasource提供了注解的方式切换数据源,即我们在上述示例中使用的@DS注解来为每个方法指定数据源。

这样,当调用getUsersFromTest1Db()方法时,会使用名为test1的数据源进行数据库操作;而调用getUsersFromTest2Db()方法时,则会使用名为test2的数据源。

编写 Controller

编写一个控制器类 UserController,使用@RestController注解标记为控制器组件,表示它可以处理HTTP请求,并将结果直接响应给客户端。

在类中使用@Autowired注解将UserService依赖注入到UserController中,以便在方法中使用UserService对象。

user1List()方法使用@GetMapping注解,指定了路径为"/test1-list",表示当客户端发送GET请求到该路径时,会执行该方法。在方法体内部,调用userService的getUsersFromTest1Db方法,以获取用户列表,并将结果作为List类型返回给客户端。

userList()方法同样使用@GetMapping注解,指定了路径为"/test2-list",表示当客户端发送GET请求到该路径时,会执行该方法。在方法体内部,调用userService的getUsersFromTest2Db方法,以获取用户列表,并将结果作为List类型返回给客户端。

@RestController
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/test1-list")
    public List<User> user1List() {
        // 调用UserService的getUsersFromTest1Db方法获取用户列表并返回
        return userService.getUsersFromTest1Db();
    }

    @GetMapping("/test2-list")
    public List<User> user2List() {
        // 调用UserService的getUsersFromTest2Db方法获取用户列表并返回
        return userService.getUsersFromTest2Db();
    }

}

配置 MyBatis-Plus

在项目启动类上添加Mapper扫描注解:

@MapperScan("com.hw.mapper")
@SpringBootApplication
public class HelloWorldApplication {

    public static void main(String[] args) {
        SpringApplication.run(HelloWorldApplication.class, args);
    }

}

在配置文件中添加XML路径:

mybatis-plus:
  # 指定 Mapper XML 文件所在路径
  mapper-locations: classpath*:mapper/*.xml

测试

启动项目,查看控制台输出日志,可以看到已经初始化两个数据源,主数据源就是我们在配置文件中指定的 primary: test1

image-20231029231728893

使用 ApiFox 分别访问两个接口,分别返回不同数据源的数据信息:

访问/test1-list

image-20231029232252219

访问/test2-list

image-20231029232221843

到此这篇关于MyBatis-Plus与Druid结合Dynamic-datasource实现多数据源操作数据库的示例的文章就介绍到这了,更多相关MyBatis-Plus Druid Dynamic-datasource多数据源内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家! 

相关文章

  • Java输入流与输出流超全面讲解

    Java输入流与输出流超全面讲解

    这篇文章主要介绍了关于Java输入流与输出流的相关资料,包括它们的定义、作用、最基础的类和方法,以及如何以其他单位进行读取,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-05-05
  • IDEA配置和启动maven项目详细步骤

    IDEA配置和启动maven项目详细步骤

    本文介绍了从SVN检出Web项目并进行Maven化、JDK和项目结构配置、Spring和Tomcat环境搭建的详细步骤,帮助读者顺利完成Java Web项目的开发环境搭建
    2025-10-10
  • Javaweb项目启动Tomcat常见的报错解决方案

    Javaweb项目启动Tomcat常见的报错解决方案

    Java Web项目启动Tomcat时可能会遇到各种错误,本文就来介绍一下Javaweb项目启动Tomcat常见的报错解决方案,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02
  • 基于mybatis中<include>标签的作用说明

    基于mybatis中<include>标签的作用说明

    这篇文章主要介绍了基于mybatis中<include>标签的作用说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-02-02
  • SpringBoot获取客户端的IP地址的实现示例

    SpringBoot获取客户端的IP地址的实现示例

    在Web应用程序中,获取客户端的IP地址是一项非常常见的需求,本文主要介绍了SpringBoot获取客户端的IP地址的实现示例,具有一定的参考价值,感兴趣的可以了解一下
    2023-09-09
  • 基于java查找最长字符串代码实例

    基于java查找最长字符串代码实例

    这篇文章主要介绍了基于java查找最长字符串代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Java图形界面开发之简易记事本

    Java图形界面开发之简易记事本

    这篇文章主要为大家详细介绍了Java图形界面开发之简易记事本的制作方法,,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-10-10
  • 深入探究SpringBoot可以同时处理多少请求

    深入探究SpringBoot可以同时处理多少请求

    SpringBoot是一款非常流行的Java后端框架,它可以帮助开发人员快速构建高效的Web应用程序,但是,许多人对于SpringBoot能够同时处理多少请求的疑问仍然存在,在本篇文章中,我们将深入探讨这个问题,需要的朋友可以参考下
    2023-07-07
  • Java之NIO基本简介

    Java之NIO基本简介

    这篇文章主要介绍了Java之NIO基本简介,文中给大家讲到了NIO 与 BIO的比较结合实例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • springboot如何去获取前端传递的参数的实现

    springboot如何去获取前端传递的参数的实现

    这篇文章主要介绍了springboot如何去获取前端传递的参数的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-05-05

最新评论