使用mybatis和dynamic-datasource-spring-boot-starter动态切换数据源操作数据库

这篇具有很好参考价值的文章主要介绍了使用mybatis和dynamic-datasource-spring-boot-starter动态切换数据源操作数据库。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

记录:415

场景:使用mybatis和dynamic-datasource-spring-boot-starter动态切换数据源操作数据库。

版本:JDK 1.8,Spring Boot 2.6.3,dynamic-datasource-spring-boot-starter-3.3.2,mybatis-3.5.9。

源码:https://github.com/baomidou/dynamic-datasource-spring-boot-starter

dynamic-datasource-spring-boot-starter:一个基于springboot的快速集成多数据源的启动器。

1.动态数据源注解@DS作用在类上

1.1GetDataMapper接口和XML

1.1.1GetDataMapper接口

@DS("hub_a_db")
@Repository
public interface GetDataMapper {
  List<Map<String, Object>> getData(List<Long> paraList);
}

1.1.2GetDataMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hub.example.load.mapper.GetDataMapper">
  <select id="getData" resultType="java.util.Map">
    select CITY_ID AS "cityId",
    CITY_NAME AS "cityName",
    LAND_AREA AS "landArea",
    POPULATION AS "population",
    GROSS AS "gross",
    CITY_DESCRIBE AS "cityDescribe",
    DATA_YEAR AS "dataYear",
    UPDATE_TIME AS "updateTime"
    from t_city
    WHERE CITY_ID IN
    <foreach collection="list" item="cityId" open="(" separator="," close=")">
        #{cityId}
    </foreach>
  </select>
</mapper>

1.2InsertDataMapper接口和XML

1.2.1InsertDataMapper接口

@DS("hub_b_db")
@Repository
public interface InsertDataMapper {
  void insertData(List<Map<String, Object>> data);
}

