Spring Boot 1.0 && 2.0 + Mybatis 多数据源配置与使用

环境说明

  • Spring Boot 1.5.17.RELEASE Spring Boot 2.1.0.RELEASE
  • MySQL v5.6.19
  • PostgreSQL v10.4

无特殊说明,以下所说的环境均指 Spring Boot 2.1.0.RELEASE,如果使用的是 Spring Boot 1.5.17.RELEASE 这个版本,只需要调整下面有做说明的几处地方

连接配置

application.yml中定义如下信息:

spring:
  jpa:
    hibernate:
      # 多数据源下,该属性不生效,需要在配置中额外指定,这里仅表示普通定义
      ddl-auto: create-drop
    properties:
      hibernate:
        show_sql: true
        format_sql: true
        jdbc:
          lob:
            non_contextual_creation: true
    open-in-view: false
  # 定义不同数据源的连接信息
  datasource:
    hikari:
      mysql:
        # Spring Boot 1.0+ 版本:使用spring.datasource.url
        # Spring Boot 2.0+ 版本:使用spring.datasource.hikari.jdbc-url
        jdbc-url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
        username: root
        password: root
        # Spring Boot 1.0+ 版本:使用com.mysql.jdbc.Driver
        # Spring Boot 2.0+ 版本:使用com.mysql.cj.jdbc.Driver
        driver-class-name: com.mysql.cj.jdbc.Driver
      postgres:
        jdbc-url: jdbc:postgresql://localhost:5432/postgres
        username: postgres
        password: postgres
        driver-class-name: org.postgresql.Driver

配置数据源

根据上面定义的配置信息,配置这两个数据源:

// Spring Boot 1.0+ ,DataSourceBuilder所在包位置为:org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder
// Spring Boot 2.0+ ,DataSourceBuilder所在包位置为:org.springframework.boot.jdbc.DataSourceBuilder
@Configuration
public class DataSourceConfig {

    @Primary
    @Bean
    @ConfigurationProperties("spring.datasource.hikari.mysql")
    public DataSource mysqlDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    @ConfigurationProperties("spring.datasource.hikari.postgres")
    public DataSource postgresDataSource() {
        return DataSourceBuilder.create().build();
    }

}

Mybatis 支持

添加 mysql 对应数据源的 Mybatis 支持:

@Configuration
@MapperScan(
        // 数据层所在包位置
        basePackages = "cn.mariojd.springboot.multiple.datasource.mybatis.mysql.mapper",
        sqlSessionTemplateRef = "mybatisMysqlSqlSessionTemplate")
public class MybatisMysqlDataSourceConfig {

    @Resource
    @Qualifier("mysqlDataSource")
    private DataSource dataSource;

