Spring Boot下配置MyBatis多数据源

简介:

Spring Boot最大的特点是简化开发,因此使用Java Config实现去xml配置,本文将使用这种方式完成对阿里云ADS和RDS两个产品的多数据源配置。同时,会用到阿里巴巴的开源数据源Druid。

依赖

  • 因为ADS和RDS都兼容mysql的JDBC实现,因此工程只需要依赖mysql的driver。
  • Spring Boot易用性的特点是通过Starter实现的,我们只需依赖mybatis的spring-boot-starter即可。
  • Druid是数据源。
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>${mybatis-spring-boot-starter.version}</version>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>${druid.version}</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>${mysql-connector-java.version}</version>
</dependency>
<properties>
    <mysql-connector-java.version>5.1.34</mysql-connector-java.version>
    <druid.version>1.0.18</druid.version>
    <mybatis-spring-boot-starter.version>1.1.1</mybatis-spring-boot-starter.version>
</properties>

数据源配置

多数据源配置要求必须有一个是『主』,我们将RDS设定为主,配置如下:

@Configuration
@MapperScan(basePackages = RdsDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "rdsSqlSessionFactory")
public class RdsDataSourceConfig {
    static final String PACKAGE = "com.aliyun.xxx.repository.mybatis.rds";

    @Value("${xxx_mysql_url}")
    private String dbUrl;
    @Value("${xxx_mysql_username}")
    private String dbUser;
    @Value("${xxx_mysql_password}")
    private String dbPassword;

    @Bean(name = "rdsDataSource")
    @Primary
    public DataSource rdsDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl(dbUrl);
        dataSource.setUsername(dbUser);
        dataSource.setPassword(dbPassword);
        return dataSource;
    }

    @Bean(name = "rdsTransactionManager")
    @Primary
    public DataSourceTransactionManager rdsTransactionManager() {
        return new DataSourceTransactionManager(rdsDataSource());
    }

    @Bean(name = "rdsSqlSessionFactory")
    @Primary
    public SqlSessionFactory rdsSqlSessionFactory(@Qualifier("rdsDataSource") DataSource rdsDataSource) throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(rdsDataSource);
        return sessionFactory.getObject();
    }
}
  • @Value将获取Spring Boot全局配置文件的kv配置。也可以通过Environment对象的getProperty方法获得kv配置。
  • @MapperScan配置要扫描并容器管理的包路径,这里我们精确到rds,以便使其内的Mapper(见下文)与其他数据源隔离。
  • sqlSessionFactoryRef要定义key唯一的SqlSessionFactory实例,否则同名的处理是后者被忽略。

类似地,另一个数据源ADS的配置如下:

@Configuration
@MapperScan(basePackages = AdsDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "adsSqlSessionFactory")
public class AdsDataSourceConfig {
    static final String PACKAGE = "com.aliyun.xxx.repository.mybatis.ads";

    @Value("${xxx_ads_url}")
    private String dbUrl;
    @Value("${xxx_ads_username}")
    private String dbUser;
    @Value("${xxx_ads_password}")
    private String dbPassword;

    @Bean(name = "adsDataSource")
    public DataSource adsDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl(dbUrl);
        dataSource.setUsername(dbUser);
        dataSource.setPassword(dbPassword);
        return dataSource;
    }

    @Bean(name = "adsTransactionManager")
    public DataSourceTransactionManager adsTransactionManager(@Qualifier("adsDataSource") DataSource adsDataSource) {
        return new DataSourceTransactionManager(adsDataSource);
    }

    @Bean(name = "adsSqlSessionFactory")
    public SqlSessionFactory adsSqlSessionFactory(@Qualifier("adsDataSource") DataSource adsDataSource) throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(adsDataSource);
        return sessionFactory.getObject();
    }
}

Mapper

Mapper是mybatis的DAL层接口,其实现是由mybatis内部完成的,也就是说,我们只需要定义好接口即可完成CRUD。

com.aliyun.xxx.repository.mybatis.rds包内的Mapper只会用到RDS数据源。

package com.aliyun.xxx.repository.mybatis.rds;

@Mapper
public interface MetaMapper {
    @SelectProvider(type = MetaSelectProvider.class, method = "xxxQueryById")
    @Results(value ={
            @Result(id=true, property="id",column="id",javaType=Long.class,jdbcType=JdbcType.BIGINT),
            ...
            @Result(property="gmtCreate",column="gmt_create",javaType=Date.class,jdbcType=JdbcType.TIMESTAMP)})
    List<XxxPojo> xxxQueryById(@Param("xxxId") String xxxId);
}

上述Mapper定义了一个Select方法,@SelectProvider用于定义具体的SQL语句,@Results用于定义具体的表字段与POJO属性的映射。

MetaSelectProvider可以使用MyBatis的API完成SQL的拼装。

public class MetaSelectProvider {
    private static final String xxxSQL = "id, ...,gmt_create";

    public String xxxQueryById(Map<String, Object> parameter) {
        org.apache.ibatis.jdbc.SQL sql = new org.apache.ibatis.jdbc.SQL();
        sql.SELECT(xxxSQL).FROM("table_name").WHERE("biz_id=#{xxxId}");
        return sql.toString();
    }
}

DAO

@Repository
public class XxxDAO {
    @Autowired
    private MetaMapper metaMapper;

    public List<XxxPojo> xxxQueryById(String xxxId) throws DataAccessException {
        return metaMapper.xxxQueryById(xxxId);
    }
}

