SpringBoot整合MyBatis-Plus实现多数据源数据迁移

news2024/12/24 3:22:02

SpringBoot整合MyBatis-Plus实现多数据源数据迁移(达梦数据库、mysql)

1. 相关pom

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.6</version>
</dependency>

<dependency>
    <groupId>com.dameng</groupId>
    <artifactId>DmJdbcDriver18</artifactId>
    <version>8.1.3.140</version>
</dependency>

<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <version>8.2.0</version>
</dependency>

2. 项目结构

在这里插入图片描述

3. 数据源配置

1. 配置文件

spring:
  datasource:
    dynamic:
      #设置默认数据源
      primary: mysql 
      #严格匹配数据源,默认false。true:未匹配到数据源抛异常,false:使用默认数据源
      strict: true
      datasource: 
        mysql:
          url: jdbc:mysql://xxx:3306/xxx?characterEncoding=UTF-8&useUnicode=true&useSSL=false&tinyInt1isBit=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
          driver-class-name: com.mysql.cj.jdbc.Driver
          password: xxx
          username: root
        dm:
          url: jdbc:dm://xxx:5236/xxx
          driver-class-name: dm.jdbc.driver.DmDriver
          username: SYSDBA
          password: xxx

2. mysql数据源

@Configuration
@MapperScan(value = {"com.xxx.mysql.mapper"},
        basePackages = "com.xxx.mysql.mapper",
        sqlSessionTemplateRef  = "mysqlSqlSessionTemplate")
public class MysqlConfig {

    @Bean(name = "mysqlDSProperties")
    @ConfigurationProperties(prefix = "spring.datasource.dynamic.datasource.mysql")
    public DataSourceProperties mysqlDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean(name = "mysqlDS")
    public DataSource mysqlDataSource(@Qualifier("mysqlDSProperties") DataSourceProperties dataSourceProperties) {
        return dataSourceProperties.initializeDataSourceBuilder().build();
    }