1.2.2InsertDataMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hub.example.load.mapper.InsertDataMapper">
  <insert id="insertData" parameterType="java.util.List">
    insert into t_city_01 (CITY_ID,
    CITY_NAME,
    LAND_AREA,
    POPULATION,
    GROSS,
    CITY_DESCRIBE,
    DATA_YEAR,
    UPDATE_TIME)
    values
    <foreach collection="list" item="city" open="" separator="," close="">
        (#{city.cityId},
        #{city.cityName},
        #{city.landArea},
        #{city.population},
        #{city.gross},
        #{city.cityDescribe},
        #{city.dataYear},
        #{city.updateTime})
    </foreach>
  </insert>
</mapper>

2.动态数据源注解@DS作用在方法

2.1GetAndInsertDataMapper接口

@Repository
public interface GetAndInsertDataMapper {
  @DS("hub_a_db")
  List<Map<String, Object>> getData(List<Long> paraList);
  @DS("hub_b_db")
  void insertData(List<Map<String, Object>> data);
}

2.2GetAndInsertDataMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hub.example.load.mapper.GetAndInsertDataMapper">
  <select id="getData" resultType="java.util.Map">
      select CITY_ID AS "cityId",
      CITY_NAME AS "cityName",
      LAND_AREA AS "landArea",
      POPULATION AS "population",
      GROSS AS "gross",
      CITY_DESCRIBE AS "cityDescribe",
      DATA_YEAR AS "dataYear",
      UPDATE_TIME AS "updateTime"
      from t_city
      WHERE CITY_ID IN
      <foreach collection="list" item="cityId" open="(" separator="," close=")">
          #{cityId}
      </foreach>
  </select>
  <insert id="insertData" parameterType="java.util.List">
      insert into t_city_01 (CITY_ID,
      CITY_NAME,
      LAND_AREA,
      POPULATION,
      GROSS,
      CITY_DESCRIBE,
      DATA_YEAR,
      UPDATE_TIME)
      values
      <foreach collection="list" item="city" open="" separator="," close="">
          (#{city.cityId},
          #{city.cityName},
          #{city.landArea},
          #{city.population},
          #{city.gross},
          #{city.cityDescribe},
          #{city.dataYear},
          #{city.updateTime})
      </foreach>
  </insert>
</mapper>

3.使用DynamicDataSourceContextHolder操作动态数据源

不使用注解,在调用时,使用DynamicDataSourceContextHolder操作动态数据源。

3.1GetAndInsertDataByHolderMapper接口

@Repository
public interface GetAndInsertDataByHolderMapper {
  @DS("hub_a_db")
  List<Map<String, Object>> getData(List<Long> paraList);
  @DS("hub_b_db")
  void insertData(List<Map<String, Object>> data);
}

3.2GetAndInsertDataByHolderMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.hub.example.load.mapper.GetAndInsertDataByHolderMapper">
  <select id="getData" resultType="java.util.Map">
      select CITY_ID AS "cityId",
      CITY_NAME AS "cityName",
      LAND_AREA AS "landArea",
      POPULATION AS "population",
      GROSS AS "gross",
      CITY_DESCRIBE AS "cityDescribe",
      DATA_YEAR AS "dataYear",
      UPDATE_TIME AS "updateTime"
      from t_city
      WHERE CITY_ID IN
      <foreach collection="list" item="cityId" open="(" separator="," close=")">
          #{cityId}
      </foreach>
  </select>
  <insert id="insertData" parameterType="java.util.List">
      insert into t_city_01 (CITY_ID,
      CITY_NAME,
      LAND_AREA,
      POPULATION,
      GROSS,
      CITY_DESCRIBE,
      DATA_YEAR,
      UPDATE_TIME)
      values
      <foreach collection="list" item="city" open="" separator="," close="">
          (#{city.cityId},
          #{city.cityName},
          #{city.landArea},
          #{city.population},
          #{city.gross},
          #{city.cityDescribe},
          #{city.dataYear},
          #{city.updateTime})
      </foreach>
  </insert>
</mapper>

4.测试类

4.1测试类

@Slf4j
@RestController
@RequestMapping("/hub/example/load01")
public class LoadController {
  @Autowired
  private GetDataMapper getDataMapper;
  @Autowired
  private InsertDataMapper insertDataMapper;
  @Autowired
  private GetAndInsertDataMapper getAndInsertDataMapper;
  @Autowired
  private GetAndInsertDataByHolderMapper getAndInsertDataByHolderMapper;
  /**
   * 1.动态数据源注解@DS作用在类上
   * */
  @GetMapping("/load01")
  public Object load01() {
    log.info("测试开始...");
    List<Long> paraList =  Arrays.asList(1L,2L,3L);
    List<Map<String, Object>> data = getDataMapper.getData(paraList);
    insertDataMapper.insertData(data);
    log.info("测试结束...");
    return "执行成功";
  }
  /**
   * 2.动态数据源注解@DS作用在方法上
   * */
  @GetMapping("/load02")
  public Object load02() {
    log.info("测试开始...");
    List<Long> paraList =  Arrays.asList(1L,2L,3L);
    List<Map<String, Object>> data = getAndInsertDataMapper.getData(paraList);
    getAndInsertDataMapper.insertData(data);
    log.info("测试结束...");
    return "执行成功";
  }
  /**
   * 3.使用DynamicDataSourceContextHolder操作动态数据源
   * */
  @GetMapping("/load03")
  public Object load03() {
    log.info("测试开始...");
    //1.使用hub_a_db数据源读数据
    DynamicDataSourceContextHolder.push("hub_a_db");
    List<Long> paraList =  Arrays.asList(1L,2L,3L);
    List<Map<String, Object>> data = getAndInsertDataByHolderMapper.getData(paraList);
    //2.使用hub_b_db数据源写数据
    DynamicDataSourceContextHolder.poll();
    DynamicDataSourceContextHolder.push("hub_b_db");
    getAndInsertDataByHolderMapper.insertData(data);
    log.info("测试结束...");
    return "执行成功";
  }
}

5.基础配置

5.1配置动态数据源

spring:
  jackson:
    time-zone: GMT+8
  datasource:
    dynamic:
      primary: hub_a_db
      strict: false
      datasource:
        hub_a_db:
          url: jdbc:mysql://127.0.0.1:3306/hub_a_db
          username: hub_a
          password: 12345678
          driver-class-name: com.mysql.cj.jdbc.Driver
        hub_b_db:
          url: jdbc:mysql://127.0.0.1:3306/hub_b_db
          username: hub_b
          password: 12345678
          driver-class-name: com.mysql.cj.jdbc.Driver
mybatis:
  mapper-locations: classpath*:mapper/**/*.xml
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

5.2动态数据源依赖包

<dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
  <version>3.3.2</version>
</dependency>

5.3建表语句

CREATE TABLE t_city (
  CITY_ID BIGINT(16) NOT NULL COMMENT '唯一标识',
  CITY_NAME VARCHAR(64) COLLATE utf8_bin NOT NULL COMMENT '城市名',
  LAND_AREA DOUBLE DEFAULT NULL COMMENT '城市面积',
  POPULATION BIGINT(16) DEFAULT NULL COMMENT '城市人口',
  GROSS DOUBLE DEFAULT NULL COMMENT '生产总值',
  CITY_DESCRIBE VARCHAR(512) COLLATE utf8_bin DEFAULT NULL COMMENT '城市描述',
  DATA_YEAR VARCHAR(16) COLLATE utf8_bin DEFAULT NULL COMMENT '数据年份',
  UPDATE_TIME DATETIME DEFAULT NULL COMMENT '更新时间'
) ENGINE=INNODB DEFAULT CHARSET=utf8 COLLATE=utf8_bin COMMENT='城市信息表';

以上,感谢。

2023年4月18日文章来源地址https://www.toymoban.com/news/detail-417932.html

到了这里,关于使用mybatis和dynamic-datasource-spring-boot-starter动态切换数据源操作数据库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 苞米豆的多数据源 → dynamic-datasource-spring-boot-starter,挺香的!

    2023年元旦,我妈又开始了对我的念叨 妈:你到底想多少岁结婚 我:60 妈:60,你想找个多大的 我:找个55的啊,她55我60,结婚都有退休金,不用上班不用生孩子,不用买车买房,成天就是玩儿 我:而且一结婚就是白头偕老,多好 我妈直接一大嘴巴子呼我脸上 最近接到一个

    2023年04月21日
    浏览(43)
  • spring boot mybatis-plus dynamic-datasource 配置文件 相关依赖环境配置

    spring boot mybatis-plus dynamic-datasource 配置文件 相关依赖环境配置 ##yaml配置 ##父级pom.xml配置 ##子模块pom.xml配置 ##表结构 ##Test.java ##TestMapper.xml ##TestMapper.java ##TestService.java ##TestController ##项目启动类BootStrap.java ##浏览器访问 192.168.3.188:8866/yym/test/v1/test

    2024年02月02日
    浏览(44)
  • Dynamic DataSource 多数据源配置【 Springboot + DataSource + MyBatis Plus + Druid】

    MybatisPlus多数据源配置主要解决的是多数据库连接和切换的问题。在一些大型应用中,由于数据量的增长或者业务模块的增多,可能需要访问多个数据库。这时,就需要配置多个数据源。 2.1.1、引用依赖 2.1.2、application.yml 配置 2.1.3、通用配置类 2.1.4、使用方式 这里便不过多的

    2024年02月03日
    浏览(48)
  • Springboot+mybatis-plus+dynamic-datasource+Druid 多数据源 分布式事务

    背景 处理多数据源事务一直是一个复杂而棘手的问题,通常我们有两种主流的解决方法。 第一种是通过Atomikos手动创建多数据源事务,这种方法更适合数据源数量较少,参数配置不复杂,对性能要求不高的项目。然而,这种方法的最大困难在于需要手动配置大量设置,这可能

    2024年02月11日
    浏览(40)
  • springboot dynamic-datasource 实现动态切换数据源-多租户-配置文件切换-基于dynamic-datasource

    1、实现动态切换数据源 2、实现配置多数据源 3、实现读写分离也可以用多数据源方式 4、选择 dynamic-datasource集成了很多ORM的框架,其中,使用比较多的是druid,但有一些东西开始收费了 druid也可以自行配置,配置多了点 目前版本只支持单一位置加载数据源(只能从配置文件或

    2024年02月09日
    浏览(56)
  • dynamic-datasource can not find primary datasource

    动态数据源找不到主数据源 可能导入多数据源依赖导致 把依赖注释 运行成功

    2024年02月08日
    浏览(45)
  • 微服务springcloud启动报错:com.baomidou.dynamic.datasource.exception.CannotFindDaataSourceException: dynamic

    原因:编码不一致导致的 解决办法:如下图所示,进行相应设置就行  

    2024年01月25日
    浏览(46)
  • Springboot+dynamic-datasource+Druid数据库配置加密

    Springboot+mybatis-plus+dynamic-datasource+Druid数据库配置加密 背景 生产环境中, 为了保密,我们希望将数据库密码加密, 甚至用户名和jdbc连接串加密。本章我们使用由苞米豆(baomidou)团队开发的 dynamic-datasource 多数据源组件自带的加密工具实现数据库配置加密 从 dynamic-datasource-star

    2024年02月04日
    浏览(43)
  • 【源码解析】多数据源 dynamic-datasource快速入门及源码解析

    启动的时候,会加载在 dynamic-datasource-spring-boot-starter 的jar包中的 spring.factories 在 DynamicDataSourceAutoConfiguration 会注入 DynamicRoutingDataSource DynamicRoutingDataSource#afterPropertiesSet ,系统启动的时候会加载所有的数据源 在 DynamicDataSourceAutoConfiguration 会注入 DynamicDataSourceProvider AbstractData

    2023年04月21日
    浏览(60)
  • shardingsphere5.x整合springboot+dynamic-datasource多数据源实战

    本文是在springboot整合分库分表的基础上添加了多数据源,建议先看上一篇shardingsphere5.x整合springboot分库分表实战_任人人人呢的博客-CSDN博客 pom.xml配置: yml配置: 添加多数据源配置类: 添加多数据源常量类: Mapper文件

    2024年02月13日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包