SpringBoot 集成多数据源
一个项目中怎么划分数据库,可以通过具体业务需求。
项目中数据源怎么如何划分,通过注解的方式@Datasource(ref="") 在方法上指定,会连接指定的数据源,这种方式比较繁琐。如果有1000个方法,就得写1000个这种注解。所以一般通过分包名的方式。
通过分包名来划分数据源:

1,mysql 里面有两个库,testdb,testdb2,里面各有一张user表,数据结构是一样的
2,建立实体类:user
@Data //相当于@Setter @Getter
public class User {
private int id;
private String username;
private String sex;
private Date birthday;
private String address;
}
2,datasource 包下有DataSource1Config,DataSource2Config,如下:
package com.baiyue.datasource; import javax.sql.DataSource; 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.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.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager; // DataSource01
@Configuration // 注册到springboot容器中
@MapperScan(basePackages = "com.baiyue.db1", sqlSessionFactoryRef = "db1SqlSessionFactory")
public class DataSource1Config {
@Bean(name = "db1DataSource") //@Bean是注入到Spring 容器中
@ConfigurationProperties(prefix = "spring.datasource.db1")//读取配置文件中以spring.datasource.db1 开头的
public DataSource testDataSource() {
return DataSourceBuilder.create().build();
}
@Primary
@Bean(name = "db1SqlSessionFactory")
public SqlSessionFactory testSqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources("classpath:com/baiyue/db1/mapping/*Mapper.xml"));
return bean.getObject();
} /**
* 事务
*/
@Bean(name = "db1TransactionManager")
public DataSourceTransactionManager testTransactionManager(@Qualifier("db1DataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
} @Bean(name = "db1SqlSessionTemplate")
public SqlSessionTemplate testSqlSessionTemplate(
@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
} }
DataSource2:
package com.baiyue.datasource; import javax.sql.DataSource; 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.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.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager; // DataSource01
@Configuration // 注册到springboot容器中
@MapperScan(basePackages = "com.baiyue.db2", sqlSessionFactoryRef = "db2SqlSessionFactory")
public class DataSource2Config { @Bean(name = "db2DataSource") //@Bean是注入到Spring 容器中
@ConfigurationProperties(prefix = "spring.datasource.db2")//读取配置文件中以spring.datasource.db2 开头的
public DataSource testDataSource() {
return DataSourceBuilder.create().build();
} @Bean(name = "db2SqlSessionFactory")
public SqlSessionFactory testSqlSessionFactory(@Qualifier("db2DataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources("classpath:com/baiyue/db2/mapping/*Mapper.xml"));
return bean.getObject();
} /**
* 事务
*/
@Bean(name = "db2TransactionManager")
public DataSourceTransactionManager testTransactionManager(@Qualifier("db2DataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
} @Bean(name = "db2SqlSessionTemplate")
public SqlSessionTemplate testSqlSessionTemplate(
@Qualifier("db2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
} }
通过 @Configuration // 注册到springboot容器中,在启动类中会去读取所有的Bean,通过两个类以及配置文件,能够获取到不同包下的业务层对应不同的数据源..
#多数据源
spring:
datasource:
db1:
driver-class-name: com.mysql.jdbc.Driver
jdbcUrl: jdbc:mysql://localhost:3306/testdb?useUnicode=true&characterEncoding=utf-8
username: root
password: 123456 db2:
driver-class-name: com.mysql.jdbc.Driver
jdbcUrl: jdbc:mysql://localhost:3306/testdb2?useUnicode=true&characterEncoding=utf-8
username: root
password: 123456
3,db1 下的mapper,xml,service,sevice层需要指定业务相应的事务管理,否则会报有两个事务管理的错
package com.baiyue.db1.mapper;
import com.baiyue.entity.User;
public interface UserMapperdb1 {
void insertUser(User user);
User selectUserById(int id);
}
<?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="com.baiyue.db1.mapper.UserMapperdb1"> <!-- 根据 id 查询 user 表中的数据 id:唯一标识符,此文件中的id值不能重复 resultType:返回值类型,一条数据库记录也就对应实体类的一个对象
parameterType:参数类型,也就是查询条件的类型 -->
<select id="selectUserById" resultType="com.baiyue.entity.User" parameterType="int">
<!-- 这里和普通的sql 查询语句差不多,对于只有一个参数,后面的 #{id}表示占位符,里面不一定要写id,写啥都可以,但是不要空着,如果有多个参数则必须写pojo类里面的属性 -->
select * from user where id = #{id}
</select> <insert id="insertUser" parameterType="com.baiyue.entity.User">
insert into
user(id,username,sex,birthday,address)
value(#{id},#{username},#{sex},#{birthday},#{address})
</insert> </mapper>
package com.baiyue.db1.service; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import com.baiyue.db1.mapper.UserMapperdb1;
import com.baiyue.entity.User; import lombok.extern.slf4j.Slf4j; @Service
@Slf4j
public class UserServicedb1 { @Override
public String toString() {
// TODO Auto-generated method stub
return super.toString();
} @Autowired
private UserMapperdb1 userMapper; @Transactional("db1TransactionManager")//指定事务管理
public void insertUser(User user) {
userMapper.insertUser(user);
}; public User selectUserById(int id) {
User user = userMapper.selectUserById(id);
return user;
}; }
4,同理,db2 的mapper,xml,service
package com.baiyue.db2.mapper;
import com.baiyue.entity.User;
public interface UserMapperdb2 {
void insertUser(User user);
User selectUserById(int id);
}
<?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="com.baiyue.db2.mapper.UserMapperdb2"> <!-- 根据 id 查询 user 表中的数据 id:唯一标识符,此文件中的id值不能重复 resultType:返回值类型,一条数据库记录也就对应实体类的一个对象
parameterType:参数类型,也就是查询条件的类型 -->
<select id="selectUserById" resultType="com.baiyue.entity.User" parameterType="int">
<!-- 这里和普通的sql 查询语句差不多,对于只有一个参数,后面的 #{id}表示占位符,里面不一定要写id,写啥都可以,但是不要空着,如果有多个参数则必须写pojo类里面的属性 -->
select * from user where id = #{id}
</select> <insert id="insertUser" parameterType="com.baiyue.entity.User">
insert into
user(id,username,sex,birthday,address)
value(#{id},#{username},#{sex},#{birthday},#{address})
</insert>
</mapper>
package com.baiyue.db2.service; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import com.baiyue.db2.mapper.UserMapperdb2;
import com.baiyue.entity.User;
import lombok.extern.slf4j.Slf4j; @Service
@Slf4j
public class UserServicedb2 { @Autowired
private UserMapperdb2 userMapper; @Transactional("db2TransactionManager")//指定事务管理
public void insertUser(User user) {
log.info("正在添加");
userMapper.insertUser(user);
}; public User selectUserById(int id) {
User user = userMapper.selectUserById(id);
return user;
}; }
5,controller 层:
package com.baiyue.controller; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import com.baiyue.db1.service.UserServicedb1;
import com.baiyue.db2.service.UserServicedb2;
import com.baiyue.entity.User; @RestController
public class Mybatis { @Autowired
private UserServicedb1 userService1; @Autowired
private UserServicedb2 userService2; @RequestMapping("/insertUserdb1")
public String insertUserdb1(){
User user = new User();
user.setUsername("chris");
user.setSex("male");
userService1.insertUser(user);
return "db1success";
} @RequestMapping("/insertUserdb2")
public String insertUserdb2() {
User user = new User();
user.setUsername("chris");
user.setSex("male");
userService2.insertUser(user);
return "db2success";
} }
6,启动类
@MapperScan({"com.baiyue.db1.mapper","com.baiyue.db2.mapper"})
@ComponentScan(basePackages = "com.baiyue") //因为有一些bean 不在当前包或者子包下面,所以@SpringBootApplication 会有些bean 扫不到
@SpringBootApplication
public class App {
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
这样,能够多数据源操作了。。。
SpringBoot 集成多数据源的更多相关文章
- SpringBoot集成多数据源
多数据源就是连接多个数据库 1.在application.properties中配置两个数据库 spring.datasource.driverClassName=com.mysql.jdbc.Dri ...
- springboot集成activiti6.0多数据源的配置
最近公司开始开发springboot的项目,需要对工作流进行集成.目前activiti已经发布了7.0的版本,但是考虑到6.0版本还是比较新而且稳定的,决定还是选择activiti6.0的版本进行集成 ...
- SpringBoot集成Mybatis配置动态数据源
很多人在项目里边都会用到多个数据源,下面记录一次SpringBoot集成Mybatis配置多数据源的过程. pom.xml <?xml version="1.0" encod ...
- SpringBoot学习笔记(三):SpringBoot集成Mybatis、SpringBoot事务管理、SpringBoot多数据源
SpringBoot集成Mybatis 第一步我们需要在pom.xml里面引入mybatis相关的jar包 <dependency> <groupId>org.mybatis. ...
- 第八章 springboot + mybatis + 多数据源(转载)
本篇博客转发自:http://www.cnblogs.com/java-zhao/p/5413845.html 在实际开发中,我们一个项目可能会用到多个数据库,通常一个数据库对应一个数据源. 代码结构 ...
- springboot集成mybatis(二)
上篇文章<springboot集成mybatis(一)>介绍了SpringBoot集成MyBatis注解版.本文还是使用上篇中的案例,咱们换个姿势来一遍^_^ 二.MyBatis配置版(X ...
- springboot集成mybatis(一)
MyBatis简介 MyBatis本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation迁移到了google code,并且改名为MyB ...
- springboot+ibatis 多数据源配置
这个是boot基本版本包,因为我用的打包方式是war所以去除掉了boot内置的tomcat,但是为了方便测试又引入了内置tomcat,只要添加<scope>provided</sco ...
- spring-boot-2.0.3之quartz集成,数据源问题,源码探究
前言 开心一刻 着火了,他报警说:119吗,我家发生火灾了. 119问:在哪里? 他说:在我家. 119问:具体点. 他说:在我家的厨房里. 119问:我说你现在的位置. 他说:我趴在桌子底下. 11 ...
随机推荐
- Golang 使用Protocol Buffer 案例
目录 1. 前言 2. Protobuf 简介 2.1 Protobuf 优点 2.2 Protobuf 缺点 2.3 Protobuf Golang 安装使用 3. Protobuf 通讯案例 3. ...
- Git将文件上传至Github过程
1.安装Git工具(在这里就不多说了) 2.我们需要先创建一个本地的版本库(其实也就是一个文件夹). 你可以直接在桌面右击新建文件夹,也可以右击打开Git bash命令行窗口通过命令来创建. 现在我通 ...
- Jave基本数据类型
基本类型,或者叫做内置类型,是JAVA中不同于类的特殊类型.它们是我们编程中使用最频繁的类型,因此面试题中也总少不了它们的身影,在这篇文章中我们将从面试中常考的几个方面来回顾一下与基本类型相关的知识. ...
- 解决Hexo博客模板hexo-theme-next的翻页按钮不正常显示问题
用Hexo搭了个Gitpage的博客,兴冲冲的发了11篇博文后发现翻页按钮不正常显示,显示为<i class="fa fa-angle-right"></i> ...
- echarts-liquidfill 水球显示小数点
使用echarts-liquidfill.js的水球,水球上显示的文字可以使用chartOption.series[0].label.normal.formatter设置,想显示什么显示什么. var ...
- Golang中database/sql包
驱动 github.com/go-sql-driver/mysql 请求一个连接的函数有好几种,执行完毕处理连接的方式稍有差别,大致如下: db.Ping() 调用完毕后会马上把连接返回给连接池. d ...
- 解决idea的pom.xml文件不自动导包问题
在用pom添加新项目的包时,突然发现pom文件不能自动导包,找了半天发现用以下两个步骤就能解决: 一:打开setting 二:找到maven
- 在vue中实现锚点定位功能
场景如下: 今天早上看到需求方新提的一个需求,这是一份网上答卷,点击题数要实现滚动到对应题目的位置: 注意点:每题题目的高度是不受控制的,你可以取到想跳转的index:(我再循环题目时做了index+ ...
- webpack学习(一):webpack的安装和命令行
本教程可以学习到如下内容: 1.webpack的安装 2.利用webpack命令打包js文件 3.如何在js文件里面引用css并将css文件在页面里面生效 4.学习webpack相关的高级的一些参数, ...
- java 锁 简介(转)
转自 https://www.cnblogs.com/hustzzl/p/9343797.html 1. Java锁的种类 在笔者面试过程时,经常会被问到各种各样的锁,如乐观锁.读写锁等等,非常繁多, ...