    @Bean(name = "mysqlSqlSessionFactory")
    public SqlSessionFactory mysqlSqlSessionFactory(@Qualifier("mysqlDS") DataSource dataSource) throws Exception {
        MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/mysql/*Mapper.xml"));

        MybatisConfiguration configuration = new MybatisConfiguration();
        configuration.setMapUnderscoreToCamelCase(true);
        configuration.setDefaultEnumTypeHandler(EnumOrdinalTypeHandler.class);
        sessionFactory.setConfiguration(configuration);
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));

        sessionFactory.setPlugins(new Interceptor[]{interceptor});

        return sessionFactory.getObject();
    }

    @Bean(name = "mysqlTransactionManager")
    @Primary
    public PlatformTransactionManager mysqlTransactionManager(@Qualifier("mysqlDS") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "mysqlSqlSessionTemplate")
    public SqlSessionTemplate mysqlSqlSessionTemplate(@Qualifier("mysqlSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

注意:

在PlatformTransactionManager增加了一个 @Primary 注解,用来指定默认事务管理器。

原因:在多数据源情况下,使用mybatis-plus的公共方法saveBatch()时,会报错No qualifying bean of type ‘org.springframework.transaction.TransactionManager’ available ,公共方法saveBatch()不会指定事务管理器,使用的是默认管理器,但我在代码中没有告诉spring哪个数据源的事务管理器才是默认的,所以就一直在报错。

详见:https://blog.csdn.net/y_hai_yang/article/details/122617711

3. 达梦数据源

@Configuration
@MapperScan(value = {"com.xxx.dameng.mapper"},
        basePackages = "com.xxx.dameng.mapper",
        sqlSessionTemplateRef  = "dmSqlSessionTemplate")
public class DamengConfig {

    @Bean(name = "dmDSProperties")
    @ConfigurationProperties(prefix = "spring.datasource.dynamic.datasource.dm")
    public DataSourceProperties dmDataSourceProperties() {
        return new DataSourceProperties();
    }

    @Bean(name = "dmDS")
    public DataSource dmDataSource(@Qualifier("dmDSProperties") DataSourceProperties dataSourceProperties) {
        return dataSourceProperties.initializeDataSourceBuilder().build();
    }

    @Bean(name = "dmSqlSessionFactory")
    public SqlSessionFactory dmSqlSessionFactory(@Qualifier("dmDS") DataSource dataSource) throws Exception {
        MybatisSqlSessionFactoryBean sessionFactory = new MybatisSqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/dameng/*Mapper.xml"));

        MybatisConfiguration configuration = new MybatisConfiguration();
        configuration.setMapUnderscoreToCamelCase(true);
        configuration.setDefaultEnumTypeHandler(EnumOrdinalTypeHandler.class);
        sessionFactory.setConfiguration(configuration);
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));

        sessionFactory.setPlugins(new Interceptor[]{interceptor});

        return sessionFactory.getObject();
    }

    @Bean(name = "dmTransactionManager")
    public PlatformTransactionManager dmTransactionManager(@Qualifier("dmDS") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "dmSqlSessionTemplate")
    public SqlSessionTemplate dmSqlSessionTemplate(@Qualifier("dmSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

4. service层数据读取写入

其他代码省略…

@Service
@Slf4j
public class DmUserServiceImpl extends ServiceImpl<DmUserMapper, DmUser> implements DmUserService {

    @Autowired
    private UserService mysqlUserService;

    // 从达梦数据库获取数据
    @Override
    public List<DmUser> getUser() {
        QueryWrapper<DmUser> queryWrapper = new QueryWrapper<>();
        return baseMapper.selectList(queryWrapper);
    }

    // 从达梦数据库获取数据写入mysql
    // 事务管理器选择mysql的
    @Override
    @Transactional(transactionManager = "mysqlTransactionManager", rollbackFor = Exception.class)
    public void getUserAndWrite(DmUser user) {
        List<DmUser> dmUsers = getUser(user);
        ArrayList<Users> mysqlUsers = new ArrayList<>();
        if (CollectionUtil.isNotEmpty(dmUsers)) {
            for (DmUser dmUser : dmUsers) {
                Users mysqlUser = new Users();
                BeanUtil.copyBeanSafe(dmUser, mysqlUser);
                mysqlUsers.add(mysqlUser);
            }
        }
        if (CollectionUtil.isNotEmpty(mysqlUsers)) {
            mysqlUserService.saveBatch(mysqlUsers);
        }
    }

    // 从mysql读取数据写入达梦数据库
    // 事务管理器选择达梦的
    @Override
    @Transactional(transactionManager = "dmTransactionManager", rollbackFor = Exception.class)
    public void getUserAndWriteDm(DmUser user) {
        Users users = new Users();
        List<Users> mysqlUsers = mysqlUserService.getUsers(users);
        if (CollectionUtil.isNotEmpty(mysqlUsers)) {
            ArrayList<DmUser> dmUsers = new ArrayList<>();
            for (Users mysqlUser : mysqlUsers) {
                DmUser dmUser = new DmUser();
                BeanUtil.copyBeanSafe(mysqlUser, dmUser);
                dmUser.setId(null);
                dmUser.setName(dmUser.getName() + "ss");
                dmUsers.add(dmUser);
            }
            saveBatch(dmUsers);
        }

    }
}

5. 备注

使用dbeaver连接达梦数据库:https://eco.dameng.com/community/article/56885f5ce2c66511506f7c7968da84fe

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1988240.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【python安装离线包】

python安装离线包 一、离线包下载1.1 离线包单个下载1.2 离线包批量下载 二、离线包安装2.1 离线包单个安装2.2 离线包批量安装 一、离线包下载 目的&#xff1a;我们在工作中可能会遇到内网环境、离线环境、或者python的源无法下载三方库的情况&#xff0c;此时就得需要我们自…

Can GPT-3 Perform Statutory Reasoning?

文章目录 题目摘要相关工作SARAGPT-3 对美国法典的了解GPT-3 在对合成法规进行简单推理时遇到困难结论 题目 GPT-3 可以进行法定推理吗&#xff1f; 论文地址&#xff1a;https://arxiv.org/abs/2302.06100 摘要 法定推理是用事实和法规进行推理的任务&#xff0c;法规是立法机…

音频应用编程-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板

音频应用编程 Linux 下 ALSA 框架概述 ALSA 简介&#xff1a;ALSA 是 Advanced Linux Sound Architecture&#xff08;高级的 Linux 声音体系&#xff09;的缩写 地位与功能&#xff1a;现已成为 Linux 下的主流音频体系架构&#xff0c;提供音频和 MIDI 支持&#xff0c;替代…

无线网络工具Aircrack-ng使用大全(非常详细)零基础入门到精通,收藏这一篇就够了

Aircrack-ng是一个与802.11标准的无线网络分析有关的安全软件&#xff0c;主要功能有 网络侦测 。可以捕获无线网络数据包&#xff0c;并对其进行分析和处理&#xff0c;以便获取无线网络的关键信息和加密密钥。 数据包嗅探 。可以嗅探802.11a、802.11b、802.11g的数据。 WEP和…

腾讯云AI代码助手:智能编程的未来之窗

腾讯云AI代码助手&#xff1a;智能编程的未来之窗 智能编程的未来之窗 引言配置环境介绍腾讯云 AI 代码助手使用实例生成文档功能解释代码功能生成测试功能精准修复错误功能技术对话功能 智能编程获得的帮助与提升对腾讯云AI代码助手的建议结语 引言 今天七七给大家带来一款非常…

养老院人员定位系统组成部分包括哪些?

现代养老服务需要更高的精细化支持&#xff0c;养老院人员定位系统是一项非常重要的技术应用&#xff0c;该系统通常包括硬件设备、软件平台以及数据存储和处理模块等组成部分。 首先&#xff0c;养老院人员定位系统的核心就是硬件设备&#xff0c;一般由定位终端设备、传感器、…

逻辑数据平台,多源异构实时数据高效同步的新途径

多源异构数据库的实时数据同步&#xff0c;需要将不同来源、格式和结构的数据进行整合、清洗、转换、合并、分析&#xff0c;形成统一的、一致的视图。其中&#xff0c;数据清洗是将数据中的噪声、异常值、不一致和重复的数据去除&#xff0c;提高数据质量&#xff1b;数据整合…

正则表达式介绍与基础

正则表达式介绍与基础 首先是正则表达式的特殊符号&#xff1a; [:alnum:]代表英文大小写字母及数字 [:alpha:]代表英文大小写字母 [:blank:]代表空格和 tab 键 [:cntrl:]键盘上的控制按键&#xff0c;如 CR,LF,TAB,DEL [:digit:]代表数字 [:graph:]代表空白字符以外的其…

SpringBoot MybatisPlus selectOne的坑

目录 一、问题 二、问题解决 三、其他方法 一、问题 selectOne在查询多条数据时会报错&#xff0c;查询语句并不会加 limit 1。 One record is expected, but the query result is multiple records。 二、问题解决 在QueryWrapper上添加如下&#xff1a; QueryWrapper&…

windows11/10 如何快速的安装Halcon21.05 (包括深度学习部分)(已解决)

声明&#xff1a;Halcon21.05 是网页安装&#xff0c;不是安装包安装&#xff0c;虽然前期需要下载它的安装包。 现在开始&#xff0c;先下载安装包 halcon21版本下载连接地址&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/142qWteiIgHm6QuZVOkX_pw?pwd2tw5 提取码&…

ATA-7020高压放大器在铁电材料测试中的应用研究

铁电材料因其在电场作用下发生自发电极化的独特性质而在材料科学中备受关注。对铁电材料进行测试和研究是理解其性能和应用潜力的关键步骤之一。高压放大器在铁电测试中的应用发挥着至关重要的作用&#xff0c;为科学家们提供了精确控制和测量电场的手段。本文将深入介绍高压放…

PDF预览:利用vue3-pdf-app实现前端PDF在线展示

目录 PDF预览&#xff1a;利用vue3-pdf-app实现前端PDF在线展示 一、vue3-pdf-app组件介绍及其优点 1、vue3-pdf-app是什么 2、作用与场景 3、类似的插件 二、项目初始化与依赖安装 1、初始化Vue3项目 2、安装依赖 三、集成vue3-pdf-app插件 1、引入插件 2、配置组件…

MySQL的Bin Log与Redo Log区别

MySQL的Bin Log与Redo Log区别 1、Bin Log2、Redo Log &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 1、Bin Log 范围&#xff1a;数据库级别&#xff0c;记录所有修改操作&#xff08;不包括查询&#xff09;&#xff0c;不区分存储引擎…

大数据环境下用户数据隐私安全防护系统的设计与实现(论文+源码)_kaic

摘 要 现如今互联网已在世界范围内广泛的应用和发展&#xff0c;特别是移动互联网Web 技术快速发展&#xff0c;然而最近几年经常发生互联网用户信息泄露及财产损失问题&#xff0c;网络安全漏洞严重威胁Web应用程序安全及互联网用户的网络使用安全&#xff0c;因此现急需一…

基于springcloud+MYSQL的大学生在线学习平台的设计与实现-计算机毕业设计源码43038

摘要 本文介绍了一种基于SpringCloud和MySQL的大学生在线学习平台的设计与实现。该平台采用先进的微服务架构&#xff0c;结合SpringCloud框架的分布式特性&#xff0c;旨在提供高性能、高可用性、可伸缩性强的在线学习环境。系统后端使用MySQL数据库进行数据存储和管理&#x…

js小数相加精度不准确的解决方案

目录 一、发现问题 二、为什么会出现精度误差 三、精度误差的原因 四、如何解决精度出现误差的情况 1.使用toFixed() 2. 使用库&#xff0c;如decimal.js或bignumber.js 一、发现问题 在项目中总会出现数字需要相加的情况&#xff0c;但发现整数相加没问题&#xff0c;小数…

【实现100个unity特效之17】在unity中使用shader和ShaderGraph分别实现模糊特定层,高斯模糊效果

最终效果 Unity通过Shader来模糊场景画面 参考&#xff1a;【游戏开发小技】Unity通过UI全屏图来模糊场景画面&#xff08;Shader | 模糊 | 滤镜 | Blur&#xff09; ShaderGraph实现图片的高斯模糊 参考&#xff1a;【游戏开发实战】Unity ShaderGraph实现图片的高斯模糊效…

Cyberchef实用功能之-URL/IP地址无害化操作

网络安全领域会共享URL&#xff0c;IP&#xff0c;domain等威胁情报信息&#xff0c;尤其是在攻防演练&#xff0c;重保活动&#xff0c;护网hvv的场景及时的威胁情报共享至关重要。这些IP/domain/URL 可能来自于沙箱的报告&#xff0c;pcap的提取&#xff0c;恶意软件的提取&a…

Zabbix模板监控:MySQL性能尽在掌握,智能高效,守护数据库安全稳定!

作者简介&#xff1a;我是团团儿&#xff0c;是一名专注于云计算领域的专业创作者&#xff0c;感谢大家的关注 座右铭&#xff1a;云端筑梦&#xff0c;数据为翼&#xff0c;探索无限可能&#xff0c;引领云计算新纪元 个人主页&#xff1a;团儿.-CSDN博客 目录 前言&#xff1…

Html+CSS小米官网实例练习全部代码

跟随B站视频和GitHub的分享学习复刻小米商城网站&#xff0c;参考的网站如下所示&#xff1a; GitHub分享&#xff1a; https://github.com/0033-Vec/mishopping https://github.com/ldwwwwww/ldwwwwww.github.xiaomi https://github.com/hysmdd/xiaomi-mall B站视频&#xff…