MyBatis多数据源配置详解:两种方式与示例

版权申诉
5星 · 超过95%的资源 4 下载量 27 浏览量 更新于2024-09-11 收藏 61KB PDF 举报
在MyBatis框架中,处理多数据源的需求是一项常见的任务,特别是在项目中涉及多个独立数据库或主从复制场景时。本文将深入探讨MyBatis支持的两种主要配置多数据源的方式。 首先,我们区分两种多数据源情况: 1. 独立的数据源:项目中可能包含多个完全不相关的数据库,如游戏开发中的平台数据库与游戏内部数据库。在这种情况下,每个数据库都是独立管理的,适合作为一个个独立的项目进行开发。 2. 主从复制的数据源:这可能包括传统的MySQL中的master-slave架构,或者使用MHA(Master High Availability)技术构建的高可用性环境,其中master节点负责写操作,而slave节点用于读取,以提高系统的可用性和性能。 MyBatis支持的两种配置方式如下: ### 1. 通过`@MapperScan`注解分包扫描 在Spring Boot应用中,可以通过`@MapperScan`注解来指定不同包下的Mapper接口。这种方式简单明了,通过在Spring配置中为每个数据源配置一个`SqlSessionFactory`实例,然后指定扫描的Mapper接口所在的包名。例如: ```java import org.springframework.context.annotation.Configuration; @Configuration @MapperScan(basePackages = {"com.example.package1", "com.example.package2"}, sqlSessionFactoryRef = "dataSource1SessionFactory") public class DataSource1Config { //... } @Configuration @MapperScan(basePackages = {"com.example.package3", "com.example.package4"}, sqlSessionFactoryRef = "dataSource2SessionFactory") public class DataSource2Config { //... } ``` 这里`sqlSessionFactoryRef`参数引用的是对应数据源的`SqlSessionFactory`,这样就能确保每个Mapper接口使用正确的数据源。 ### 2. 通过`@MapperScan`和自定义注解 另一种更为灵活的配置方法是结合自定义注解。创建一个自定义注解,例如`DataSourceAnnotation`,然后在Mapper接口上使用这个注解来标识数据源。在`SqlSessionFactoryBean`中,可以根据注解的值来选择不同的数据源。示例代码如下: ```java import org.apache.ibatis.annotation.DataSource; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration public class MyBatisConfig { @Bean public SqlSessionFactory dataSource1SessionFactory() { SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); factoryBean.setDataSource(dataSource1()); return factoryBean.getObject(); } @Bean public SqlSessionFactory dataSource2SessionFactory() { SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); factoryBean.setDataSource(dataSource2()); return factoryBean.getObject(); } @MapperScan( basePackages = {"com.example.package5", "com.example.package6"}, annotationClass = DataSourceAnnotation.class ) public class MapperScanWithAnnotationConfig { //... } @Qualifier("dataSource1") private DataSource dataSource1() { HikariDataSource dataSource = new HikariDataSource(); // 设置数据源1的相关配置 return dataSource; } @Qualifier("dataSource2") private DataSource dataSource2() { HikariDataSource dataSource = new HikariDataSource(); // 设置数据源2的相关配置 return dataSource; } @DataSource("dataSource1") @Mapper interface DataSource1Mapper { //... } @DataSource("dataSource2") @Mapper interface DataSource2Mapper { //... } } ``` 在这个例子中,`DataSourceAnnotation`注解的值与`@Mapper`注解上的数据源标识相匹配,从而实现动态数据源的绑定。 总结起来,MyBatis的多数据源配置提供了两种有效的方法:一种是基于包扫描,通过`@MapperScan`和`sqlSessionFactoryRef`进行配置;另一种是结合自定义注解,根据注解的值动态选择数据源。选择哪种方式取决于项目的具体需求和团队的编码风格。理解并熟练掌握这两种配置方法对于构建健壮的分布式数据库应用至关重要。