SpringBoot+MyBatis配置多数据源
SpringBoot 可以支持多数据源,这是一个非常值得学习的功能,但是从现在主流的微服务的架构模式中,每个应用都具有唯一且准确的功能,多数据源的需求很难用到,考虑到实际情况远远比理论复杂的多,这里还是深入学习一个Mybatis的多数据源的配置,代码偏向于实战,提供Git地址,以供下载测试.https://gitee.com/zhoutao825638/Sprinboot_mybatis_ds.git
数据库脚本
我们首先声明记录一下数据库脚本创建了两个数据库,test1和test2 ,并且分别在不同的数据库中创建了student和lesson表.
CREATE DATABASE `test1` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; ;
USE `test1`;
CREATE TABLE `student`(
`id` VARCHAR(12) PRIMARY KEY,
`name` VARCHAR(36) NOT NULL ,
`age` INTEGER DEFAULT 0
);
-- 插入数据
INSERT INTO test1.student (id, name, age) VALUES ('1', '张梦为', 1);
INSERT INTO test1.student (id, name, age) VALUES ('2', '上官婉儿', 2);
INSERT INTO test1.student (id, name, age) VALUES ('3', '唐因', 2);
CREATE DATABASE `test2` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; ;
USE `test2`;
CREATE TABLE `lesson`(
`id` VARCHAR(12) PRIMARY KEY,
`name` VARCHAR(36) NOT NULL ,
`credit` FLOAT DEFAULT 0,
`teacher` VARCHAR(36) DEFAULT 0
);
-- 插入数据
INSERT INTO test2.lesson (id, name, credit, teacher) VALUES ('1', '大学物理', 5, '张思瑞');
INSERT INTO test2.lesson (id, name, credit, teacher) VALUES ('2', '高等数学', 5, '李佛');
创建Spring 应用
使用IDEA 可以非常简单的创建一个应用,这里我使用了Gradle构建项目,其依赖如下:
lombok 是一个不错的插件,推荐使用,如果不使用lombok的话,下面的代码需要添加set/get方法
compile('org.mybatis.spring.boot:mybatis-spring-boot-starter:1.3.2')
compile group: 'org.mybatis.spring.boot', name: 'mybatis-spring-boot-starter', version: '1.3.2'
compile group: 'mysql', name: 'mysql-connector-java', version: '5.1.47'
compileOnly('org.projectlombok:lombok')
testCompile('org.springframework.boot:spring-boot-starter-test')
compile('org.springframework.boot:spring-boot-starter-web')
配置完成之后,在应用的入口中,我们需要修改一下
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
这是因为SpringBoot会自动根据依赖来自动配置,但是我们的数据源配置被我们自己自定义配置了,此时SpringBoot 无法完成自动化配置,因此就会报错,所以此处我们需要排除DataSourceAutoConfiguration的自动配置.
配置数据源
这里我们配置来两个数据源 一个是test1,一个test2,修改application.properties文件
-- 数据源 Frist
spring.datasource.first.url=jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf-8
spring.datasource.first.username=root
spring.datasource.first.password=
spring.datasource.first.driverClassName=com.mysql.jdbc.Driver
-- 数据源 Second
spring.datasource.second.url=jdbc:mysql://localhost:3306/test2?useUnicode=true&characterEncoding=utf-8
spring.datasource.second.username=root
spring.datasource.second.password=
spring.datasource.second.driverClassName=com.mysql.jdbc.Driver
创建配置文件封装类
为了更合理的使用配置文件,这里我们没有使用之前的@Value,而是自己封装一个PropertiesConfig类对象.如下
@Data注解需要添加Lombok插件并开启,需要不想安装的话,请为下面的四个成员变量提供set/get方法即可
数据源First配置文件封装
package com.zhoutao123.springboot.muldatasources.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@Component
@ConfigurationProperties(prefix = "spring.datasource.first")
public class FirstDataBaseProperties {
String url;
String username;
String password;
String driverClassName;
}
数据源Second配置文件封装
package com.zhoutao123.springboot.muldatasources.config;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@Component
@ConfigurationProperties(prefix = "spring.datasource.second")
public class SecondDataBaseProperties {
String url;
String username;
String password;
String driverClassName;
}
完成数据源配置
这里需要完成DataSource/SqlSessionFactory/SessionTemp等对象的注入,需要注意的是,不管配置多少个数据源,其中的一个数据源配置的Bean必须使用@Primary完成注解.
下面是两个数据源的配置,其中First使用了@Primary注解
MapperScan注解的basePackages 表示了其目录下的Mapper使用文件使用该数据源,如FirstDataSource中表示com.zhoutao123.springboot.muldatasources.mapper.first下的Maper文件将使用FirstDataSource.
package com.zhoutao123.springboot.muldatasources.config;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
@Configuration
@MapperScan(basePackages = "com.zhoutao123.springboot.muldatasources.mapper.first",sqlSessionTemplateRef ="firstSqlSessionTemplate")
public class FirstDataSourceConfig {
@Autowired
private FirstDataBaseProperties prop;
// 创建数据源
@Bean(name = "firstDS")
@ConfigurationProperties(prefix = "spring.datasource.first")
@Primary
public DataSource getFirstDataSource() {
DataSource build = DataSourceBuilder.create()
.driverClassName(prop.driverClassName)
.url(prop.url)
.username(prop.username)
.password(prop.password)
.build();
return build;
}
// 创建SessionFactory
@Bean(name = "firstSqlSessionFactory")
@Primary
public SqlSessionFactory firstSqlSessionFactory(@Qualifier("firstDS") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
return bean.getObject();
}
// 创建事务管理器
@Bean("firstTransactionManger")
@Primary
public DataSourceTransactionManager firstTransactionManger(@Qualifier("firstDS") DataSource dataSource){
return new DataSourceTransactionManager(dataSource);
}
// 创建SqlSessionTemplate
@Bean(name = "firstSqlSessionTemplate")
@Primary
public SqlSessionTemplate firstSqlSessionTemplate(@Qualifier("firstSqlSessionFactory") SqlSessionFactory sqlSessionFactory){
return new SqlSessionTemplate(sqlSessionFactory);
}
private Class getType(String type) {
try {
return Class.forName(type);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
}
以及第二个数据源的配置
package com.zhoutao123.springboot.muldatasources.config;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
@Configuration
@MapperScan(basePackages = "com.zhoutao123.springboot.muldatasources.mapper.second",sqlSessionTemplateRef ="secondSqlSessionTemplate")
public class SecondDataSourceConfig {
@Autowired
private SecondDataBaseProperties prop;
// 创建数据源
@Bean(name = "secondDS")
@ConfigurationProperties(prefix = "spring.datasource.second")
public DataSource getSecondDataSource() {
DataSource build = DataSourceBuilder.create()
.driverClassName(prop.driverClassName)
.url(prop.url)
.username(prop.username)
.password(prop.password)
.build();
return build;
}
// 创建SessionFactory
@Bean(name = "secondSqlSessionFactory")
public SqlSessionFactory secondSqlSessionFactory(@Qualifier("secondDS") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
return bean.getObject();
}
// 创建事务管理器
@Bean("secondTransactionManger")
public DataSourceTransactionManager secondTransactionManger(@Qualifier("secondDS") DataSource dataSource){
return new DataSourceTransactionManager(dataSource);
}
// 创建SqlSessionTemplate
@Bean(name = "secondSqlSessionTemplate")
public SqlSessionTemplate secondSqlSessionTemplate(@Qualifier("secondSqlSessionFactory") SqlSessionFactory sqlSessionFactory){
return new SqlSessionTemplate(sqlSessionFactory);
}
private Class getType(String type) {
try {
return Class.forName(type);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
return null;
}
}
实现Mapper
根据数据源配置的MappScan目录来创建测试Mapper,代码如下,注意包名,放在正确的位置上.
返回模型
这里写了两个数据库映射模型,用于接受数据库数据,比较简单.
package com.zhoutao123.springboot.muldatasources.dao;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
public class Lesson {
private String id;
private String name;
private String teacher;
private float credit;
}
package com.zhoutao123.springboot.muldatasources.dao;
import lombok.Data;
import lombok.experimental.Accessors;
@Data
@Accessors(chain = true)
public class Student {
private String id;
private String name;
private String age;
}
创建映射Mapper
package com.zhoutao123.springboot.muldatasources.mapper.first;
import com.zhoutao123.springboot.muldatasources.dao.Student;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@Mapper
public interface StudentMapper {
// 查询全部的学生
@Select("SELECT * FROM student;")
List<Student> getAllStudent();
}
package com.zhoutao123.springboot.muldatasources.mapper.second;
import com.zhoutao123.springboot.muldatasources.dao.Lesson;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
@Mapper
public interface LessonMapper {
// 查询全部的课程
@Select("SELECT * FROM lesson;")
List<Lesson> getAllLesson();
}
测试接口
这里为了方便,写了一个测试接口和Application放在一起的,同时考虑到这边学习的主要目标是多数据源的配置,就没有Service层,Controller直接调用Mapper,真实项目不要这么写哈.
package com.zhoutao123.springboot.muldatasources;
import com.zhoutao123.springboot.muldatasources.config.FirstDataSourceConfig;
import com.zhoutao123.springboot.muldatasources.config.SecondDataSourceConfig;
import com.zhoutao123.springboot.muldatasources.dao.Lesson;
import com.zhoutao123.springboot.muldatasources.dao.Student;
import com.zhoutao123.springboot.muldatasources.mapper.first.StudentMapper;
import com.zhoutao123.springboot.muldatasources.mapper.second.LessonMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.security.PublicKey;
import java.util.List;
// 排除数据源的自动配置
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
@RestController
public class MuldatasourcesApplication {
@Autowired
private StudentMapper studentMapper;
@Autowired
private LessonMapper lessonMapper;
public static void main(String[] args) {
SpringApplication.run(MuldatasourcesApplication.class, args);
}
@GetMapping("/student")
public List<Student> studentList(){
return studentMapper.getAllStudent();
}
@GetMapping("/lesson")
public List<Lesson> lessonList(){
return lessonMapper.getAllLesson();
}
}
测试结果
可以看到不同的数据库的数据被查询出来了,实现了多数据源的切换,此处的效果和数据库的读写分离有类似的效果,可以参考分析,学习.

SpringBoot+MyBatis配置多数据源的更多相关文章
- springboot + mybatis配置多数据源示例
转:http://www.jb51.net/article/107223.htm 在实际开发中,我们一个项目可能会用到多个数据库,通常一个数据库对应一个数据源. 代码结构: 简要原理: 1)Datab ...
- SpringBoot MyBatis 配置多数据源 (静态多个)
转载地址:https://www.jianshu.com/p/118ca1d5ecf9?utm_campaign=haruki&utm_content=note&utm_medium= ...
- SpringBoot集成Mybatis配置动态数据源
很多人在项目里边都会用到多个数据源,下面记录一次SpringBoot集成Mybatis配置多数据源的过程. pom.xml <?xml version="1.0" encod ...
- springboot入门系列(四):SpringBoot和Mybatis配置多数据源连接多个数据库
SpringBoot和Mybatis配置多数据源连接多个数据库 目前业界操作数据库的框架一般是 Mybatis,但在很多业务场景下,我们需要在一个工程里配置多个数据源来实现业务逻辑.在SpringBo ...
- springboot和mybatis 配置多数据源
主数据源(由于代码没有办法复制的原因,下面图片和文字不一致) package com.zhianchen.mysqlremark.toword.config;import com.zaxxer.hik ...
- Spring Boot + Mybatis 配置多数据源
Spring Boot + Mybatis 配置多数据源 Mybatis拦截器,字段名大写转小写 package com.sgcc.tysj.s.common.mybatis; import java ...
- spring+myBatis 配置多数据源,切换数据源
注:本文来源于 tianzhiwuqis <spring+myBatis 配置多数据源,切换数据源> 一个项目里一般情况下只会使用到一个数据库,但有的需求是要显示其他数据库的内容,像这样 ...
- SpringBoot+Mybatis配置Pagehelper分页插件实现自动分页
SpringBoot+Mybatis配置Pagehelper分页插件实现自动分页 **SpringBoot+Mybatis使用Pagehelper分页插件自动分页,非常好用,不用在自己去计算和组装了. ...
- springboot+mybatis集成多数据源MySQL/Oracle/SqlServer
日常开发中可能时常会遇到一些这样的需求,业务数据库和第三方数据库,两个或多个数据库属于不同数据库厂商,这时候就需要通过配置来实现对数据库实现多源处理.大致说一下我的业务场景,框架本身是配置的sprin ...
随机推荐
- Java进阶篇设计模式之十一 ---- 策略模式和模板方法模式
前言 在上一篇中我们学习了行为型模式的访问者模式(Visitor Pattern)和中介者模式(Mediator Pattern).本篇则来学习下行为型模式的两个模式,策略模式(Strategy Pa ...
- win10安装gitLab
从控制面板选择hyper-V进行安装 1.打开控制面板选择程序=>选择启用或关闭windows功能=>选择Hyper-v 安装ubuntu 1.下载ubuntu系统(本次安装为18.04. ...
- SignalR第一节-在5分钟内完成通信连接和消息发送
前言 首先声明,这又是一个小白从入门到进阶系列. SignalR 这个项目我关注了很长时间,中间好像还看到过微软即将放弃该项目的消息,然后我也就没有持续关注了,目前的我项目中使用的是自己搭建的 Web ...
- Asp.NetCore轻松学-部署到 IIS 进行托管
前言 经过一段时间的学习,终于来到了部署服务这个环节,.NetCore 的部署方式非常的灵活多样,但是其万变不离其宗,所有的 Asp.NetCore 程序都基于端口的侦听,在部署的时候仅需要配置侦听地 ...
- 拼多多大数据开发工程师SQL实战解析
不久前,裸考国内知名电商平台拼多多的大数据岗位在线笔试,问答题(写SQL)被虐的很惨,完了下来默默学习一波.顺便借此机会复习一下SQL语句的用法. 本文主要涉及到的SQL知识点包括CREATE创建数据 ...
- CSS入门知识汇总
1.CSS认识 在谈论CSS的概念之前,我们先说一说web标准的目的——其在于创建一个统一的用于web表现层的技术标准,以便通过不同浏览器或终端设备向最终用户展示信息内容.一个网页的呈现是由三部分组成 ...
- Android 6.0 默认关闭定位和GPS,开启后默认选省电
默认关闭定位和GPS 修改位置 frameworks/base/packages/SettingsProvider/res/values/defaults.xml <string name=&q ...
- 20171201 - macOS High Sierra 神级 bug
昨日亲测有效,macOS High Sierra 神级 bug,系统管理员 root 密码为空,输入就可以登录,具备最高权限. 让人不禁想象 Apple Software 怎么了,人才都流失了吗?
- python3 装饰器初识 NLP第三条
还是先抄一条NLP假设... 三,有效果比有道理更重要 光说做法有道理或者正确而不顾是否有效果,是在自欺欺人. 在三赢(我好,人好,世界好)的原则基础上追求效果,比坚持什么是对的更有意义. 说道理 ...
- pycharm配置运行django项目步骤
1:在django项目的跟目录下执行:这是直接在Linux系统中直接运行 python manage.py runserver 0:8000 然后在浏览器中输入IP端口即可访问 pycharm配置运行 ...