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


在这里插入图片描述

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



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

为什么需要多数据源?

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

  1. 业务数据和日志数据分离: 将业务数据和日志数据存储在不同的数据库中,方便业务数据的备份和维护。

  2. 读写分离: 将读操作和写操作分别指向不同的数据库,提高系统的读取性能。

  3. 多租户系统: 在一个系统中为不同的租户使用不同的数据库,确保数据隔离和安全性。

  4. 数据分片: 将数据按照某种规则分散到不同的数据库中,提高查询效率。

Spring Boot集成MyBatis的基础配置

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

<!-- 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文件,指定数据库连接信息:

# 主数据源
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

@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注解表示这是主数据源的配置。同样,我们也需要为第二个数据源进行配置:

@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文件。

// PrimaryDataSource中的Mapper接口
@Mapper
public interface PrimaryUserMapper {

    User getUserById(@Param("userId") int userId);
}
<!-- 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>
// SecondaryDataSource中的Mapper接口
@Mapper
public interface SecondaryUserMapper {

    User getUserById(@Param("userId") int userId);
}
<!-- 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接口,并在方法中使用对应的数据源。

@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。

# 主数据源事务管理器
spring.primary.datasource.transactionManager=primaryTransactionManager

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

小结

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

在这里插入图片描述

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


🧸结尾 ❤️ 感谢您的支持和鼓励! 😊🙏
📜您可能感兴趣的内容:

在这里插入图片描述

posted @ 2023-11-23 19:12  IT·陈寒  阅读(32)  评论(0编辑  收藏  举报  来源