spring boot mybatis多數(shù)據(jù)源解決方案過程解析
在我們的項(xiàng)目中不免會(huì)遇到需要在一個(gè)項(xiàng)目中使用多個(gè)數(shù)據(jù)源的問題,像我在得到一個(gè)任務(wù)將用戶的聊天記錄進(jìn)行遷移的時(shí)候,就是用到了三個(gè)數(shù)據(jù)源,當(dāng)時(shí)使用的AOP的編程方式根據(jù)訪問的方法的不同進(jìn)行動(dòng)態(tài)的切換數(shù)據(jù)源,覺得性能不太好,先在又新用到了一種使用方式,覺得不錯(cuò),記錄下來。
介紹一下DEMO項(xiàng)目,使用的spring boot集成mybatis,mybatis查詢數(shù)據(jù)庫是基于注解形式查詢的,目的查詢兩個(gè)數(shù)據(jù)庫test1和test2的用戶信息,并在控制臺(tái)打印。
1.pom文件
<dependencies>
<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.1.1</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
<version>5.1.27</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>
**/*.xml
</include>
</includes>
</resource>
<resource>
<directory>src/resources</directory>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
其中添加了alibaba的druid的數(shù)據(jù)源代替了spring boot默認(rèn)的hikacp,注意mysql的驅(qū)動(dòng)的版本號(hào)要與自己所使用的mysql的版本號(hào)保持一致,其中build模塊里面的resources里面是為了防止spring boot 過濾掉src/main/java的XML文件,畢竟有的人喜歡mybatsi查詢數(shù)據(jù)庫的時(shí)候使用的是XML映射文件,不過我們本次使用的 是注解的形式 ,所以<resources>里面的內(nèi)容在項(xiàng)目中沒有用到。如果直接使用注解,可以忽略該內(nèi)容。
2.用戶類
public class User {
public Integer id;
public String name;
public String address;
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", address='" + address + '\'' +
'}';
}
//get set方法省略...........
}
用戶類沒有什么好說的,就是基本的幾個(gè)屬性。
3.application.properties文件配置
spring.datasource.one.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.one.username=root spring.datasource.one.password=123456 spring.datasource.one.url=jdbc:mysql://localhost:3306/test1 spring.datasource.two.type=com.alibaba.druid.pool.DruidDataSource spring.datasource.two.username=root spring.datasource.two.password=123456 spring.datasource.two.url=jdbc:mysql://localhost:3306/test2
這里主要配置了兩個(gè)數(shù)據(jù)庫的訪問屬性,注意兩個(gè)的區(qū)別為one何two的前綴不同,方便在下面使用spring boot的類安全屬性的方式創(chuàng)建不同的數(shù)據(jù)源。
4.根據(jù)不同的前綴創(chuàng)建不同的數(shù)據(jù)源
@Configuration
public class DataSourceConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.one")
public DataSource dsOne(){
return DruidDataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix = "spring.datasource.two")
public DataSource dsTwo(){
return DruidDataSourceBuilder.create().build();
}
}
該類位于主目錄的config目錄下面,使用@ConfigurationProperties注解表明對(duì)應(yīng)的DataSource創(chuàng)建的時(shí)候使用的配置文件的內(nèi)容。
5.在主目錄下面分別創(chuàng)建mapper1和mapper2包,在對(duì)應(yīng)的包下面創(chuàng)建對(duì)應(yīng)的數(shù)據(jù)層訪問接口UserMapper1和UserMapper2,內(nèi)容都如下所示
@Mapper
public interface UserMapper1 {
@Select("select * from users")
List<User> getAllUser();
}
這接口里面沒有什么好說的就是一個(gè)簡(jiǎn)單的mytatis的基于注解的查詢所有用戶的接口。
6.在config包下面創(chuàng)建不同的配置類MybatisConfigOne和MybatisConfigTwo兩個(gè)類分別對(duì)應(yīng)去掃描mapper1和mapper2兩個(gè)路徑下面的dao層接口。
@Configuration
@MapperScan(basePackages = "com.hopec.mybatis.mapper1",sqlSessionFactoryRef = "sqlSessionFactory1",
sqlSessionTemplateRef = "sqlSessionTemplate1")
public class MybatisConfigOne {
@Autowired
@Qualifier("dsOne")
DataSource ds1;
@Bean
SqlSessionFactory sqlSessionFactory1(){
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(ds1);
try {
return bean.getObject();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Bean
SqlSessionTemplate sqlSessionTemplate1(){
return new SqlSessionTemplate(sqlSessionFactory1());
}
}
public class MybatisConfigTwo {
@Autowired
@Qualifier("dsTwo")
DataSource ds2;
@Bean
SqlSessionFactory sqlSessionFactory2(){
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(ds2);
try {
return bean.getObject();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
@Bean
SqlSessionTemplate sqlSessionTemplate2(){
return new SqlSessionTemplate(sqlSessionFactory2());
}
}
7.測(cè)試
@SpringBootTest
class MybatisApplicationTests {
@Autowired
UserMapper1 userMapper1;
@Autowired
UserMapper2 userMapper2;
@Test
void contextLoads() {
List<User> users = userMapper1.getAllUser();
System.out.println(users);
List<User> allUser = userMapper2.getAllUser();
System.out.println(allUser);
}
}
測(cè)試結(jié)果:

如果想使用多個(gè)數(shù)據(jù)源,就繼續(xù)增加就可以了,ok,大功告成了!
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
深入淺析Spring 的aop實(shí)現(xiàn)原理
AOP(Aspect-OrientedProgramming,面向方面編程),可以說是OOP(Object-Oriented Programing,面向?qū)ο缶幊蹋┑难a(bǔ)充和完善。本文給大家介紹Spring 的aop實(shí)現(xiàn)原理,感興趣的朋友一起學(xué)習(xí)吧2016-03-03
使用迭代器模式來進(jìn)行Java的設(shè)計(jì)模式編程
Java日期時(shí)間與正則表達(dá)式超詳細(xì)整理(適合新手入門)
SpringMVC高級(jí)開發(fā)功能實(shí)現(xiàn)過程解析
hibernate一對(duì)多關(guān)聯(lián)映射學(xué)習(xí)小結(jié)

