静态的方式

我们以两套配置方式为例,在项目中有两套配置文件,两套mapper,两套SqlSessionFactory,各自处理各自的业务,这个两套mapper都可以进行增删改查的操作,在这两个主MYSQL后也可以各自配置自己的slave,实现数据的备份。如果在增加一个数据源就得从头到尾的增加一遍。

先看看两个配置文件:

## master 数据源配置master1.datasource.url=jdbc:mysql://localhost:3306/learn?useUnicode=true&characterEncoding=utf8master1.datasource.username=rootmaster1.datasource.password=master1.datasource.driverClassName=com.mysql.jdbc.Driver## slave 数据源配置master2.datasource.url=jdbc:mysql://localhost:3308/learn?useUnicode=true&characterEncoding=utf8master2.datasource.username=rootmaster2.datasource.password=master2.datasource.driverClassName=com.mysql.jdbc.Driver

这两个数据源的配置不分主从,看网上很多这种配置方式,说是主从配置,个人认为既然什么都是两套就没有必要分出主从,分出读写了,根据业务的需求以及数据库服务器的性能进行划分即可。

两个配置类:

@Configuration// 扫描 Mapper 接口并容器管理@MapperScan(basePackages = Master1DataSourceConfig.PACKAGE, sqlSessionFactoryRef = "master1SqlSessionFactory")public class Master1DataSourceConfig { // 精确到 master 目录,以便跟其他数据源隔离 static final String PACKAGE = "com.hui.readwrite.mapper.master1"; static final String MAPPER_LOCATION = "classpath:mapper/master1.xml"; @Value("${master1.datasource.url}") private String url; @Value("${master1.datasource.username}") private String user; @Value("${master1.datasource.password}") private String password; @Value("${master1.datasource.driverClassName}") private String driverClass; @Bean(name = "master1DataSource") @Primary public DataSource masterDataSource() { DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName(driverClass); dataSource.setUrl(url); dataSource.setUsername(user); dataSource.setPassword(password); return dataSource; } @Bean(name = "master1TransactionManager") @Primary public DataSourceTransactionManager masterTransactionManager() { return new DataSourceTransactionManager(masterDataSource()); } @Bean(name = "master1SqlSessionFactory") @Primary public SqlSessionFactory masterSqlSessionFactory(@Qualifier("master1DataSource") DataSource masterDataSource) throws Exception { final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); sessionFactory.setDataSource(masterDataSource); sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver() .getResources(Master1DataSourceConfig.MAPPER_LOCATION)); return sessionFactory.getObject(); }}
@Configuration// 扫描 Mapper 接口并容器管理@MapperScan(basePackages = Master2DataSourceConfig.PACKAGE, sqlSessionFactoryRef = "master2SqlSessionFactory")public class Master2DataSourceConfig { // 精确到 master 目录,以便跟其他数据源隔离 static final String PACKAGE = "com.hui.readwrite.mapper.master2"; static final String MAPPER_LOCATION = "classpath:mapper/master2.xml"; @Value("${master2.datasource.url}") private String url; @Value("${master2.datasource.username}") private String user; @Value("${master2.datasource.password}") private String password; @Value("${master2.datasource.driverClassName}") private String driverClass; @Bean(name = "master2DataSource") public DataSource master2DataSource() { DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName(driverClass); dataSource.setUrl(url); dataSource.setUsername(user); dataSource.setPassword(password); return dataSource; } @Bean(name = "master2TransactionManager") public DataSourceTransactionManager master2TransactionManager() { return new DataSourceTransactionManager(master2DataSource()); } @Bean(name = "master2SqlSessionFactory") public SqlSessionFactory clusterSqlSessionFactory(@Qualifier("master2DataSource") DataSource master2DataSource) throws Exception { final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean(); sessionFactory.setDataSource(master2DataSource); sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver() .getResources(Master2DataSourceConfig.MAPPER_LOCATION)); return sessionFactory.getObject(); }}

@Primary 标志这个 Bean 如果在多个同类 Bean 候选时,该 Bean 优先被考虑。「多数据源配置的时候注意,必须要有一个主数据源,用 @Primary 标志该 Bean」

@MapperScan 扫描 Mapper 接口并容器管理,包路径精确到 master,为了和下面 cluster 数据源做到精确区分

@Value 获取全局配置文件 application.properties 的 kv 配置,并自动装配

sqlSessionFactoryRef 表示定义了 key ,表示一个唯一 SqlSessionFactory 实例

两个mapper接口的路径和xml文件的路径如下:

这样就可以实现同一个项目使用多个数据配置,缺点是不易维护和扩展。

动态方式

