手搭手Mybatis-Plus多数据源异构数据迁移案例

2023-10-04 13:46

本文主要是介绍手搭手Mybatis-Plus多数据源异构数据迁移案例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

环境介绍

技术栈

springboot+mybatis-plus+druid+baomidou+mysql+oracle+dm

软件

版本

mysql

8

IDEA

IntelliJ IDEA 2022.2.1

JDK

1.8

Spring Boot

2.7.13

mybatis

2.3.1

pom.xml所需依赖

<dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.2</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>3.5.0</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.14</version></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.15</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.dameng</groupId><artifactId>Dm8JdbcDriver18</artifactId><version>8.1.1.49</version></dependency><dependency><groupId>com.oracle.database.jdbc</groupId><artifactId>ojdbc8</artifactId><scope>runtime</scope></dependency>
</dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><excludes><exclude><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></exclude></excludes></configuration></plugin></plugins>
</build>

MybatisX逆向工程

逆向工程:通过数据库表接口,逆向生成java工程结构

实体类、mapper接口、mapper映射文件、Service接口、service实现类

application.yml

spring:datasource:dynamic:primary:  #设置默认的数据源或者数据源组,默认值即为masterstrict: false #严格匹配数据源,默认false. true未匹配到指定数据源时抛异常,false使用默认数据源datasource:mysql1:username: rootpassword: PWDurl: jdbc:mysql://IP:3306/mysql?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8driver-class-name: com.mysql.cj.jdbc.Driver#          driver-class-name: com.mysql.jdbc.Drivermysql2:url: jdbc:mysql://IP:3306/sys?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=UTF-8username: rootpassword: PWDdriver-class-name: com.mysql.cj.jdbc.Driveroracle:username: systempassword: PWDurl: jdbc:oracle:thin:@IP:1521:orcldriver-class-name: oracle.jdbc.driver.OracleDriver#          driver-class-name: com.mysql.jdbc.Driverdm:url: jdbc:dm://127.0.0.1:5236/demo?username: SYSDBApassword: SYSDBAdriver-class-name: dm.jdbc.driver.DmDriver#          driver-class-name: com.mysql.jdbc.Driverserver:port: 8089mybatis-plus:configuration:#输出日志log-impl: org.apache.ibatis.logging.stdout.StdOutImpl#配置映射规则map-underscore-to-camel-case: true #表示支持下划线到驼蜂的映射#隐藏mybatis图标global-config:banner: falsedb-config:logic-delete-field: statuslogic-not-delete-value: 1logic-delete-value: 0

spy.properties

#3.2.1以上使用
modulelist=com.baomidou.mybatisplus.extension.p6spy.MybatisPlusLogFactory,com.p6spy.engine.outage.P6OutageFactory
#3.2.1以下使用或者不配置
#modulelist=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory
# 自定义日志打印
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
#日志输出到控制台
appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
# 使用日志系统记录 sql
#appender=com.p6spy.engine.spy.appender.Slf4JLogger
# 设置 p6spy driver 代理
deregisterdrivers=true
# 取消JDBC URL前缀
useprefix=true
# 配置记录 Log 例外,可去掉的结果集有error,info,batch,debug,statement,commit,rollback,result,resultset.
excludecategories=info,debug,result,commit,resultset
# 日期格式
dateformat=yyyy-MM-dd HH:mm:ss
# 实际驱动可多个
#driverlist=org.h2.Driver
# 是否开启慢SQL记录
outagedetection=true
# 慢SQL记录标准 2 秒
outagedetectioninterval=2

MybatisX逆向工程只是一个便携的工具,自定义接口和实现类还是要自己写

mapper(dao层)

@Mapper
public interface UserMapper extends BaseMapper<User> {
}

@Mapper
public interface TUserMapper extends BaseMapper<TUser> {
}

@Mapper
public interface TestMapper extends BaseMapper<Test> {List<Test> selectTestAll();
}

@Mapper
public interface DmuserMapper extends BaseMapper<Dmuser> {List<Dmuser> selectDmUserAll();Integer addDmUser(Dmuser dmuser);
}

service接口层

