1.功能介绍

在实际的开发中,同一个项目中使用多个数据源是很常见的场景。最近在学习的过程中使用注解的方式实现了一个Springboot项目多数据源的功能。具体实现方式如下。

2.在application.properties中添加多数据源配置

添加多个数据源和mapper文件路径配置,此配置用于基于java的配置数据源中使用。

#数据库配置
spring.datasource.demo.user.url=jdbc:mysql://xxx.xx.xx.xx:3306/demo-user
spring.datasource.demo.user.username=xxxx
spring.datasource.demo.user.password=xxxx
spring.datasource.demo.user.driver-class-name=com.mysql.jdbc.Driver spring.datasource.demo.server.url=jdbc:mysql://xxx.xx.xx.xx:3306/springbootdemo
spring.datasource.demo.server.username=xxxx
spring.datasource.demo.server.password=xxxx
spring.datasource.demo.server.driver-class-name=com.mysql.jdbc.Driver #mapper文件的路径
mybatis.demo.server.mapper-location=classpath*:mapper/demo-server/*.xml
mybatis.demo.user.mapper-location=classpath*:mapper/demo-user/*.xml

3.基于java的方式实现数据库配置

配置类图如下:

其中DemoUserDbConfig类源代码如下:

其中Configuration注解表识此类为Spring的配置类。

MapperScan注解中的basePackages、annotationClass、sqlSessionTemplateRef用于配置此数据库链接扫描com.example包中所有注解为DemoUserMapper的接口。

@Configuration
@MapperScan(basePackages = {"com.example"},annotationClass = DemoUserMapper.class,
sqlSessionTemplateRef = "demoUserTemplate")
public class DemoUserDbConfig extends AbstractDbConfig { @Value("${spring.datasource.demo.user.url}")
private String url; @Value("${spring.datasource.demo.user.username}")
private String userName; @Value("${spring.datasource.demo.user.password}")
private String password; @Value("${spring.datasource.demo.user.driver-class-name}")
private String driveClassName; @Value(value = "${mybatis.demo.user.mapper-location}")
private String mapperLocation; @Bean(name = "demoUser")
public DataSource secondaryDataSource() {
return dataSourceFactory(driveClassName, url, userName, password);
} @Bean(name = "demoUserTemplate")
public SqlSessionTemplate demoUserSqlTemplate() throws Exception {
return new SqlSessionTemplate((sqlSessionFactory(secondaryDataSource(), mapperLocation)));
} @Bean
@Qualifier("demoUserTransaction")
public PlatformTransactionManager demoUserTransaction() {
return new DataSourceTransactionManager(secondaryDataSource());
}
}

其中AbstractDatasource设置了通用的方法,源代码如下:

public abstract class AbstractDbConfig {

    protected SqlSessionFactory sqlSessionFactory(DataSource dataSource, String mapperLocation) throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
ResourcePatternResolver resourceResolver = new PathMatchingResourcePatternResolver();
Resource[] resource= resourceResolver.getResources(mapperLocation);
factoryBean.setMapperLocations(resource);
return factoryBean.getObject();
} protected DataSource dataSourceFactory(String driveClassName, String url, String userName, String password){
DruidDataSource datasource = new DruidDataSource();
datasource.setDriverClassName(driveClassName);
datasource.setUrl(url);
datasource.setUsername(userName);
datasource.setPassword(password);
datasource.setMaxActive(20);
datasource.setInitialSize(20);
return datasource;
}
}

使用相同的方法定义其他数据源。

4.定义接口和mapper文件

分别定义连接demo-user数据库和springbootdemo数据库的mapper文件。连接demo-user数据库的接口如下,使用DemoUserMapper注解表识。

@DemoUserMapper
public interface UserDao { /**
* 返回所有的dictionary列表
*
* @return 所有的dictionary列表
*/
List<String> list(); }

mapper文件如下:

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.example.multidatasource.business.user.UserDao"> <select id="list" resultType="string">
SELECT `name` FROM `user`
</select>
</mapper>

