服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - spring boot下mybatis配置双数据源的实例

spring boot下mybatis配置双数据源的实例

2022-01-21 01:01一撸向北 Java教程

这篇文章主要介绍了spring boot下mybatis配置双数据源的实例,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

最近项目上遇到需要双数据源的来实现需求,并且需要基于spring boot,mybatis的方式来实现,在此做简单记录。

单一数据源配置

单一数据源配置的话并没有什么特别的,在spring boot框架下,只需要在配置文件内添加对应的配置项即可,spring boot会自动初始化需要用到的bean。

配置信息如下。这里使用的是德鲁伊的数据源配置方式

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#datasource配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://xxx
spring.datasource.username=root
spring.datasource.password=123456
#mybatis配置
#mybatis  xmlMapper文件路径
mybatis.mapper-locations=classpath:META-INF/mybatis/mapper/*Mapper.xml
mybatis.configuration.map-underscore-to-camel-case=true
#mappers mapper接口文件路径 多个接口时逗号隔开
mapper.mappers=com.xxxx.xxxx
mapper.not-empty=false
mapper.identity=MYSQL

在使用mapper的时候,直接使用spring的注解注入即可。

多个数据源配置

假如需要新增配置一个数据源,那么在spring boot 框架下如何实现呢?在多数据源的情况下,数据源配置需要添加两份,数据源、mybatis等使用到的bean不能再依赖spring boot替我们完成。

多数据源配置文件

配置文件改成如下,第二个数据源的配置前缀需要自定义为另外的。

?
1
2
3
4
5
6
7
8
9
10
11
12
#datasource 1配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://xxx
spring.datasource.username=root
spring.datasource.password=123456
#datasource 2配置,前缀改为second以区分第一个数据源
second.datasource.type=com.alibaba.druid.pool.DruidDataSource
second.datasource.driver-class-name=com.mysql.jdbc.Driver
second.datasource.url=jdbc:mysql://xxx
second.datasource.username=root
second.datasource.password=123456

多数据源配置类

编写第一个数据源使用的配置类,如下所示。

对于Datasource的bean定义,需要使用@ConfigurationProperties(prefix = "spring.datasource")前缀匹配来指定使用第一个数据源的配置,同时还需要使用注解@Primary来指定当有依赖注入需要注入datasource时,优先使用@Primary注解修饰的datasource。

对于SqlSessionFactory定义,我们无法依赖spring boot做自动化配置实现,有一些动作需要我们手动处理。首先是mapper.xml文件路径的指定,这样mapper接口才能注册到mybatis容器中;假如你定义的的mapper接口没有对应的MapperXml,你还需要手动指定mapper接口的包路径作为参数,调用addMappers的方法,进行扫描注册,手动注册接口到mybatis容器中,一般这个过程在解析MapperXml文件时会由mybatis框架实现。

还有就是SqlSessionTemplate,DataSourceTransactionManager的定义,第一个数据源都需要配置为优先注入。

上面所有的配置第一个数据源相关bean优先注入都是为了方便spring容器,管理第一个数据源的mapper接口的代理类实例bean。spring boot实现Mapper代理类实例的注册时,是从容器中获取一个SqlSessionTemplatebean,然后调用SqlSessionTemplate.getMapper()方法获取一个实例的,因此SqlSessionTemplate优先注入者,spring容器管理的Mapper代理类就是对应数据源定义的。所以第一个数据源的Mapper使用时,可以直接使用@Resource注解或者别的依赖注解来使用。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
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.DataSourceBuilder;
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 javax.sql.DataSource;
/**
 * @author garine
 * @date 2018年11月16日
 **/