public interface UserService extends IService<User> {
}
public interface TUserService extends IService<TUser> {
}
public interface TestService extends IService<Test> {List<Test> selectTestAll();
}
public interface DmuserService extends IService<Dmuser> {List<Dmuser> selectDmUserAll();Integer addDmUser(Dmuser dmuser);
}

mapper映射文件

<mapper namespace="com.example.mapper.UserMapper"><resultMap id="BaseResultMap" type="com.example.domain.User"><id property="id" column="id" jdbcType="VARCHAR"/><result property="name" column="name" jdbcType="VARCHAR"/><result property="age" column="age" jdbcType="INTEGER"/><result property="email" column="email" jdbcType="VARCHAR"/><result property="status" column="status" jdbcType="INTEGER"/><result property="gender" column="gender" jdbcType="INTEGER"/><result property="contact" column="contact" jdbcType="VARCHAR"/><result property="createTime" column="create_time" jdbcType="TIMESTAMP"/><result property="updateTime" column="update_time" jdbcType="TIMESTAMP"/></resultMap><sql id="Base_Column_List">id,name,age,email,status,gender,contact,create_time,update_time</sql>
</mapper>

<mapper namespace="com.example.mapper.TUserMapper"><resultMap id="BaseResultMap" type="com.example.domain.TUser"><id property="id" column="id" jdbcType="BIGINT"/><result property="name" column="name" jdbcType="VARCHAR"/><result property="age" column="age" jdbcType="INTEGER"/><result property="email" column="email" jdbcType="VARCHAR"/></resultMap><sql id="Base_Column_List">id,name,age,email</sql>
</mapper>

<mapper namespace="com.example.mapper.TestMapper"><resultMap id="BaseResultMap" type="com.example.domain.Test"><id property="id" column="id" jdbcType="DECIMAL"/><result property="name" column="name" jdbcType="VARCHAR"/></resultMap><sql id="Base_Column_List">id,name</sql><select id="selectTestAll" resultType="com.example.domain.Test">select * from "test"</select>
</mapper>