SpringBootApplication

Spring Boot的入口类定义如下:

@SpringBootApplication
@PropertySource("file:/opt/xxx/xxx.properties")
public class XxxApplication {
    public static void main(String[] args) {
        SpringApplication.run(XxxApplication.class, args);
    }
}

测试类

使用Spring的上下文,完成单元测试:

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes = XxxApplication.class)
public class TestXxxDAO {
    private static final Logger logger = LogManager.getLogger(RelevanceResource.class);
    @Autowired
    private XxxDAO dao;

    @Test
    public void testXxxById() {
        String xxxId = "C00018";
        List<XxxPojo> list = dao.xxxQueryById(xxxId);
        Assert.assertNotNull(list);
        logger.info(...);
    }
}
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
负载均衡 监控 Java
Spring Cloud Gateway 全解析:路由配置、断言规则与过滤器实战指南
本文详细介绍了 Spring Cloud Gateway 的核心功能与实践配置。首先讲解了网关模块的创建流程,包括依赖引入(gateway、nacos 服务发现、负载均衡)、端口与服务发现配置,以及路由规则的设置(需注意路径前缀重复与优先级 order)。接着深入解析路由断言,涵盖 After、Before、Path 等 12 种内置断言的参数、作用及配置示例,并说明了自定义断言的实现方法。随后重点阐述过滤器机制,区分路由过滤器(如 AddRequestHeader、RewritePath、RequestRateLimiter 等)与全局过滤器的作用范围与配置方式,提
Spring Cloud Gateway 全解析:路由配置、断言规则与过滤器实战指南
|
Java 关系型数据库 MySQL
Spring Boot自动配置:魔法背后的秘密
Spring Boot 自动配置揭秘:只需简单配置即可启动项目,背后依赖“约定大于配置”与条件化装配。核心在于 `@EnableAutoConfiguration` 注解与 `@Conditional` 系列条件判断,通过 `spring.factories` 或 `AutoConfiguration.imports` 加载配置类,实现按需自动装配 Bean。
|
人工智能 Java 开发者
【Spring】原理解析:Spring Boot 自动配置
Spring Boot通过“约定优于配置”的设计理念,自动检测项目依赖并根据这些依赖自动装配相应的Bean,从而解放开发者从繁琐的配置工作中解脱出来,专注于业务逻辑实现。
3142 0
|
Java Spring
Spring Boot配置的优先级?
在Spring Boot项目中,配置可通过配置文件和外部配置实现。支持的配置文件包括application.properties、application.yml和application.yaml,优先级依次降低。外部配置常用方式有Java系统属性(如-Dserver.port=9001)和命令行参数(如--server.port=10010),其中命令行参数优先级高于系统属性。整体优先级顺序为:命令行参数 &gt; Java系统属性 &gt; application.properties &gt; application.yml &gt; application.yaml。
1482 0
|
前端开发 Java 应用服务中间件
《深入理解Spring》 Spring Boot——约定优于配置的革命者
Spring Boot基于“约定优于配置”理念,通过自动配置、起步依赖、嵌入式容器和Actuator四大特性,简化Spring应用的开发与部署,提升效率,降低门槛,成为现代Java开发的事实标准。
|
缓存 Java 应用服务中间件
Spring Boot配置优化:Tomcat+数据库+缓存+日志,全场景教程
本文详解Spring Boot十大核心配置优化技巧,涵盖Tomcat连接池、数据库连接池、Jackson时区、日志管理、缓存策略、异步线程池等关键配置,结合代码示例与通俗解释,助你轻松掌握高并发场景下的性能调优方法,适用于实际项目落地。
2055 5
|
传感器 Java 数据库
探索Spring Boot的@Conditional注解的上下文配置
Spring Boot 的 `@Conditional` 注解可根据不同条件动态控制 Bean 的加载,提升应用的灵活性与可配置性。本文深入解析其用法与优势,并结合实例展示如何通过自定义条件类实现环境适配的智能配置。
790 0
探索Spring Boot的@Conditional注解的上下文配置
|
安全 算法 Java
在Spring Boot中应用Jasypt以加密配置信息。
通过以上步骤,可以在Spring Boot应用中有效地利用Jasypt对配置信息进行加密,这样即使配置文件被泄露,其中的敏感信息也不会直接暴露给攻击者。这是一种在不牺牲操作复杂度的情况下提升应用安全性的简便方法。
1738 10
|
SQL Java 数据库连接
Spring、SpringMVC 与 MyBatis 核心知识点解析
我梳理的这些内容,涵盖了 Spring、SpringMVC 和 MyBatis 的核心知识点。 在 Spring 中,我了解到 IOC 是控制反转,把对象控制权交容器;DI 是依赖注入,有三种实现方式。Bean 有五种作用域,单例 bean 的线程安全问题及自动装配方式也清晰了。事务基于数据库和 AOP,有失效场景和七种传播行为。AOP 是面向切面编程,动态代理有 JDK 和 CGLIB 两种。 SpringMVC 的 11 步执行流程我烂熟于心,还有那些常用注解的用法。 MyBatis 里,#{} 和 ${} 的区别很关键,获取主键、处理字段与属性名不匹配的方法也掌握了。多表查询、动态
467 0
|
SQL XML Java
配置Spring框架以连接SQL Server数据库
最后,需要集成Spring配置到应用中,这通常在 `main`方法或者Spring Boot的应用配置类中通过加载XML配置或使用注解来实现。
881 0