Spring Boot整合Mybatis配置多数据源

Spring Boot 专栏:https://blog.csdn.net/dkbnull/category_9278145.html
Spring Cloud 专栏:https://blog.csdn.net/dkbnull/category_9287932.html
GitHub:https://github.com/dkbnull/SpringBootDemo
Gitee:https://gitee.com/dkbnull/SpringBootDemo

多数据源即动态数据源,随着项目开发逐渐扩大,单个数据源、单一数据源已经无法满足需求项目的支撑需求。

或是单一数据库无法承载大数据量的访问,需使用多个数据库进行数据的读写分离;

或是某些特殊业务需求,需操作不同的数据库。

在 Spring Boot整合MyBatis连接数据库 文章中,展示了Spring Boot整合MyBatis连接数据库的方法,基于此,Spring Boot 整合MyBatis 配置多数据源。

0 开发环境

  • JDK:1.8
  • Spring Boot:2.1.1.RELEASE
  • MySQL:5.7.13

1 引入依赖

<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.2</version>
</dependency>
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version><scope>runtime</scope>
</dependency><!--lombok-->
<dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.30</version><scope>provided</scope>
</dependency>

2 引入数据源

server:port: 8090
spring:datasource:master:jdbc-url: jdbc:mysql://127.0.0.1:3306/test_master?characterEncoding=utf8&serverTimezone=GMT%2B8username: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driverslave:jdbc-url: jdbc:mysql://127.0.0.1:3306/test_slave?characterEncoding=utf8&serverTimezone=GMT%2B8username: rootpassword: rootdriver-class-name: com.mysql.cj.jdbc.Driver
#
mybatis:mapper-locations: classpath:mapper/**/*.xmltype-aliases-package: cn.wbnull.springbootdemo.entity

该配置方式下,需要操作的两个数据库的Mapper需放置在不同文件夹下,如下图所示:
在这里插入图片描述

3 配置master库的源连接

@Configuration
@MapperScan(basePackages = "cn.wbnull.springbootdemo.mapper.master", sqlSessionFactoryRef = "masterSqlSessionFactory")
public class MasterDataSourceConfig {@Primary@Bean("masterDataSource")@ConfigurationProperties(prefix = "spring.datasource.master")public DataSource masterDataSource() {return DataSourceBuilder.create().build();}@Primary@Bean("masterDataSourceTransactionManager")public DataSourceTransactionManager masterDataSourceTransactionManager(@Qualifier("masterDataSource") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}@Primary@Bean("masterSqlSessionFactory")public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception {SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();sqlSessionFactory.setDataSource(dataSource);Resource[] resources = new PathMatchingResourcePatternResolver().getResources("classpath:mapper/master/*.xml");sqlSessionFactory.setMapperLocations(resources);return sqlSessionFactory.getObject();}
}

4 配置slave库的源连接

@Configuration
@MapperScan(basePackages = "cn.wbnull.springbootdemo.mapper.slave", sqlSessionFactoryRef = "slaveSqlSessionFactory")
public class SlaveDataSourceConfig {@Bean("slaveDataSource")@ConfigurationProperties(prefix = "spring.datasource.slave")public DataSource slaveDataSource() {return DataSourceBuilder.create().build();}@Bean("slaveDataSourceTransactionManager")public DataSourceTransactionManager slaveDataSourceTransactionManager(@Qualifier("slaveDataSource") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}@Bean("slaveSqlSessionFactory")public SqlSessionFactory slaveSqlSessionFactory(@Qualifier("slaveDataSource") DataSource dataSource) throws Exception {SqlSessionFactoryBean sqlSessionFactory = new SqlSessionFactoryBean();sqlSessionFactory.setDataSource(dataSource);Resource[] resources = new PathMatchingResourcePatternResolver().getResources("classpath:mapper/slave/*.xml");sqlSessionFactory.setMapperLocations(resources);return sqlSessionFactory.getObject();}
}

5 测试

5.1 新建数据库表