<mapper namespace="com.example.mapper.DmuserMapper"><resultMap id="BaseResultMap" type="com.example.domain.Dmuser"><id property="id" column="id" jdbcType="INTEGER"/><result property="name" column="name" jdbcType="CHAR"/><result property="address" column="address" jdbcType="CHAR"/></resultMap><sql id="Base_Column_List">id,name,address</sql><select id="selectDmUserAll" resultType="com.example.domain.Dmuser">select "id","name","address"from "SYSDBA"."DMUser";</select><insert id="addDmUser">insert into "SYSDBA"."DMUser"("id", "name", "address") VALUES(#{id},#{name},#{address});</insert>
</mapper>

serviceimpl类

@Service
@DS("mysql2")
public class UserServiceImpl extends ServiceImpl<UserMapper, User>implements UserService{
}
@Service
@DS("mysql1")
public class TUserServiceImpl extends ServiceImpl<TUserMapper, TUser>implements TUserService{
}

@Service
@DS("oracle")
public class TestServiceImpl extends ServiceImpl<TestMapper, Test>implements TestService{@Autowiredprivate TestMapper testMapper;@Overridepublic List<Test> selectTestAll() {return testMapper.selectTestAll();}
}

@Service
@DS("dm")
public class DmuserServiceImpl extends ServiceImpl<DmuserMapper, Dmuser>implements DmuserService{@Autowiredprivate DmuserMapper dmuserMapper;@Overridepublic List<Dmuser> selectDmUserAll() {return dmuserMapper.selectDmUserAll();}@Overridepublic Integer addDmUser(Dmuser dmuser) {return dmuserMapper.addDmUser(dmuser);}
}

测试类

@SpringBootTest
class DatasourcesApplicationTests {@Autowiredprivate TUserService tUserService;@Autowiredprivate UserService userService;@Autowiredprivate TestService testService;@Autowiredprivate DmuserService dmuserService;@Testvoid sys(){userService.list();}@Testvoid oracleDemo(){testService.selectTestAll();}@Testvoid dmDemo(){dmuserService.selectDmUserAll();}@Testvoid oracleToDMTest(){List<com.example.domain.Test> oracles =testService.selectTestAll();for (com.example.domain.Test oracle : oracles) {Dmuser dmuser =new Dmuser();dmuser.setId(Math.toIntExact(oracle.getId()));dmuser.setName(oracle.getName());dmuser.setAddress("null");dmuserService.addDmUser(dmuser);System.out.println(""+oracle);}}@Testvoid mysqlToDMTest(){List<TUser> mysqls =tUserService.list();for (TUser mysql : mysqls) {Dmuser dmuser =new Dmuser();dmuser.setId(Math.toIntExact(mysql.getId()));dmuser.setName(mysql.getName());dmuser.setAddress(mysql.getEmail());dmuserService.addDmUser(dmuser);System.out.println(""+mysql);}}}

Mybatis-Plus介绍

https://baomidou.com/

为简化开发而生

MyBatis-Plus(opens new window)(简称 MP)是一个 MyBatis (opens new window) 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

特性

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
  • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
  • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
  • 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
  • 内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
  • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

这篇关于手搭手Mybatis-Plus多数据源异构数据迁移案例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/2137

相关文章

慢sql提前分析预警和动态sql替换-Mybatis-SQL

《慢sql提前分析预警和动态sql替换-Mybatis-SQL》为防止慢SQL问题而开发的MyBatis组件,该组件能够在开发、测试阶段自动分析SQL语句,并在出现慢SQL问题时通过Ducc配置实现动... 目录背景解决思路开源方案调研设计方案详细设计使用方法1、引入依赖jar包2、配置组件XML3、核心配

Java注解之超越Javadoc的元数据利器详解

《Java注解之超越Javadoc的元数据利器详解》本文将深入探讨Java注解的定义、类型、内置注解、自定义注解、保留策略、实际应用场景及最佳实践,无论是初学者还是资深开发者,都能通过本文了解如何利用... 目录什么是注解?注解的类型内置注编程解自定义注解注解的保留策略实际用例最佳实践总结在 Java 编程

一文教你Python如何快速精准抓取网页数据

《一文教你Python如何快速精准抓取网页数据》这篇文章主要为大家详细介绍了如何利用Python实现快速精准抓取网页数据,文中的示例代码简洁易懂,具有一定的借鉴价值,有需要的小伙伴可以了解下... 目录1. 准备工作2. 基础爬虫实现3. 高级功能扩展3.1 抓取文章详情3.2 保存数据到文件4. 完整示例

使用Java将各种数据写入Excel表格的操作示例

《使用Java将各种数据写入Excel表格的操作示例》在数据处理与管理领域,Excel凭借其强大的功能和广泛的应用,成为了数据存储与展示的重要工具,在Java开发过程中,常常需要将不同类型的数据,本文... 目录前言安装免费Java库1. 写入文本、或数值到 Excel单元格2. 写入数组到 Excel表格

MyBatis模糊查询报错:ParserException: not supported.pos 问题解决

《MyBatis模糊查询报错:ParserException:notsupported.pos问题解决》本文主要介绍了MyBatis模糊查询报错:ParserException:notsuppo... 目录问题描述问题根源错误SQL解析逻辑深层原因分析三种解决方案方案一:使用CONCAT函数(推荐)方案二:

python处理带有时区的日期和时间数据

《python处理带有时区的日期和时间数据》这篇文章主要为大家详细介绍了如何在Python中使用pytz库处理时区信息,包括获取当前UTC时间,转换为特定时区等,有需要的小伙伴可以参考一下... 目录时区基本信息python datetime使用timezonepandas处理时区数据知识延展时区基本信息

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

Java Stream流使用案例深入详解

《JavaStream流使用案例深入详解》:本文主要介绍JavaStream流使用案例详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录前言1. Lambda1.1 语法1.2 没参数只有一条语句或者多条语句1.3 一个参数只有一条语句或者多

MySQL 中的 JSON 查询案例详解

《MySQL中的JSON查询案例详解》:本文主要介绍MySQL的JSON查询的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录mysql 的 jsON 路径格式基本结构路径组件详解特殊语法元素实际示例简单路径复杂路径简写操作符注意MySQL 的 J