    @Bean
    @Primary
    public SqlSessionFactory mybatisMysqlSqlSessionFactory() throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSource);
        // 如果是xml形式,需要在此处指定mapper位置
        // factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mysql/mapper/*.xml"));
        return factoryBean.getObject();
    }

    @Bean
    @Primary
    public DataSourceTransactionManager mybatisMysqlTransactionManager() {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean
    @Primary
    public SqlSessionTemplate mybatisMysqlSqlSessionTemplate(@Qualifier("mybatisMysqlSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}

添加 postgres 对应数据源的 Mybatis 支持:

@Configuration
@MapperScan(
        // 数据层所在包位置
        basePackages = "cn.mariojd.springboot.multiple.datasource.mybatis.postgres.mapper",
        sqlSessionTemplateRef = "mybatisPostgresSqlSessionTemplate")
public class MybatisPostgresDataSourceConfig {

    @Resource
    @Qualifier("postgresDataSource")
    private DataSource dataSource;

    @Bean
    public SqlSessionFactory mybatisPostgresSqlSessionFactory() throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSource);
        // 如果是xml形式,需要在此处指定mapper位置
        // factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/postgres/mapper/*.xml"));
        return factoryBean.getObject();
    }

    @Bean
    public DataSourceTransactionManager mybatisPostgresTransactionManager() {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean
    public SqlSessionTemplate mybatisPostgresSqlSessionTemplate(@Qualifier("mybatisPostgresSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}

相关定义

mysql 对应的数据源配置中,定义了实体 Boy 和对应的数据层接口 BoyMapper

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Boy {

    private Integer id;

    private String name;

}
public interface BoyMapper {

    @Insert("INSERT INTO boy(id,name) VALUES(#{boy.id},#{boy.name})")
    @Options(useGeneratedKeys = true, keyProperty = "boy.id")
    int insert(@Param("boy") Boy boy);

    @Select("SELECT id,name FROM boy")
    @Results({
            @Result(property = "id", column = "id", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
            @Result(property = "name", column = "name", javaType = String.class, jdbcType = JdbcType.VARCHAR),
    })
    List<Boy> findAll();

}

postgres 对应的数据源配置中,定义了实体 Girl 和对应的数据层接口 GirlMapper

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Girl {

    private Integer id;

    private String name;

}
public interface GirlMapper {

    @Insert("INSERT INTO girl(id,name) VALUES(#{girl.id},#{girl.name})")
    @Options(useGeneratedKeys = true, keyProperty = "girl.id")
    int insert(@Param("girl") Girl girl);

    @Select("SELECT id,name FROM girl")
    @Results({
            @Result(property = "id", column = "id", javaType = Integer.class, jdbcType = JdbcType.INTEGER),
            @Result(property = "name", column = "name", javaType = String.class, jdbcType = JdbcType.VARCHAR),
    })
    List<Girl> findAll();

}

单元测试

@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringBootMybatisMultipleDataSourceTest {

    @Resource
    private BoyMapper boyMapper;

    @Resource
    private GirlMapper girlMapper;
    
    @Test
    public void test() {
        boyMapper.insert(new Boy(1, "大肖"));
        boyMapper.insert(new Boy(2, "大熊"));
        Assert.assertEquals(2, boyMapper.findAll().size());

        girlMapper.insert(new Girl(1, "小红"));
        girlMapper.insert(new Girl(2, "小花"));
        Assert.assertEquals(2, girlMapper.findAll().size());
    }

}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏后端之路

SpringBoot实现Mybatis多数据源方案

背景 目前报表导出需要多数据库的数据,因此我们需要做Mybatis多数据源的配置 我们之前使用Spring的AbstractRoutingDataSource ...

8797
来自专栏Netkiller

Spring boot with Apache Hive

本文节选自《Netkiller Database 手札》 5.26. Spring boot with Apache Hive 5.26.1. Maven ...

7815
来自专栏java闲聊

第二篇 SSM运行Demo

1995
来自专栏cmazxiaoma的架构师之路

VMware WorkStation的烦心事

1582
来自专栏Java技术分享

Shiro 权限框架使用总结

我们首先了解下什么是shiro ,Shiro 是 JAVA 世界中新近出现的权限框架,较之 JAAS 和 Spring Security,Shiro 在保持强大...

5909
来自专栏Ryan Miao

Spring-AOP实践 - 统计访问时间

公司的项目有的页面超级慢,20s以上,不知道用户会不会疯掉,于是老大说这个页面要性能优化。于是,首先就要搞清楚究竟是哪一步耗时太多。 我采用spring aop...

4598
来自专栏bboysoul

关于linux下raid的设备文件和格式化

今天给dell t20装了zstack,没错zstack镜像底层其实就是centos,服务器里面有四块硬盘,一块300g的我是做系统盘的,三块1T的硬盘我是打算...

932
来自专栏后台及大数据开发

springBoot系列教程04:mybatis及druid数据源的集成及查询缓存的使用

首先说下查询缓存:查询缓存就是相同的数据库查询请求在设定的时间间隔内仅查询一次数据库并保存到redis中,后续的请求只要在时间间隔内都直接从redis中获取,不...

1001
来自专栏蓝天

Redis模块开发示例

实现一个Redis module,支持两个扩展命令: 1) 可同时对hash的多个field进行incr操作; 2) incrby同时设置一个key的过期时...

1013
来自专栏技术博文

php QR Code二维码生成类

<?php /* * PHP QR Code encoder * * This file contains MERGED version of PHP ...

3815

扫码关注云+社区