CREATE SCHEMA `test_master` DEFAULT CHARACTER SET utf8mb4 ;CREATE TABLE `test_master`.`user` (`id` INT NOT NULL AUTO_INCREMENT,`name` VARCHAR(45) NOT NULL,PRIMARY KEY (`id`));INSERT INTO `test_master`.`user` (`name`) VALUES ('张三');
INSERT INTO `test_master`.`user` (`name`) VALUES ('李四');
INSERT INTO `test_master`.`user` (`name`) VALUES ('王五');
INSERT INTO `test_master`.`user` (`name`) VALUES ('周六');CREATE SCHEMA `test_slave` DEFAULT CHARACTER SET utf8mb4 ;CREATE TABLE `test_slave`.`user_info` (`id` INT NOT NULL AUTO_INCREMENT,`userCode` VARCHAR(20) NOT NULL,`userName` VARCHAR(45) NULL,`password` VARCHAR(40) NOT NULL,PRIMARY KEY (`id`));INSERT INTO `test_slave`.`user_info` (`id`, `userCode`, `userName`, `password`) VALUES ('1', 'zhangsan', '张三三', 'zhangsan');
INSERT INTO `test_slave`.`user_info` (`id`, `userCode`, `userName`, `password`) VALUES ('2', 'lisi', '李四四', 'lisi');
INSERT INTO `test_slave`.`user_info` (`id`, `userCode`, `userName`, `password`) VALUES ('3', 'wangwu', '王五五', 'wangwu');
INSERT INTO `test_slave`.`user_info` (`id`, `userCode`, `userName`, `password`) VALUES ('4', 'zhouliu', '周六六', 'zhouliu');

5.2 新建实体类

@Data
public class User {private int id;private String name;
}
@Data
public class UserInfo {private Integer id;private String userCode;private String userName;private String password;
}

5.3 新建Mapper

@Repository
public interface UserMapper {void add(@Param("user") User user);List<User> query();void update(@Param("id") int id, @Param("name") String name);void delete(@Param("id") int id);
}
@Repository
public interface UserInfoMapper {List<User> query();
}

5.4 新建映射文件

