Mybatis系列-tkmybatis-08-多数据源配置

2024-06-19 18:32

本文主要是介绍Mybatis系列-tkmybatis-08-多数据源配置,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

    作为一个资深的CRUD工程师,我们在实际使用springboot开发项目的时候,难免会遇到同时使用多个数据库的情况,比如前脚刚查询mysql,后脚就要查询sqlserver。为springboot配置多个数据源,需要用哪个数据库连接,直接@Autowired不就行了。那么问题来了,怎么配置呢?

1、准备工作:

        a、建立了两个数据库,分别名为foodie-shop和foodie-shop-2,foodie-shop包含表users,foodie-shop-2包含表myusers。两表定义完全一致,只是填充的数据有差异。

CREATE TABLE `myusers` (`id` varchar(64) NOT NULL COMMENT '主键id 用户id',`username` varchar(32) NOT NULL COMMENT '用户名 用户名',`password` varchar(64) NOT NULL COMMENT '密码 密码',`nickname` varchar(32) DEFAULT NULL COMMENT '昵称 昵称',`realname` varchar(128) DEFAULT NULL COMMENT '真实姓名',`face` varchar(1024) NOT NULL COMMENT '头像',`mobile` varchar(32) DEFAULT NULL COMMENT '手机号 手机号',`email` varchar(32) DEFAULT NULL COMMENT '邮箱地址 邮箱地址',`sex` int(11) DEFAULT NULL COMMENT '性别 性别 1:男  0:女  2:保密',`birthday` date DEFAULT NULL COMMENT '生日 生日',`created_time` datetime NOT NULL COMMENT '创建时间 创建时间',`updated_time` datetime NOT NULL COMMENT '更新时间 更新时间',PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表 ';CREATE TABLE `users` (`id` varchar(64) NOT NULL COMMENT '主键id 用户id',`username` varchar(32) NOT NULL COMMENT '用户名 用户名',`password` varchar(64) NOT NULL COMMENT '密码 密码',`nickname` varchar(32) DEFAULT NULL COMMENT '昵称 昵称',`realname` varchar(128) DEFAULT NULL COMMENT '真实姓名',`face` varchar(1024) NOT NULL COMMENT '头像',`mobile` varchar(32) DEFAULT NULL COMMENT '手机号 手机号',`email` varchar(32) DEFAULT NULL COMMENT '邮箱地址 邮箱地址',`sex` int(11) DEFAULT NULL COMMENT '性别 性别 1:男  0:女  2:保密',`birthday` date DEFAULT NULL COMMENT '生日 生日',`created_time` datetime NOT NULL COMMENT '创建时间 创建时间',`updated_time` datetime NOT NULL COMMENT '更新时间 更新时间',PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户表 ';

        b、实现通过tkmybatis-generator插件创建了对应的pojo、xml和mapper文件,参考《Mybatis系列-tkmybatis-01-使用tk-mybatis generator 自动生成代码》

2、在application.properties配置两个datasource

        配置application.properties文件。这里两个datasource分别指向不同的数据库。看到这里可能有些疑惑,之前不都是配置的spring.datasource.driver-class-name这种形式吗,这里怎么多了datasource1和datasource3,Spring能自动解析成DataSource吗?答案是不能,这里datasource1和datasource3是自己随便命的数据源的标识,Spring肯定解析不了,继续往后面看。

# tomcat配置server.port=8080# datasource配置
spring.datasource.datasource1.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.datasource1.url=jdbc:mysql://127.0.0.1:3306/foodie-shop?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2B8
spring.datasource.datasource1.username=root
spring.datasource.datasource1.password=123456spring.datasource.datasource3.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.datasource3.url=jdbc:mysql://127.0.0.1:3306/foodie-shop-2?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2B8
spring.datasource.datasource3.username=root
spring.datasource.datasource3.password=123456

3、为每个数据源分别创建配置类

    看过《Mybatis系列-tkmybatis源码分析-02-主流程分析》源码分析的应该知道,mybatis初始化的时候需要给每个MapperFactoryBean注入一个SqlSessionTemplate类型的Bean实例。在之前单数据源配置的例子中,我们都是在application.properties文件中配置spring.datasource等属性,以及mybatis的属性,如下所示。Spring会自动读取spring.datasource.*属性创建DataSource,mybatis利用该DataSource,读取mybatis.*的配置,创建SqlSessionTemplate类的Bean实例,供后续mybatis初始化的时候使用。整个过程由tkmybatis自动帮我们完成了,但该方法只能创建一个数据源,不支持多数据源。

# datasource配置
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/foodie-shop?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&serverTimezone=GMT%2B8&allowMultiQueries=true
spring.datasource.username=root
spring.datasource.password=123456# TkMybatis配置
## mapper映射文件,配置xml位置接口,mapper类和pojo实体类的位置都可以通过xml文件找到,所以不用配置
mybatis.mapper-locations=classpath*:mapper/*.xml
## 所有POJO类所在包路径
mybatis.type-aliases-package=com.example.demotkmybatisgenerator.pojo

        

    所以在多数据源的配置中,我们并没有配置spring.datasource.*属性以及mybatis.*属性,这时tkmybatis就不能生成有效的SqlSessionTemplate类型的Bean实例。这就需要我们自己为每个数据源创建一个与之对应的SqlSessionTemplate的bean实例,并且在MapperScan中指明,这样在tkmybatis扫描每个mapper类并创建与其对应的mapperFactoryBean的时候,就会为每个mapperFactoryBean指定MapperScan中传入的SqlSessionTemplate实例,从而实现多数据源配置。现在来看看具体例子。

    首先是datasource1对应的配置类。

package com.example.demotkmybatismultidatasource.config;import org.apache.ibatis.session.SqlSessionFactory;import org.mybatis.spring.SqlSessionFactoryBean;import org.mybatis.spring.SqlSessionTemplate;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Primary;import org.springframework.core.io.support.PathMatchingResourcePatternResolver;import org.springframework.jdbc.datasource.DataSourceTransactionManager;import tk.mybatis.spring.annotation.MapperScan;import javax.sql.DataSource;/*** CreateDate: 2021-5-6 <br/>* Author: dujunlin <br/>* Description:* Version: 1.0**/@Configuration//MapperScan需要传入sqlSessionTemplateRef参数(对应配置类bean的名称),这个很重要@MapperScan(basePackages = "com.example.demotkmybatisgenerator.mapper", sqlSessionTemplateRef = "shopSqlSessionTemplate")public class ShopDataSourceConfig {// 注入数据源配置,ConfigurationProperties的作用就是读取spring.datasource.datasource1开头的配置属性,然后将其注入到创建的DataSourceProperties类型// 的bean中。Primary是配置bean实例的优先级,有一个配置类中配置就行。@Primary@Bean@ConfigurationProperties(prefix = "spring.datasource.datasource1")public DataSourceProperties shopDataSourceProperties() {return new DataSourceProperties();}// 创建数据库连接@Primary@Beanpublic DataSource shopDataSource(@Qualifier("shopDataSourceProperties") DataSourceProperties dataSourceProperties) {return dataSourceProperties.initializeDataSourceBuilder().build();}// 创建session工厂@Primary@Beanpublic SqlSessionFactory shopSessionFactory(@Qualifier("shopDataSource") DataSource dataSource) throws Exception {SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();sessionFactoryBean.setDataSource(dataSource);// 配置mapper*.xml位置以及pojo对象的位置sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/*.xml"));sessionFactoryBean.setTypeAliasesPackage("com.example.demotkmybatisgenerator.pojo");return sessionFactoryBean.getObject();}// 创建事务管理(按需添加)@Primary@Beanpublic DataSourceTransactionManager shopDataSourceTransactionManager(@Qualifier("shopDataSource") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}// 会话管理@Primary@Beanpublic SqlSessionTemplate shopSqlSessionTemplate(@Qualifier("shopSessionFactory") SqlSessionFactory sqlSessionFactory) {return new SqlSessionTemplate(sqlSessionFactory);}}

 

    然后是datasource3对应的配置类。

package com.example.demotkmybatismultidatasource.config;import org.apache.ibatis.session.SqlSessionFactory;import org.mybatis.spring.SqlSessionFactoryBean;import org.mybatis.spring.SqlSessionTemplate;import org.springframework.beans.factory.annotation.Qualifier;import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.context.annotation.Primary;import org.springframework.core.io.support.PathMatchingResourcePatternResolver;import org.springframework.jdbc.datasource.DataSourceTransactionManager;import tk.mybatis.spring.annotation.MapperScan;import javax.sql.DataSource;/*** CreateDate: 2021-5-6 <br/>* Author: dujunlin <br/>* Description:* Version: 1.0**/@Configuration@MapperScan(basePackages = "com.example.demotkmybatisgeneratorthird.mapper", sqlSessionTemplateRef = "shop3SqlSessionTemplate")public class Shop3DataSourceConfig {// 注入数据源配置@Bean@ConfigurationProperties(prefix = "spring.datasource.datasource3")public DataSourceProperties shop3DataSourceProperties() {return new DataSourceProperties();}// 创建数据库连接@Beanpublic DataSource shop3DataSource(@Qualifier("shop3DataSourceProperties") DataSourceProperties dataSourceProperties) {return dataSourceProperties.initializeDataSourceBuilder().build();}// 创建session工厂@Beanpublic SqlSessionFactory shop3SessionFactory(@Qualifier("shop3DataSource") DataSource dataSource) throws Exception {SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();sessionFactoryBean.setDataSource(dataSource);sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper-third/*.xml"));sessionFactoryBean.setTypeAliasesPackage("com.example.demotkmybatisgeneratorthird.pojo");return sessionFactoryBean.getObject();}// 创建事务管理(按需添加)@Beanpublic DataSourceTransactionManager shop3DataSourceTransactionManager(@Qualifier("shop3DataSource") DataSource dataSource) {return new DataSourceTransactionManager(dataSource);}// 会话管理@Beanpublic SqlSessionTemplate shop3SqlSessionTemplate(@Qualifier("shop3SessionFactory") SqlSessionFactory sqlSessionFactory) {return new SqlSessionTemplate(sqlSessionFactory);}}

    至此,多数据源配置完成,后面的操作就跟单数据源一模一样。

注意:

    有个需要注意的是,不同数据库中的表名要保证不一致,因为Spring在管理mapper类的bean实例的时候,实例名称就是mapper类名首字母小写,如果表名一致,Spring中就会存在同名同类型的bean,导致启动失败。

 

这篇关于Mybatis系列-tkmybatis-08-多数据源配置的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

Linux 安装、配置Tomcat 的HTTPS

Linux 安装 、配置Tomcat的HTTPS 安装Tomcat 这里选择的是 tomcat 10.X ,需要Java 11及更高版本 Binary Distributions ->Core->选择 tar.gz包 下载、上传到内网服务器 /opt 目录tar -xzf 解压将解压的根目录改名为 tomat-10 并移动到 /opt 下, 形成个人习惯的路径 /opt/tomcat-10

uniapp接入微信小程序原生代码配置方案(优化版)

uniapp项目需要把微信小程序原生语法的功能代码嵌套过来,无需把原生代码转换为uniapp,可以配置拷贝的方式集成过来 1、拷贝代码包到src目录 2、vue.config.js中配置原生代码包直接拷贝到编译目录中 3、pages.json中配置分包目录,原生入口组件的路径 4、manifest.json中配置分包,使用原生组件 5、需要把原生代码包里的页面修改成组件的方

持久层 技术选型如何决策?JPA,Hibernate,ibatis(mybatis)

转自:http://t.51jdy.cn/thread-259-1-1.html 持久层 是一个项目 后台 最重要的部分。他直接 决定了 数据读写的性能,业务编写的复杂度,数据结构(对象结构)等问题。 因此 架构师在考虑 使用那个持久层框架的时候 要考虑清楚。 选择的 标准: 1,项目的场景。 2,团队的技能掌握情况。 3,开发周期(开发效率)。 传统的 业务系统,通常业

IDEA配置Tomcat远程调试

因为不想把本地的Tomcat配置改乱或者多人开发项目想测试,本文主要是记录一下,IDEA使用Tomcat远程调试的配置过程,免得一段时间不去配置到时候忘记(毕竟这次是因为忘了,所以才打算记录的…) 首先在catalina.sh添加以下内容 JAVA_OPTS="-Dcom.sun.management.jmxremote=-Dcom.sun.management.jmxremote.port

Steam邮件推送内容有哪些?配置教程详解!

Steam邮件推送功能是否安全?如何个性化邮件推送内容? Steam作为全球最大的数字游戏分发平台之一,不仅提供了海量的游戏资源,还通过邮件推送为用户提供最新的游戏信息、促销活动和个性化推荐。AokSend将详细介绍Steam邮件推送的主要内容。 Steam邮件推送:促销优惠 每当平台举办大型促销活动,如夏季促销、冬季促销、黑色星期五等,用户都会收到邮件通知。这些邮件详细列出了打折游戏、

JavaWeb系列二十: jQuery的DOM操作 下

jQuery的DOM操作 CSS-DOM操作多选框案例页面加载完毕触发方法作业布置jQuery获取选中复选框的值jQuery控制checkbox被选中jQuery控制(全选/全不选/反选)jQuery动态添加删除用户 CSS-DOM操作 获取和设置元素的样式属性: css()获取和设置元素透明度: opacity属性获取和设置元素高度, 宽度: height(), widt

微信小程序开发必知必会:文件结构和基本配置

一、微信小程序基本文件结构 1.  project.config.json:项目的基本配置文件,包括项目名称、appid、项目目录、页面文件夹等。     {"setting": {"urlCheck": false,"es6": true,"postcss": true,"nodeModulesPath": "D:\\\\node_modules"},"appid": "wxd678e

C语言入门系列:探秘二级指针与多级指针的奇妙世界

文章目录 一,指针的回忆杀1,指针的概念2,指针的声明和赋值3,指针的使用3.1 直接给指针变量赋值3.2 通过*运算符读写指针指向的内存3.2.1 读3.2.2 写 二,二级指针详解1,定义2,示例说明3,二级指针与一级指针、普通变量的关系3.1,与一级指针的关系3.2,与普通变量的关系,示例说明 4,二级指针的常见用途5,二级指针扩展到多级指针 小结 C语言的学习之旅中,二级

【杂记-浅谈DHCP动态主机配置协议】

DHCP动态主机配置协议 一、DHCP概述1、定义2、作用3、报文类型 二、DHCP的工作原理三、DHCP服务器的配置和管理 一、DHCP概述 1、定义 DHCP,Dynamic Host Configuration Protocol,动态主机配置协议,是一种网络协议,主要用于在IP网络中自动分配和管理IP地址以及其他网络配置参数。 2、作用 DHCP允许计算机和其他设备通

Pycharm配置conda环境(解决新版本无法识别可执行文件问题)

引言: 很多小伙伴在下载最新版本的pycharm或者更新到最新版本后为项目配置conda环境的时候,发现文件夹目录中无法显示可执行文件(一般为python.exe),以下就是本人遇到该问题后试验和解决该问题的一些方法和思路。 一般遇到该问题的人群有两种,一种是刚入门对pycharm进行conda环境配置的小白(例如我),不熟悉相关环境配置的操作和过程,还有一种是入坑pycharm有段时间的老手