【Java教程】Springboot集成mybatis实现多数据源配置详解流程

所需工具:

Java

聪明的大脑

勤劳的双手

 

注意:本站只提供教程,不提供任何成品+工具+软件链接,仅限用于学习和研究,禁止商业用途,未经允许禁止转载/分享等

 

教程如下

新建springboot工程,引入web、mysql、mybatis依赖

 	         <dependency>
 	             <groupId>org.springframework.boot</groupId>
 	             <artifactId>spring-boot-starter-web</artifactId>
 	         </dependency>
 	         <dependency>
 	             <groupId>org.mybatis.spring.boot</groupId>
 	             <artifactId>mybatis-spring-boot-starter</artifactId>
 	             <version>2.2.2</version>
 	         </dependency>
 	         <dependency>
 	             <groupId>mysql</groupId>
 	             <artifactId>mysql-connector-java</artifactId>
 	             <scope>runtime</scope>
 	         </dependency>
 	         <dependency>
 	             <groupId>org.projectlombok</groupId>
 	             <artifactId>lombok</artifactId>
 	             <optional>true</optional>
 	         </dependency>
 	         <dependency>
 	             <groupId>org.springframework.boot</groupId>
 	             <artifactId>spring-boot-starter-test</artifactId>
 	             <scope>test</scope>
 	         </dependency>
 	         <dependency>
 	             <groupId>junit</groupId>
 	             <artifactId>junit</artifactId>
 	             <version>4.12</version>
 	             <scope>test</scope>
 	         </dependency>

在application.properties中配置多数据源

spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/ds0
spring.datasource.primary.username=root
spring.datasource.primary.password=root
spring.datasource.primary.driver-class-name=com.mysql.cj.jdbc.Driver

spring.datasource.secondary.jdbc-url=jdbc:mysql://localhost:3306/ds1
spring.datasource.secondary.username=root
spring.datasource.secondary.password=root
spring.datasource.secondary.driver-class-name=com.mysql.cj.jdbc.Driver

多数据源配置与单个数据源配置不同点在于,spring.datasource之后多了一个数据源名称primary/secondary用来区分不同的数据源;

初始化数据源

新建一个配置类,用来加载多个数据源完成初始化。

 	@Configuration
 	public class DataSourceConfiguration {
 	     @Primary
 	     @Bean
 	     @ConfigurationProperties(prefix = "spring.datasource.primary")
 	     public DataSource primaryDataSource() {
 	         return DataSourceBuilder.create().build();
 	     }
 	     @Bean
 	     @ConfigurationProperties(prefix = "spring.datasource.secondary")
 	     public DataSource secondaryDataSource() {
 	         return DataSourceBuilder.create().build();
 	     }
 	}

通过@ConfigurationProperties就可以知道这两个数据源分别加载了spring.datasource.primary.*和spring.datasource.secondary.*的配置。@Primary注解指定了主数据源,当不指定数据源时,就会使用该主数据源。

mybatis配置

 	@Configuration
 	@MapperScan(
 	         basePackages = "com*.primary",
 	         sqlSessionFactoryRef = "sqlSessionFactoryPrimary",
 	         sqlSessionTemplateRef = "sqlSessionTemplatePrimary")
 	public class PrimaryConfig {
 	     private DataSource primaryDataSource;
 	     public PrimaryConfig(@Qualifier("primaryDataSource") DataSource primaryDataSource) {
 	         this.primaryDataSource = primaryDataSource;
 	     }
 	     @Bean
 	     public SqlSessionFactory sqlSessionFactoryPrimary() throws Exception {
 	         SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
 	         bean.setDataSource(primaryDataSource);
 	         return bean.getObject();
 	     }
 	     @Bean
 	     public SqlSessionTemplate sqlSessionTemplatePrimary() throws Exception {
 	         return new SqlSessionTemplate(sqlSessionFactoryPrimary());
 	     }
 	}
 	@Configuration
 	@MapperScan(
 	         basePackages = "com.*.secondary",
 	         sqlSessionFactoryRef = "sqlSessionFactorySecondary",
 	         sqlSessionTemplateRef = "sqlSessionTemplateSecondary")
 	public class SecondaryConfig {
 	     private DataSource secondaryDataSource;
 	     public SecondaryConfig(@Qualifier("secondaryDataSource") DataSource secondaryDataSource) {
 	         this.secondaryDataSource = secondaryDataSource;
 	     }
 	     @Bean
 	     public SqlSessionFactory sqlSessionFactorySecondary() throws Exception {
 	         SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
 	         bean.setDataSource(secondaryDataSource);
 	         return bean.getObject();
 	     }
 	     @Bean
 	     public SqlSessionTemplate sqlSessionTemplateSecondary() throws Exception {
 	         return new SqlSessionTemplate(sqlSessionFactorySecondary());
 	     }
 	}

