前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Spring Boot集成MyBatis实现多数据源访问的“秘密”

Spring Boot集成MyBatis实现多数据源访问的“秘密”

作者头像
IT_陈寒
发布2023-12-14 11:14:29
2350
发布2023-12-14 11:14:29
举报
文章被收录于专栏:开发经验
🎉Spring Boot集成MyBatis实现多数据源访问的“秘密”

在企业级应用程序中,往往需要处理多个数据库的数据。Spring Boot提供了强大的功能,使得集成多数据源变得相对容易。本文将揭示Spring Boot集成MyBatis实现对多数据源的访问的“秘密”,并通过实例代码来演示整个过程。

在这里插入图片描述
在这里插入图片描述

为什么需要多数据源?

在实际的应用中,有一些常见的场景需要使用多个数据源:

  1. 业务数据和日志数据分离: 将业务数据和日志数据存储在不同的数据库中,方便业务数据的备份和维护。
  2. 读写分离: 将读操作和写操作分别指向不同的数据库,提高系统的读取性能。
  3. 多租户系统: 在一个系统中为不同的租户使用不同的数据库,确保数据隔离和安全性。
  4. 数据分片: 将数据按照某种规则分散到不同的数据库中,提高查询效率。

Spring Boot集成MyBatis的基础配置

在开始之前,确保你已经创建了一个Spring Boot项目。接下来,我们将通过Maven添加MyBatis和连接池的依赖项。

代码语言:javascript
复制
<!-- MyBatis依赖 -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>2.2.0</version>
</dependency>

<!-- 数据库连接池(以Druid为例) -->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.6</version>
</dependency>

接着,配置application.propertiesapplication.yml文件,指定数据库连接信息:

代码语言:javascript
复制
# 主数据源
spring.datasource.primary.url=jdbc:mysql://localhost:3306/primarydb
spring.datasource.primary.username=root
spring.datasource.primary.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# 第二个数据源
spring.datasource.secondary.url=jdbc:mysql://localhost:3306/secondarydb
spring.datasource.secondary.username=root
spring.datasource.secondary.password=root
spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver

这里配置了两个数据源,分别是primarysecondary。接下来,我们需要创建对应的数据源、SqlSessionFactorySqlSessionTemplate

代码语言:javascript
复制
@Configuration
@MapperScan(basePackages = "com.example.mapper.primary", sqlSessionTemplateRef = "primarySqlSessionTemplate")
public class PrimaryDataSourceConfig {

    @Primary
    @Bean(name = "primaryDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.primary")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

    @Primary
    @Bean(name = "primarySqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("primaryDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSource);
        return factoryBean.getObject();
    }

    @Primary
    @Bean(name = "primarySqlSessionTemplate")
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("primarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

上述代码中,@Primary注解表示这是主数据源的配置。同样,我们也需要为第二个数据源进行配置:

代码语言:javascript
复制
@Configuration
@MapperScan(basePackages = "com.example.mapper.secondary", sqlSessionTemplateRef = "secondarySqlSessionTemplate")
public class SecondaryDataSourceConfig {

    @Bean(name = "secondaryDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.secondary")
    public DataSource dataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "secondarySqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("secondaryDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
        factoryBean.setDataSource(dataSource);
        return factoryBean.getObject();
    }

    @Bean(name = "secondarySqlSessionTemplate")
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("secondarySqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

这样,我们已经完成了多数据源的基础配置。

在这里插入图片描述
在这里插入图片描述

使用多数据源

接下来,我们将演示如何在Service层中使用多数据源。首先,创建对应的Mapper接口和Mapper XML文件。

代码语言:javascript
复制
// PrimaryDataSource中的Mapper接口
@Mapper
public interface PrimaryUserMapper {

    User getUserById(@Param("userId") int userId);
}
代码语言:javascript
复制
<!-- PrimaryUserMapper.xml -->
<mapper namespace="com.example.mapper.primary.PrimaryUserMapper">

    <resultMap id="BaseResultMap" type="com.example.entity.User">
        <id column="id" property="id" jdbcType="INTEGER"/>
        <result column="username" property="username" jdbcType="VARCHAR"/>
        <result column="password" property="password" jdbcType="VARCHAR"/>
    </resultMap>

    <select id="getUserById" resultMap="BaseResultMap">
        SELECT * FROM user WHERE id = #{userId}
    </select>
</mapper>
代码语言:javascript
复制
// SecondaryDataSource中的Mapper接口
@Mapper
public interface SecondaryUserMapper {

    User getUserById(@Param("userId") int userId);
}
代码语言:javascript
复制
<!-- SecondaryUserMapper.xml -->
<mapper namespace="com.example.mapper.secondary.SecondaryUserMapper">

    <resultMap id="BaseResultMap" type="com.example.entity.User">
        <id column="id" property="id" jdbcType="INTEGER"/>
        <result column="username" property="username" jdbcType="VARCHAR"/>
        <result column="password" property="password" jdbcType="VARCHAR"/>
    </resultMap>

    <select id="getUserById" resultMap="BaseResultMap">
        SELECT * FROM user WHERE id = #{userId}
    </select>
</mapper>

然后,在Service层中分别注入两个Mapper接口,并在方法中使用对应的数据源。

代码语言:javascript
复制
@Service
public class UserService {

    @Autowired
    private PrimaryUserMapper primaryUserMapper;

    @Autowired
    private SecondaryUserMapper secondaryUserMapper;

    @Transactional(transactionManager = "primaryTransactionManager")
    public User getPrimaryUserById(int userId) {
        return primaryUserMapper.getUserById(userId);
    }

    @Transactional(transactionManager = "secondaryTransactionManager")
    public User getSecondaryUserById(int userId) {
        return secondaryUserMapper.getUserById(userId);
    }
}

在上述代码中,通过@Transactional(transactionManager = "primaryTransactionManager")注解指定了使用主数据源。同样,@Transactional(transactionManager = "secondaryTransactionManager")注解指定了使用第二个数据源。

最后,我们需要在application.propertiesapplication.yml中配置事务管理器的Bean。

代码语言:javascript
复制
# 主数据源事务管理器
spring.primary.datasource.transactionManager=primaryTransactionManager

# 第二个数据源事务管理器
spring.secondary.datasource.transactionManager=secondaryTransactionManager

小结

通过以上步骤,我们成功地实现了Spring Boot集成MyBatis,并实现了对多数据源的访问。使用多数据源可以满足一些特定的业务需求,如读写分离、多租户系统等。在实际应用中,根据项目的具体情况,可以进一步进行配置和优化。

在这里插入图片描述
在这里插入图片描述

希望本文能够帮助读者更好地理解Spring Boot如何集成MyBatis,以及如何配置和使用多数据源。同时,了解多数据源的使用场景和优势,对于构建高性能、可扩展的应用系统有着重要的意义。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2023-11-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 🎉Spring Boot集成MyBatis实现多数据源访问的“秘密”
  • 为什么需要多数据源?
  • Spring Boot集成MyBatis的基础配置
  • 使用多数据源
  • 小结
相关产品与服务
数据保险箱
数据保险箱(Cloud Data Coffer Service,CDCS)为您提供更高安全系数的企业核心数据存储服务。您可以通过自定义过期天数的方法删除数据,避免误删带来的损害,还可以将数据跨地域存储,防止一些不可抗因素导致的数据丢失。数据保险箱支持通过控制台、API 等多样化方式快速简单接入,实现海量数据的存储管理。您可以使用数据保险箱对文件数据进行上传、下载,最终实现数据的安全存储和提取。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档