基于springboot+mybatisPlus,对两个不同服务器上的数据库中的数据进行CRUD,我自己使用的两个都是mysql数据库;db1为我自己的本地库,db2为阿里云服务器上的库,首先我们创建两张表;

在db1库中创建user表,建表语句如下:

CREATE TABLE `user` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(64) DEFAULT NULL,`age` tinyint(2) DEFAULT NULL,`sex` tinyint(1) DEFAULT NULL COMMENT '0:女 1:男',PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

然后在db2库中创建product表,建表语句如下:

CREATE TABLE `product` (`id` int(10) NOT NULL,`phone` bigint(11) DEFAULT NULL,`address` varchar(64) DEFAULT NULL,`email` varchar(32) DEFAULT NULL,`birth` date DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

创建完成后,新建一个springboot项目,创建好后导入Mybatis Plus Generator和mysql依赖

     <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.4.1</version></dependency><dependency><groupId>org.apache.velocity</groupId><artifactId>velocity</artifactId><version>1.7</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.25</version></dependency>

除了导入 mybatis-plus-generator依赖外,还需要导入velocity模板,因为MP是按照这个模板来生成代码的。接着新建一个Generator类来生成我们所需要的文件:

public class Generator {public static void main(String[] args) {//1.创建generator对象AutoGenerator autoGenerator = new AutoGenerator();//2.配置数据源db1DataSourceConfig dataSourceConfig = new DataSourceConfig();dataSourceConfig.setDbType(DbType.MYSQL); //数据源类型为mysqldataSourceConfig.setUrl("jdbc:mysql://localhost:3306/db1?useSSL=false&useUnicode=true&characterEncoding=utf-8");dataSourceConfig.setUsername("root");dataSourceConfig.setPassword("密码");dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver");//配置数据源db2 ,dataSourceConfig.setDbType(DbType.MYSQL); //数据源类型为mysqldataSourceConfig.setUrl("jdbc:mysql://8.142.139.26:3306/db2?useSSL=false&useUnicode=true&characterEncoding=utf-8");dataSourceConfig.setUsername("用户名");dataSourceConfig.setPassword("你的密码");dataSourceConfig.setDriverName("com.mysql.cj.jdbc.Driver");autoGenerator.setDataSource(dataSourceConfig);//3.全局配置(指明这些类生成的具体位置以及作者....)GlobalConfig globalConfig = new GlobalConfig();//这里填写要成的位置globalConfig.setOutputDir("D:\\javaProject\\sprng2db"+"/src/main/java");globalConfig.setOpen(false);//不打开文件globalConfig.setAuthor("gaoyj");//让service名字前面没有IglobalConfig.setServiceName("%Service");autoGenerator.setGlobalConfig(globalConfig);//4.设置包信息(生成的类放在哪个包里面)PackageConfig packageConfig = new PackageConfig();packageConfig.setParent("com.solongyj");packageConfig.setModuleName("generator");packageConfig.setController("controller");packageConfig.setService("service");packageConfig.setServiceImpl("service.impl");packageConfig.setEntity("entity");autoGenerator.setPackageInfo(packageConfig);//5.配置策略StrategyConfig strategyConfig = new StrategyConfig();//提供lombokstrategyConfig.setEntityLombokModel(true);//支持驼峰strategyConfig.setNaming(NamingStrategy.underline_to_camel);strategyConfig.setColumnNaming(NamingStrategy.underline_to_camel);autoGenerator.setStrategy(strategyConfig);//6.执行autoGenerator.execute();}

先执行db1,然后把数据库配置修改为db2的内容,再操作一次,执行完毕后结构如下:

然后是两个数据源的配置类,db1的配置类代码如下:

@Configuration
@MapperScan(basePackages = "com.solongyj.demo.mapper.db1", sqlSessionTemplateRef  = "db1SqlSessionTemplate")
public class DataSourceDb1config {/*** 获取映射文件所在的路径*/@Value("${mybatis.db1.mapper-locations}")private String db1tMapperPath;/*** 数据源加载** @return*/@Bean(name = "db1DataSource")@ConfigurationProperties(prefix = "spring.datasource.db1.druid")public DataSource test1DataSource() {return DataSourceBuilder.create().build();}/*** 注入SqlSessionFactory,指定数据源和映射文件路径** @param dataSource* @return* @throws Exception*/@Bean(name = "db1SqlSessionFactory")public SqlSessionFactory testSqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource) throws Exception {MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();bean.setDataSource(dataSource);Resource[] resources = new PathMatchingResourcePatternResolver().getResources(db1tMapperPath);bean.setMapperLocations(resources);return bean.getObject();}/*** 注入DataSourceTransactionManager事物管理器** @param dataSource* @return*/@Bean(name = "db1TransactionManager")public DataSourceTransactionManager testTransactionManager(@Qualifier("db1DataSource") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}/*** @param sqlSessionFactory* @return* @throws Exception*/@Bean(name = "db1SqlSessionTemplate")public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {return new SqlSessionTemplate(sqlSessionFactory);}
}

db2配置类代码:

@Configuration
@MapperScan(basePackages = "com.solongyj.demo.mapper.db2", sqlSessionTemplateRef = "db2SqlSessionTemplate")
public class DataSourceDb2Config {/*** 获取映射文件所在的路径*/@Value("${mybatis.db2.mapper-locations}")private String db2tMapperPath;/*** 数据源加载** @return*/@Bean(name = "db2DataSource")@ConfigurationProperties(prefix = "spring.datasource.db2.druid")public DataSource test1DataSource() {return DataSourceBuilder.create().build();}/*** 注入SqlSessionFactory,指定数据源和映射文件路径** @param dataSource* @return* @throws Exception*/@Bean(name = "db2SqlSessionFactory")public SqlSessionFactory testSqlSessionFactory(@Qualifier("db2DataSource") DataSource dataSource) throws Exception {MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();bean.setDataSource(dataSource);Resource[] resources = new PathMatchingResourcePatternResolver().getResources(db2tMapperPath);bean.setMapperLocations(resources);return bean.getObject();}/*** 注入DataSourceTransactionManager事物管理器** @param dataSource* @return*/
//    @Bean(name = "db2TransactionManager")public DataSourceTransactionManager testTransactionManager(@Qualifier("db2DataSource") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}/*** @param sqlSessionFactory* @return* @throws Exception*/@Bean(name = "db2SqlSessionTemplate")public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("db2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {return new SqlSessionTemplate(sqlSessionFactory);}

application.yml中配置

server:port: 8089
#配置数据源,db1&db2
spring:datasource:db1:druid:driver-class-name: com.mysql.cj.jdbc.Driverjdbc-url: jdbc:mysql://localhost:3306/db1?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=trueusername: rootpassword: rootdb2:druid:driver-class-name: com.mysql.cj.jdbc.Driverjdbc-url: jdbc:mysql://ip:port/db2?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=trueusername: 你的用户名password: 你的密码# xml文件映射路径
mybatis:db1:mapper-locations: classpath:mapper/db1/*.xmldb2:mapper-locations: classpath:mapper/db2/*.xmllogging:level:com.solongyj.demo: debug

配置完成后进行一个简单的测试,在user表数据插入成功后再执行product表数据的插入

@Service
@Slf4j
@Transactional(rollbackFor = Exception.class)
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {@Autowiredprivate UserMapper userMapper;@Autowiredprivate ProductMapper productMapper;@Overridepublic void addUser(User user) {log.info("db1数据开始插入");int userRow = userMapper.insert(user);//这里在插入user成功后进行db2中的product的插入,这些数据全都随机生成if (userRow != 0) {log.info("db1数据插入成功");Product product = new Product();product.setPhone(RandomUtil.getPhone());product.setAddress(RandomUtil.getAddress());product.setEmail(RandomUtil.getEmail(6, 9));product.setBirth(new Date());log.info("db2数据开始插入");int prodRow = productMapper.insert(product);if (prodRow != 0) {log.info("db1和db2数据插入成功");}}}
}

其中user数据我们以json格式传进来,product数据我写了一个随机生成中文姓名,性别,Email,手机号,住址的工具类,其代码如下:

/*** 随机生成中文姓名,性别,Email,手机号,住址** @author solongyj* @date 2022/3/29*/
public class RandomUtil {public static String base = "abcdefghijklmnopqrstuvwxyz0123456789";private static String firstName = "赵钱孙李周吴郑王冯陈褚卫蒋沈韩杨朱秦尤许何吕施张孔曹严华金魏陶姜戚谢邹郜喻柏水窦章云苏潘葛奚范彭郎鲁韦昌马苗凤花方俞任袁柳酆鲍史唐费廉岑薛雷贺倪汤滕殷罗毕郝邬安常乐于时傅皮卞齐康伍余元卜顾孟平黄和穆萧尹姚邵湛汪祁毛禹狄米贝明臧计伏成戴谈宋茅庞熊纪舒屈项祝董梁杜阮蓝闵席季麻强贾路娄危江童颜郭梅盛林刁钟徐邱骆高夏蔡田樊胡凌霍虞万支柯咎管卢莫经房裘缪干解应宗宣丁贲邓郁单杭洪包诸左石崔吉钮龚程嵇邢滑裴陆荣翁荀";private static String girl = "珍贞莉桂娣叶璧璐娅琦晶妍茜秋珊莎锦黛青倩婷姣婉娴瑾颖露瑶怡婵雁蓓纨仪荷丹蓉眉君琴蕊薇姬舒影荔枝思丽 ";private static String boy = "杰彦涛昌强成康星光天达安岩中茂进林有坚和彪博诚先敬震振壮会思群豪心邦承乐绍功松善厚庆磊民友裕河哲江超浩亮政谦亨奇固之轮翰朗伯宏言若鸣朋斌梁栋维启克伦翔旭鹏泽晨辰士以建家致树炎德行时泰盛雄琛钧冠策腾楠榕风航弘";private static String[] address = "北京路,南京路,上海路,郑州路,杭州路,福州路,兰州路,哈尔滨路,长春路,沈阳路,成都路,重庆路,济南路,西安路,银川路,太原路,合肥路,南昌路,广州路,海南路,台北路,贵州路,昆明路".split(",");private static final String[] email_suffix = "@gmail.com,@qq.com,@163.com,@sina.com,@sohu.com".split(",");public static int getNum(int start, int end) {return (int) (Math.random() * (end - start + 1) + start);}/*** 返回Email** @param lMin 最小长度* @param lMax 最大长度* @return*/public static String getEmail(int lMin, int lMax) {int length = getNum(lMin, lMax);StringBuffer sb = new StringBuffer();for (int i = 0; i < length; i++) {int number = (int) (Math.random() * base.length());sb.append(base.charAt(number));}sb.append(email_suffix[(int) (Math.random() * email_suffix.length)]);return sb.toString();}/*** 返回手机号码*/private static String[] telFirst = "135,136,138,139,150,151,152,159,156,133,153".split(",");public static Long getPhone() {int index = getNum(0, telFirst.length - 1);String first = telFirst[index];String second = String.valueOf(getNum(1, 888) + 10000).substring(1);String third = String.valueOf(getNum(1, 9100) + 10000).substring(1);return Long.valueOf(first + second + third);}/*** 返回中文姓名*/private static String name_sex = "";public static String getChineseName() {int index = getNum(0, firstName.length() - 1);String first = firstName.substring(index, index + 1);int sex = getNum(0, 1);String str = boy;int length = boy.length();if (sex == 0) {str = girl;length = girl.length();name_sex = "女";} else {name_sex = "男";}index = getNum(0, length - 1);String second = str.substring(index, index + 1);int hasThird = getNum(0, 1);String third = "";if (hasThird == 1) {index = getNum(0, length - 1);third = str.substring(index, index + 1);}return first + second + third;}/*** 返回地址** @return*/public static String getAddress() {int index = getNum(0, address.length - 1);String first = address[index];String second = String.valueOf(getNum(11, 150)) + "号";String third = "-" + getNum(1, 20) + "-" + getNum(1, 10);return first + second + third;}}

总体结构如下图

在controller层调用UserService的addUser方法,然后启动该项目,因为配置的端口号是8089,所以在测试时地址为http://localhost:8089/addUser

如图

经测试,db1和db2都可以成功插入数据。

以上就是关于java对两个不同服务器上的数据库中的数据进行的简单的数据新增,同理,三个以及多个数据源操作也可按照该方法进行配置;

代码我已上传到gitee,感兴趣的小伙伴可以看一看:https://gitee.com/solongyj/spring2db.git

java项目配置双数据源,对两个不同服务器上的数据库中的数据进行CRUD相关推荐

  1. 使用两个dateTimePicker 根据日期区间查询数据库中的数据

    数据库中的数据形式为XXXX年XX月XX日 1.在数据库中创建一个提取数字的方法: IF OBJECT_ID('DBO.GET_NUMBER') IS NOT NULL DROP FUNCTION D ...

  2. maven java项目 配置双数据库(多数据库配置)

    前言 为什么要配置双数据库或者多数据库. 当你需要从两个或多个数据库进行获取数据库表的数据或者插入数据,每个数据库的数据库驱动(driver),url路径,用户名(username).密码(passw ...

  3. java项目配置多数据源

    有些web应用需要连接多个数据源,本文讲解一下如何使用多个数据源,大题思路是这样的,系统启动的时候创建多个数据源,然后具体执行sql的时候去切换数据源执行对应的sql.如何切换数据源呢?spring提 ...

  4. SSM项目_配置双数据源

    近日项目中因为涉及到一个需求是A系统某表的数据要与B系统的某表数据在数据上出现不一致的情况,需要做一个数据比对功能,这时候就涉及到两个系统的数据库的数据比对. 方案一,将A系统的数据导出到Excel文 ...

  5. mybatis多数据源配置_随笔:springboot+mybatis 配置双数据源

    山石彦 | 作者 urlify.cn/vQzIne | 来源 最近工作中有用到双数据源,一个项目(中台)中需要操作两个不同的数据库.当时考虑到了两种方式, 1.通过http请求访问(A项目访问d1数据 ...

  6. SpringMVC+Mybatis+Maven搭建 简单配置双数据源

    POM.xml引包常用的 mybatis  以及 mybatis-spting  spring-webmvc log4j spring-jdbc servler-api spring-jdbc < ...

  7. java项目打jar包的两种情况

    java项目打jar包的两种情况 本文介绍一下java项目打jar包时的两种情况各怎么操作 方法/步骤 1.  1 一.java项目没有导入第三方jar包 这时候打包就比较简单: 1.  首先在Ecl ...

  8. SpringBoot+SpringDataJpa配置双数据源SqlServer和Mysql

    有时候项目中会遇到需要配置双数据源的情况,到SpringBoot2.0版本后和之前配置双数据源的方法有些区别,这里我用的SpringBoot版本是2.0.3,废话不多说,给出主要步骤: 一.项目依赖p ...

  9. bpmn 文件 服务器部署,Java项目activiti BpmnModel生成的流程图,部署服务器乱码问题...

    Java项目activiti BpmnModel生成的流程图,部署服务器乱码问题 Java项目activiti BpmnModel生成的流程图,部署服务器乱码问题 项目中需要前端查看流程的情况,所以需 ...

  10. eclipse给mysql修改表数据_Eclipse中java向数据库中添加数据,更新数据,删除数据...

    ASP.NET网页动态添加.更新或删除数据行 看过此篇 http://www.cnblogs.com/insus/p/3247935.html的网友,也许明白Insus.NET是怎样实现动态添加数据行 ...

最新文章

  1. gridview的buttonfield获取该行的索引值(实例讲解)
  2. Firebug 1.7正式版发布,支持Firefox 4
  3. ASP.NET MEMBERSHIP的XML配置
  4. H.264将普及 视频编码讲坛之H.264前世今生
  5. java. tcp. 权限,java - tcpdump的不能够写PCAP文件。没有权限 - SO中文参考 - www.soinside.com...
  6. MATLAB图像拼接算法及实现(一)
  7. Sketch 56.2 Mac中文版
  8. python词云图输出(附代码)
  9. 跳频技术——学习总结(一)
  10. Spring源码解析一 (IOC容器初始化深度解析)
  11. 怎样查网站的排名和收录情况
  12. 学习EBS建议有的知识
  13. 用不可逆算法MD5进行加密后,如何进行登录验证
  14. Echarts使用及动态加载图表数据 折线图X轴数据动态加载
  15. 机器学习HW10对抗性攻击
  16. 那些年啊,那些事——一个程序员的奋斗史 ——114
  17. android获取网卡ip地址吗,Native.js获取android有线网络IP地址
  18. 利用faac进行编码
  19. lazarus视频控件linux,开源软件之Lazarus:国产操作系统下写个跨平台截屏录屏软件...
  20. 谷歌adwords教程_6种增加Google AdWords转化率的方法

热门文章

  1. 什么是BLOB URL,为什么要使用它?
  2. 搜狗AI走向产业改造:纵横捭阖术与录音笔的新声态
  3. 信号与系统学习小窍门
  4. ddr3ddr4 lpddr4速率_Ddr2,ddr3,ddr4内存条的读写速率
  5. Lambda拉姆达表达式使用学习
  6. PHP编译安装常见错误解决
  7. 研究生阶段如何学习、做研究(超棒)
  8. 【魔兽世界插件】魔兽世界插件实战笔记从入门到放弃的心理历程 第四节 窗体的移动
  9. 基于java的志愿信息管理系统_基于jsp的志愿者管理系统-JavaEE实现志愿者管理系统 - java项目源码...
  10. [ffmpeg][goav][issues] goav Dictionary crash double free