@Configuration
public class OdsMybatisConfig {
    @Bean
    @ConfigurationProperties(prefix = "spring.datasource")
    @Primary
    public DataSource odsDataSource(){
        return DataSourceBuilder.create().build();
    }
    @Bean
    @Primary
    public SqlSessionFactory odsSqlSessionFactory(DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        //设置mapper.xml文件路径
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:META-INF/mybatis/mapper/*Mapper.xml"));
        //设置mapper接口的扫描包路径
        //sqlSessionFactory.getConfiguration().addMappers("com.xxx.mapper");
        return bean.getObject();
    }
    @Bean
    @Primary
    public DataSourceTransactionManager odsTransactionManager(DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
    @Bean
    @Primary
    public SqlSessionTemplate odsSqlSessionTemplate(SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
    
}

下面是第二个数据源的配置类。针对第二个数据源配置,方法内容基本一致,但是需要注意的是,由于第一个数据源设置了优先配置,那么所有依赖注入默认都将注入第一个数据源的配置,所以第二个数据源配置需要额外指定使用何种bean注入。

datasource的定义需要使用 @Qualifier注解指定值,在依赖注入时使用 @Qualifier和指定值就可以注入目标bean。wmsSqlSessionFactory方法 使用@Qualifier(“wmsDatasource”)注解可以注入第二个数据源bean。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
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.DataSourceBuilder;
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 javax.sql.DataSource;
/**
 * @author garine
 * @date 2018年11月16日
 **/
@Configuration
public class WmsMybatisConfig {
    @Bean
    @ConfigurationProperties(prefix = "second.datasource")
    @Qualifier("wmsDatasource")
    public DataSource wmsDataSource(){
        return DataSourceBuilder.create().build();
    }
    @Bean
    @Qualifier("wmsSqlSessionFactory")
    public SqlSessionFactory wmsSqlSessionFactory(@Qualifier("wmsDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:META-INF/mybatis/wms/mapper/*Mapper.xml"));
        bean.getObject();
        SqlSessionFactory sqlSessionFactory = bean.getObject();
        //设置wms数据源额外的mapper.java注册
        //sqlSessionFactory.getConfiguration().addMappers("com.xx.maper");
        return sqlSessionFactory;
    }
    @Bean
    public DataSourceTransactionManager wmsTransactionManager(@Qualifier("wmsDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }
    @Bean
    @Qualifier("wmsSqlSessionTemplate")
    public SqlSessionTemplate wmsSqlSessionTemplate( @Qualifier("wmsSqlSessionFactory") SqlSessionFactory wmsSqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(wmsSqlSessionFactory);
    }
}

通过上面的配置就可以实现双数据源配置,下面是使用方式。

  • 第一个数据源定义的maper由spring容器管理,可以直接使用@Resource注解使用
  • 第二个数据源使用可能比较麻烦,代码如下
?
1
2
3
4
5
6
//依赖注入第二个数据源的SqlSession
@Resource
@Qualifier("wmsSqlSessionTemplate")
SqlSessionTemplate wmsSqlSessionTemplate;
//使用时手动获取Mapper然后调用接口方法
wmsSqlSessionTemplate.getMapper(ReturnResultRecoderMapper.class).selectTest()

最后需要注意一点就是,使用上面的配置方式,mybatis的结果处理器对下划线结果集合并没有自动转换为驼峰方式,需要手动在sql中定义别名。

例如实体

?
1
2
3
class People{
    private String peopleGender;
}

mybatis执行sql,结果集映射为People类。

?
1
sekect people_gender from people;

people_gender这个结果无法自动映射到peopleGender,需要执行以下sql才能映射上

?
1
sekect people_gender as peopleGendler from people;

所以这个配置过程应该是漏了某些配置导致结果处理器的名称映射不起作用,这个问题先mark。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/qq_20597727/article/details/84197046

延伸 · 阅读

精彩推荐
  • Java教程SpringMVC拦截器详解

    SpringMVC拦截器详解

    本篇文章主要介绍了SpringMVC拦截器配置及使用方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    池鱼i_9502021-10-14
  • Java教程并发编程之ThreadLocal深入理解

    并发编程之ThreadLocal深入理解

    在日常的开发中,我们经常会遇到在当前运行线程中保存一些信息,并且各线程之间是隔离的,不会相互影响,不存在并发问题,通过这样的方式来实现请...

    一角钱技术4922020-12-11
  • Java教程java实现table添加右键点击事件监听操作示例

    java实现table添加右键点击事件监听操作示例

    这篇文章主要介绍了java实现table添加右键点击事件监听操作,结合实例形式分析了Java添加及使用事件监听相关操作技巧,需要的朋友可以参考下...

    珍惜每分每秒4392021-05-14
  • Java教程Spring的事务机制实例代码

    Spring的事务机制实例代码

    这篇文章主要介绍了Spring的事务机制实例代码,分享了相关代码示例,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下...

    云中之歌4212021-04-02
  • Java教程Java比较器实现方法项目案例

    Java比较器实现方法项目案例

    这篇文章主要介绍了Java比较器实现方法,结合具体项目案例形式分析了Java比较器相关排序操作技巧,需要的朋友可以参考下...

    deniro_li7172021-07-19
  • Java教程Mybatis利用OGNL表达式处理动态sql的方法教程

    Mybatis利用OGNL表达式处理动态sql的方法教程

    这篇文章主要给大家介绍了关于Mybatis利用OGNL表达式处理动态sql的方法教程的相关资料,文中通过示例代码介绍的非常详细,对大家具有一定的参考学习价...

    枯木生花3442020-11-17
  • Java教程在Spring中编写事务的介绍

    在Spring中编写事务的介绍

    今天小编就为大家分享一篇关于在Spring中编写事务的介绍,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看...

    李灿辉7832021-06-28
  • Java教程Java实现excel表格转成json的方法

    Java实现excel表格转成json的方法

    本篇文章主要介绍了Java实现excel表格转成json的方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...

    Allen_LeeY9652021-01-12