定义读取springbootdemo数据库的接口,代码如下。使用DemoServerMapper注解表识

@DemoServerMapper
public interface DictionaryDao { /**
* 返回所有的dictionary列表
*
* @return 所有的dictionary列表
*/
List<Dictionary> list(); /**
* 查询此key下的所有子节点
*
* @param key 数据字典key
* @return 返回key所有的子节点列表
*/
List<Dictionary> listChildrenByKey(String key); /**
* 插入数据到数据库
*
* @param dictionary
*/
void insert(Dictionary dictionary); }

mapper文件代码如下:

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.example.multidatasource.business.dictionary.dao.DictionaryDao"> <resultMap id="DictionaryResultMap" type="com.example.multidatasource.business.dictionary.Dictionary">
<result property="id" column="id"></result>
<result property="dictKey" column="dict_key"></result>
<result property="dictValue" column="dict_value"></result>
<result property="parentId" column="parent_id"></result>
<result property="description" column="description"></result>
</resultMap> <select id="list" resultMap="DictionaryResultMap">
SELECT * FROM `dictionary`
</select> <select id="listChildrenByKey" resultMap="DictionaryResultMap">
SELECT * FROM dictionary where parent_id= (select id from dictionary where dict_key= #{key})
</select> <delete id="delete" parameterType="int">
delete from dictionary where id = #{id}
</delete> <insert id="insert" parameterType="com.example.multidatasource.business.dictionary.Dictionary">
INSERT INTO `dictionary`(`dict_key`,`dict_value`,`parent_id`,`description`)
VALUES(#{dictKey}, #{dictValue}, #{parentId}, #{description})
</insert>
</mapper>

5.定义注解

定义DemoUserMapper和DemoServerMapper注解,分别作为使用demo-user和springbootdemo数据库的表识。

定义代码如下:

@Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Component
@Mapper
public @interface DemoServerMapper { /**
* The value may indicate a suggestion for a logical component name,
* to be turned into a Spring bean in case of an autodetected component.
* @return the suggested component name, if any (or empty String otherwise)
*/
String value() default "";
} @Documented
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Component
@Mapper
public @interface DemoUserMapper { /**
* The value may indicate a suggestion for a logical component name,
* to be turned into a Spring bean in case of an autodetected component.
* @return the suggested component name, if any (or empty String otherwise)
*/
String value() default "";
}

6.使用单元测试验证配置

编写单元测试代码如下:

@RunWith(SpringRunner.class)
@SpringBootTest
public class MultiDatasourceApplicationTests { @Autowired
private DictionaryDao dictionaryDao; @Autowired
private UserDao userDao; @Test
public void contextLoads() {
System.out.println(dictionaryDao.list());
System.out.println("===================");
System.out.println(userDao.list());
} }

基于注解实现SpringBoot多数据源配置的更多相关文章

  1. 基于注解的Spring多数据源配置和使用(非事务)

    原文:基于注解的Spring多数据源配置和使用 1.创建DynamicDataSource类,继承AbstractRoutingDataSource package com.rps.dataSourc ...

  2. 基于注解的Spring多数据源配置和使用

    前一段时间研究了一下spring多数据源的配置和使用,为了后期从多个数据源拉取数据定时进行数据分析和报表统计做准备.由于之前做过的项目都是单数据源的,没有遇到这种场景,所以也一直没有去了解过如何配置多 ...

  3. 基于xml的Spring多数据源配置和使用

    上一篇讲了<基于注解的Spring多数据源配置和使用>,通过在类或者方法上添加@DataSource注解就可以指定某个数据源.这种方式的优点是控制粒度细,也更灵活. 但是当有些时候项目分模 ...

  4. 基于注解的springboot+mybatis的多数据源组件的实现

    通常业务开发中,我们会使用到多个数据源,比如,部分数据存在mysql实例中,部分数据是在oracle数据库中,那这时候,项目基于springboot和mybatis,其实只需要配置两个数据源即可,只需 ...

  5. Springboot 多数据源配置,结合tk-mybatis

    一.前言 作为一个资深的CRUD工程师,我们在实际使用springboot开发项目的时候,难免会遇到同时使用多个数据库的情况,比如前脚刚查询mysql,后脚就要查询sqlserver. 这时,我们很直 ...

  6. 基于注解的Spring AOP的配置和使用

    摘要: 基于注解的Spring AOP的配置和使用 AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面编程.可以通过预编译方式和运行期动态代理实现在不 ...

  7. spring基于通用Dao的多数据源配置详解【ds1】

    spring基于通用Dao的多数据源配置详解 有时候在一个项目中会连接多个数据库,需要在spring中配置多个数据源,最近就遇到了这个问题,由于我的项目之前是基于通用Dao的,配置的时候问题不断,这种 ...

  8. mybatis基于注解形式的多数据源

    最近在做一个系统管理项目,需要使用到多数据源,尝试了注解形式和xml形式的多数据源配置,以下是基于注解形式的Mybatis多数据源配置. 1.application.yml 配置文件 database ...

  9. Spring-Boot 多数据源配置+动态数据源切换+多数据源事物配置实现主从数据库存储分离

    一.基础介绍 多数据源字面意思,比如说二个数据库,甚至不同类型的数据库.在用SpringBoot开发项目时,随着业务量的扩大,我们通常会进行数据库拆分或是引入其他数据库,从而我们需要配置多个数据源. ...

随机推荐

  1. Kettle Rest大文件上传(RestUploadFile.ktr) Rest文件下载(FileDownload.ktr)

    1. Rest大文件上传(RestUploadFile.ktr) 需求描述 上传文件大于10M小于500M 上传文件进行分片(5M一片要比1M分片整体时间快) 先使用java类进行功能模拟在迁移Ktr ...

  2. JS中数组的介绍

    一.数组: 一组数据的集合: 二.JS中数组的特点: 1.数组定义时无需指定数据类型: 2.数组定义时可以无需指定数组长度: 3.数组可以存储任何类型的数据: 4.一般是相同的数据类型: 三.数组的创 ...

  3. Java面试:投行的15个多线程和并发面试题(转)

    多线程和并发问题已成为各种 Java 面试中必不可少的一部分.如果你准备参加投行的 Java 开发岗位面试,比如巴克莱银行(Barclays).花旗银行(Citibank).摩根史坦利投资公司(Mor ...

  4. 微信小程序---图片上传+服务端接受

    原文地址:http://blog.csdn.net/sk719887916/article/details/54312573 微信小程序,图片上传,应用地方-修改用户信息的头像. 详细代码: 小程序的 ...

  5. Lucene-安装和运行Demo程序

    Lucene是什么 Lucene是一款高性能.可扩展的信息检索工具库.- Lucene In Action Lucene版本:7.1 一.下载安装包 https://lucene.apache.org ...

  6. confluent 更换ip地址之后修改数据库

    由于地址搬迁导致ip地址有变动,整个的confluence的服务器的ip的地址更换和对应的数据库地址更换 root@computer-PowerEdge-T30:/opt/atlassian/conf ...

  7. ABAP,Java, nodejs和go语言的web server编程

    ABAP and Java see my blog. nodejs 用nodejs现成的express module,几行代码就能写个server出来: var express = require(' ...

  8. 解决activeandroid no such table

    场景:activeandroid拷贝数据库 (1)复制sql数据库到项目的assets目录,例如/myapp/src/main/assets/prepop.db (2)确保manifest的AA_DB ...

  9. 迅为iMX6Q/PLUS开发板烧写设备树内核 Qt 系统

    迅为iMX6Q 和 iMX6PLUS 两个硬件版本,设备树镜像的烧写方法以及镜像所在目录,镜像名称全部一致. 如果用的是 iMX6Q 版本,想要烧写设备树版本镜像,请使用 iMX6Q 设备树版本的光盘 ...

  10. Makefile入门教程

    Makefile介绍 make是一个命令工具,它解释Makefile 中的指令(应该说是规则).在Makefile文件中描述了整个工程所有文件的编译顺序.编译规则.Makefile 有自己的书写格式. ...