配置类上使用@MapperScan注解来指定当前数据源下定义的实体和mapper的包路径,还注入了sqlSessionFactory和sqlSessionTemplate,通过@Qualifier注解指定了对应的数据源,其名字对应在DataSourceConfiguration配置类中的数据源定义的函数名。

各个对数据源对应路径下的实体和mapper

 	@Data
 	@NoArgsConstructor
 	public class UserPrimary {
 	     private Long id;
 	     private String user_name;
 	     private Integer age;
 	     public UserPrimary(String name, Integer age) {
 	         this.user_name = name;
 	         this.age = age;
 	     }
 	}
 	public interface UserMapperPrimary {
 	     @Select("SELECT * FROM USER_0 WHERE USER_NAME = #{name}")
 	     UserPrimary findByName(@Param("name") String name);
 	     @Insert("INSERT INTO USER_0 (USER_NAME, AGE) VALUES(#{name}, #{age})")
 	     int insert(@Param("name") String name, @Param("age") Integer age);
 	     @Delete("DELETE FROM USER_0")
 	     int deleteAll();
 	}
 	@Data
 	@NoArgsConstructor
 	public class UserSecondary {
 	     private Long id;
 	     private String user_name;
 	     private Integer age;
 	     public UserSecondary(String name, Integer age) {
 	         this.user_name = name;
 	         this.age = age;
 	     }
 	}
 	public interface UserMapperSecondary {
 	     @Select("SELECT * FROM USER_1 WHERE USER_NAME = #{name}")
 	     UserSecondary findByName(@Param("name") String name);
 	     @Insert("INSERT INTO USER_1 (USER_NAME, AGE) VALUES(#{name}, #{age})")
 	     int insert(@Param("name") String name, @Param("age") Integer age);
 	     @Delete("DELETE FROM USER_1")
 	     int deleteAll();
 	}

测试

 	     @Test
 	     public void test() {
 	         // 往Primary数据源插入一条数据
 	         userMapperPrimary.insert("caocao", 20);
 	         // 从Primary数据源查询刚才插入的数据,配置正确就可以查询到
 	         UserPrimary userPrimary = userMapperPrimary.findByName("caocao");
 	         Assert.assertEquals(20, userPrimary.getAge().intValue());
 	         // 从Secondary数据源查询刚才插入的数据,配置正确应该是查询不到的
 	         UserSecondary userSecondary = userMapperSecondary.findByName("caocao");
 	         Assert.assertNull(userSecondary);
 	         // 往Secondary数据源插入一条数据
 	         userMapperSecondary.insert("sunquan", 21);
 	         // 从Primary数据源查询刚才插入的数据,配置正确应该是查询不到的
 	         userPrimary = userMapperPrimary.findByName("sunquan");
 	         Assert.assertNull(userPrimary);
 	         // 从Secondary数据源查询刚才插入的数据,配置正确就可以查询到
 	         userSecondary = userMapperSecondary.findByName("sunquan");
 	         Assert.assertEquals(21, userSecondary.getAge().intValue());
 	     }

 

 

标签

发表评论