这种方式实现了一个写库多个读库,使用的是同一套Mapper接口和XML文件,这样就有很好的拓展性,具体代码如下:

先是生成不同的数据源,其中多个读数据源合并

@Configurationpublic class DataBaseConfiguration{ @Value("${spring.datasource.type}") private Class extends DataSource> dataSourceType; @Bean(name="writeDataSource

springboot 集成mybatis_Spring Boot 集成Mybatis实现多数据源相关推荐

  1. idea创建springboot项目+mybatis_Spring Boot + MyBatis 多模块项目搭建教程

    Java后端,选择"" 优质文章,及时送达 作者 | 枫本非凡 链接 | cnblogs.com/orzlin/p/9717399.html 上篇 | IDEA 远程一键部署 Sp ...

  2. spring c3p0 mysql_spring boot整合mybatis使用c3p0数据源连接mysql

    刚刚接触springboot,对很多东西都不熟悉,例如,它的注解方式,他的配置方式等:听说它很牛逼,所以就尝试着去学习.在基本熟悉springboot的第一个程序之后.想到当时spring整合myba ...

  3. 【spring boot】 mybatis配置双数据源/多数据源

    前言 spring boot 2.0.0.RELEASE maven 3.5 eclipse 4.9.0 mybatis 1.3.2 mybatis generator 1.3.2 pagehelpe ...

  4. Spring Boot 整合 MyBatis Plus实现多数据源的两种方式

    第一种:使用配置类的方式: 项目结构 xml依赖: <?xml version="1.0" encoding="UTF-8"?> <proje ...

  5. Spring Boot 集成MyBatis

    Spring Boot 集成MyBatis Spring Boot 系列 Spring Boot 入门 Spring Boot 属性配置和使用 Spring Boot 集成MyBatis Spring ...

  6. ideal新建springboot工程_MyBatis初级实战之一:Spring Boot集成

    欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

  7. Spring Boot 集成 Mybatis 实现双数据源

    转载自   Spring Boot 集成 Mybatis 实现双数据源 这里用到了Spring Boot + Mybatis + DynamicDataSource配置动态双数据源,可以动态切换数据源 ...

  8. spring boot集成mybatis+事务控制

    一下代码为DEMO演示,采用注解的方式完成Spring boot和Mybatis的集成,并进行事物的控制 数据源的配置: 1 spring.datasource.url=jdbc:mysql://lo ...

  9. springboot dubbo引入包_spring boot 集成 dubbo 企业完整版

    一.什么是Spring Boot ? 现阶段的 Spring Boot 可谓是太火了,为什么呢?因为使用方便.配置简洁.上手快速,那么它是什么?从官网上我们可以看到,它是 Spring 开源组织下的一 ...

最新文章

  1. Flex AdvancedDataGrid 数据展示异常
  2. 鸿蒙之境的称号,《神都夜行录》鸿蒙之境80级古都凶煞打法
  3. boost::mpl模块实现lower_bound相关的测试程序
  4. ACM练习 校赛83C:纸片儿(测试用例通过但WA/TLE)
  5. Windows下安装及使用NVM
  6. 关于计算Java程序运行时间
  7. unity已存在,您无法加载相同的版本
  8. c# 调用webservice未能连接到服务器连接不上报登录失败,C#动态调用webService出现 基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系。...
  9. 在计算机图形学中多边形的表示方法通常有,计算机图形学复习大纲
  10. FCP-报表交付工程师考试经验
  11. TFS映射关系出错的几种
  12. Python爬虫 requests使用post请求分析并登录Chinaunix
  13. githug通关部分黏贴(git代码练习)
  14. C++中的delegate
  15. APP流量变现之穿山甲广告平台接入
  16. C++中的泛型编程有函数模板与类模板
  17. cookie获取和钓鱼攻击演示
  18. 【全文】工信部正式发布《公共互联网网络安全突发事件应急预案》
  19. 办理佛山入户对于不同的人都会有什么条件
  20. mysql安装后没有mysql数据库怎么处理

热门文章

  1. UVALive 4794 Sharing Chocolate DP
  2. 关于日历的一个超级存储过程
  3. leetcode 1217 python
  4. matlab循环遍历数组_MatLab简易教程 #8 循环
  5. python调用脚本_3种python调用其他脚本的方法
  6. 荐书送书丨《PostgreSQL实战》、《PostgreSQL修炼之道:从小工到专家(第2版)》...
  7. 基于Prometheus+Grafana监控SQL Server数据库
  8. 直播预告:WLS/WAS故障基本分析介绍
  9. HDFS源码解析:教你用HDFS客户端写数据
  10. 带你熟悉鸿蒙轻内核Kconfig使用指南