<?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="cn.wbnull.springbootdemo.mapper.master.UserMapper"><!-- 通用查询映射结果 --><resultMap id="BaseResultMap" type="cn.wbnull.springbootdemo.entity.User"><id column="id" property="id"/><result column="name" property="name"/></resultMap><!-- 通用查询结果列 --><sql id="Base_Column_List">id, name</sql><insert id="add">INSERT INTO user(<include refid="Base_Column_List"/>)VALUES(#{user.id},#{user.name})</insert><select id="query" resultMap="BaseResultMap">SELECT * FROM user</select><update id="update">UPDATE user SET name = '${name}' WHERE id = '${id}'</update><update id="delete">DELETE FROM user where id = '${id}'</update>
</mapper>
<?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="cn.wbnull.springbootdemo.mapper.slave.UserInfoMapper"><!-- 通用查询映射结果 --><resultMap id="BaseResultMap" type="cn.wbnull.springbootdemo.entity.UserInfo"><id column="id" property="id" /><result column="userCode" property="userCode" /><result column="userName" property="userName" /><result column="password" property="password" /></resultMap><!-- 通用查询结果列 --><sql id="Base_Column_List">id, userCode, userName, password</sql><select id="query" resultMap="BaseResultMap">SELECT * FROM user_info</select>
</mapper>

5.5 新建Service

@Service
public class UserService {@Autowiredprivate UserMapper userMapper;public String add(String name) {User user = new User();user.setName(name);userMapper.add(user);return "操作成功";}public List<User> query() {return userMapper.query();}public String update(int id, String name) {userMapper.update(id, name);return "操作成功";}public String delete(int id) {userMapper.delete(id);return "操作成功";}
}
@Service
public class UserInfoService {@Autowiredprivate UserInfoMapper userInfoMapper;public List<User> query() {return userInfoMapper.query();}
}

5.6 新建Controller

@RestController
@RequestMapping("user")
public class UserController {@Autowiredpublic UserService userService;@PostMapping(value = "add")public String add(@RequestParam(value = "name") String name) {return userService.add(name);}@PostMapping(value = "query")public List<User> query() {return userService.query();}@PostMapping(value = "update")public String update(@RequestParam(value = "id") int id, @RequestParam(value = "name") String name) {return userService.update(id, name);}@PostMapping(value = "delete")public String delete(@RequestParam(value = "id") int id) {return userService.delete(id);}
}
@Controller
@RequestMapping("userInfo")
public class UserInfoController {@Autowiredpublic UserInfoService userInfoService;@PostMapping(value = "query")public List<User> query() {return userInfoService.query();}
}

5.7 测试

使用Postman测试,输出结果如下

5.8.1 master select

在这里插入图片描述

5.8.2 master insert

在这里插入图片描述

数据库中插入成功

在这里插入图片描述

5.8.3 master update

在这里插入图片描述

数据库中更新成功

在这里插入图片描述

5.8.4 master delete

在这里插入图片描述

数据库中删除成功

在这里插入图片描述

5.8.5 slave select

在这里插入图片描述

截至这里,Spring Boot已经成功整合MyBatis多数据源,并连接上了数据库,且测试正常。

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

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

相关文章

【HTML5】浏览器不能显示字体报错Failed to decode downloaded font问题解决

把网上的项目中字体通过链接保存下来在本地上使用&#xff0c;在本地服务器上运行站点发现&#xff0c;用Chrome浏览器访问的时候&#xff0c;出现错误提示不能正常显示字体&#xff0c;怎么解决呢&#xff0c;看看怎么搞。 文章目录 发现问题提示警告提示错误 字体检查打开文件…

112.路径总和

// 定义一个名为 Solution 的类 class Solution {// 定义一个名为 hasPathSum 的公共方法&#xff0c;接收一个 TreeNode 类型的根节点 root 和一个整数 targetSum 作为参数// 方法返回一个布尔值&#xff0c;表示从根节点开始是否存在一条路径&#xff0c;使得路径上所有节点的…

18个惊艳的可视化大屏(第12辑):智慧校园与教育方向

智慧校园可视化大屏通过数据可视化技术&#xff0c;将学校各个方面的数据信息进行展示&#xff0c;可以提高信息公开透明度、优化校园管理、提高学生教育质量和提高校内活动宣传效果等。 1提高信息公开透明度&#xff1a; 通过大屏幕展示校园各个方面的数据信息&#xff0c;可…

奔跑吧,前端er!前端五大方向技能罗列,webGL、AI、桌面、游戏

经常看到头条上前端们争论各种框架的优劣&#xff0c;然后相互争吵不休&#xff0c;其实技术也好&#xff0c;框架也好&#xff0c;都是服务于项目需求的&#xff0c;争论的铁子们都站在自己的项目角度来品评工具&#xff0c;肯定是公说公有理婆说婆有理啦。 技术和框架是中性的…

【latex】\IEEEpubid版权声明与正文内容重叠

问题描述 撰写IEEE Trans论文时&#xff0c;出现版权声明文字\IEEEpubid与正文内容重叠的问题&#xff1a; 原因分析&#xff1a; 在使用模板时&#xff0c;不小心将以下命令删除了&#xff1a; \IEEEpubidadjcol 解决方案&#xff1a; 在需要换页的位置附近添加以上命令&…

在Jupyter-lab中使用RDKit画分子2D图

在Jupyter-lab中使用RDKit画分子2D图 在做完分子对接后&#xff0c;想看看筛选后的分子的结构。因此想利用Jupyter-lab来画分子的2D图。 1. 安装Jupyter-lab与RDKit 系统&#xff1a;Win11已安装conda RDKit 是一个功能强大、灵活易用的化学信息学工具包&#xff0c;广泛应…

w30使用python调用shell脚本

使用python脚本去实现永恒之蓝漏洞攻击 实验环境 攻击工具&#xff1a;pythonmsfconsole 靶场&#xff1a;win7 和 kali实验目的 演示python脚本调用过程 实验步骤 1.写一个永恒之蓝的攻击脚本&#xff0c;定义为blue.rc use exploit/windows/smb/ms17_010_eternalblue …

Spark(2)-基础tranform算子(一)

一、算子列表 编号名称1map算子2flatMap算子3filter算子4mapPartitions算子5mapPartitionsWithIndex算子6keys算子7values算子8mapValues算子9flatMaplValues算子10union算子11reducedByKey算子12combineByKey算子13groupByKey算子14foldByKey算子15aggregateByKey算子16Shuff…

深度学习工具之tokens计算器

1.什么是Token Token是GPT处理文本的基本单位。Token可以是一个字、一个词语或特定语言中的一个字符。它们负责将输入的文本数据转换为 GPT 可以处理的数据格式。每个 GPT 模型都有一个预设的最大 Tokens 数量&#xff0c;例如&#xff0c;GPT-3 每次调用允许处理的最大 Token…

韦东山嵌入式Liunx入门驱动开发五

文章目录 一、驱动程序基石1-1 休眠与唤醒1-2 POLL机制1-3 异步通知(1) 异步通知程序解析(2) 异步通知机制内核代码详解 1-4 阻塞与非阻塞1-5 定时器(1) 内核函数(2) 定时器时间单位 1-6 中断下半部 tasklet 本人学习完韦老师的视频&#xff0c;因此来复习巩固&#xff0c;写以…

《幻兽帕鲁》游戏对服务器性能的具体要求是什么?

《幻兽帕鲁》游戏对服务器性能的具体要求是什么&#xff1f; CPU&#xff1a;官方最低要求为i5-3570K&#xff0c;但在多人游玩时可能会有明显卡顿。此外&#xff0c;还有建议选择4核或更高性能的处理器&#xff0c;以确保游戏运行流畅。 内存&#xff1a;对于不同人数的联机&…

苹果ios群控软件开发常用源代码分享!

在移动软件开发领域&#xff0c;苹果设备由于其封闭性和安全性受到了广大开发者的青睐&#xff0c;然而&#xff0c;这也为开发者带来了一些挑战&#xff0c;特别是在进行群控软件开发时。 群控软件是指可以同时控制多台设备的软件&#xff0c;这在自动化测试、批量操作等场景…

数据要素:数字化转型中的新“金矿”及其发展潜力

作为一名在数字化转型项目中摸爬滚打的实践者&#xff0c;我们见证了数据从简单的信息处理工具逐渐演变为驱动经济社会发展的关键要素。近日&#xff0c;多部门联合发布的《“数据要素”三年行动计划&#xff08;2024—2026年&#xff09;》更是将数据要素的重要性提升到了新的…

C++ //练习 10.15 编写一个lambda,捕获它所在函数的int,并接受一个int参数。lambda应该返回捕获的int和int参数的和。

C Primer&#xff08;第5版&#xff09; 练习 10.15 练习 10.15 编写一个lambda&#xff0c;捕获它所在函数的int&#xff0c;并接受一个int参数。lambda应该返回捕获的int和int参数的和。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;v…

十六、异常和File

异常和File 一、异常1.1异常的分类1.2 异常的作用1.3 异常的处理方式1.3.1 JVM默认的处理方式1.3.2 自己处理&#xff08;捕获异常&#xff09;1.3.3 自己处理&#xff08;灵魂四问&#xff09; 1.4 异常中的常见方法1.5 抛出异常综合练习&#xff08;键盘录入数据&#xff09;…

基于springboot+vue的社区养老服务平台

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

黑马点评-商户查询业务

缓存原理 本文的业务就是redis的经典应用&#xff0c;标准的操作方式就是查询数据库之前先查询缓存&#xff0c;如果缓存数据存在&#xff0c;则直接从缓存中返回&#xff0c;如果缓存数据不存在&#xff0c;再查询数据库&#xff0c;然后将数据存入redis。 缓存更新策略 根据…

Spring重点记录

文章目录 1.Spring的组成2.Spring优点3.IOC理论推导4.IOC本质5.IOC实现&#xff1a;xml或者注解或者自动装配&#xff08;零配置&#xff09;。6.hellospring6.1beans.xml的结构为&#xff1a;6.2.Spring容器6.3对象的创建和控制反转 7.IOC创建对象方式7.1以有参构造的方式创建…

【OneAPI】猫狗类别检测API

OneAPI新接口发布&#xff1a;猫狗类别检测 45种狗狗类别和15种猫猫类别检测。 API地址&#xff1a;POST https://oneapi.coderbox.cn/openapi/api/detect/dogcat 请求参数&#xff08;body&#xff09; 参数名类型必填含义说明imageUrlstring是图片地址网络图片地址&#…

Vue路由(黑马程序员)

路由介绍 将资代码/vue-project(路由)/vue-project/src/views/tlias/DeptView.vue拷贝到我们当前EmpView.vue同级&#xff0c;其结构如下&#xff1a; 此时我们希望&#xff0c;实现点击侧边栏的部门管理&#xff0c;显示部门管理的信息&#xff0c;点击员工管理&#xff0c;显…