关于多数据源的配置,前面介绍过JdbcTemplate多数据源配置,那个比较简单,本文来说说MyBatis多数据源的配置。
其实关于多数据源,觉得项目复杂的就直接上分布式数据库中间件mycat,简单的再考虑多数据源。这是项目中的建议,技术上的话,当然还是各种技术都要掌握的。
创建项目
创建spring boot项目,导入web依赖以及mysql和mybatis的依赖,如下图所示
然后我们需要在pom文件中导入druid的依赖以及mysql的版本信息
<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.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
<version>5.1.27</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
好了,项目算是创建成功了,然后我们就需要去配置数据源信息了,在application.properties中配置以下信息,因为是多数据源,所以这里需要区分,在前缀添加one和two进行区分,这里注意的是,由于我们在application.properties配置文件中将前缀改了,后面需要我们指定前缀名,这个后面再说,先来看看配置信息
多数据源配置
#tb_user数据库
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:///tb_user?useUnicode=true&characterEncoding=utf-8
#pms数据库
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:///pms?useUnicode=true&characterEncoding=utf-8
需要提供两个DataSource配置类,指定前缀名
package com.zhouym.mutilmybatis;
import com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
/**
* 〈〉
*
* @author zhouym
* @create 2019/8/11
* @since 1.0.0
*/
@Configuration
public class DataSourceConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.one")
DataSource dsOne(){
return DruidDataSourceBuilder.create().build();
}
@Bean
@ConfigurationProperties(prefix = "spring.datasource.two")
DataSource dsTwo(){
return DruidDataSourceBuilder.create().build();
}
}
MyBatis配置
接下来则是MyBatis的配置,不同于JdbcTemplate,MyBatis的配置要稍微麻烦一些,因为要提供两个Bean,因此这里两个数据源我将在两个类中分开来配置,首先来看第一个数据源的配置:
package com.zhouym.mutilmybatis;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.annotation.Resource;
import javax.sql.DataSource;
/**
* 〈〉
*
* @author zhouym
* @create 2019/8/11
* @since 1.0.0
*/
@Configuration
@MapperScan(basePackages = "com.zhouym.mutilmybatis.mybatis1",
sqlSessionFactoryRef = "sqlSessionFactory1",
sqlSessionTemplateRef = "sqlSessionTemplate1")
public class MyBatisConfigOne {
@Resource(name = "dsOne")
DataSource dsOne;
@Bean
SqlSessionFactory sqlSessionFactory1() {
SqlSessionFactory sqlSessionFactory = null;
try {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dsOne);
sqlSessionFactory = bean.getObject();
} catch (Exception e) {
e.printStackTrace();
}
return sqlSessionFactory;
}
@Bean
SqlSessionTemplate sqlSessionTemplate1() {
return new SqlSessionTemplate(sqlSessionFactory1());
}
}
创建MyBatisConfigOne 配置类,@Configuration表名这是一个配置类,@MapperScan表示需要扫描的包是com.zhouym.mutilmybatis.mybatis1
,即该包下的Mapper接口将操作dsOne中的数据,对应的SqlSessionFactory和SqlSessionTemplate分别是sqlSessionFactory1和sqlSessionTemplate1,在MyBatisConfigOne内部,分别提供SqlSessionFactory和SqlSessionTemplate即可,SqlSessionFactory根据dsOne创建,然后再根据创建好的SqlSessionFactory创建一个SqlSessionTemplate。
我们再来看看第二个数据源的配置:第二个数据源配置和第一个数据源配置一样,只需要改下包名路径以及,方法名等即可
package com.zhouym.mutilmybatis;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.annotation.Resource;
import javax.sql.DataSource;
/**
* 〈〉
*
* @author zhouym
* @create 2019/8/11
* @since 1.0.0
*/
@Configuration
@MapperScan(basePackages = "com.zhouym.mutilmybatis.mybatis2",
sqlSessionFactoryRef = "sqlSessionFactory2",
sqlSessionTemplateRef = "sqlSessionTemplate2")
public class MyBatisConfigTwo {
@Resource(name = "dsTwo")
DataSource dsTwo;
@Bean
SqlSessionFactory sqlSessionFactory2() {
SqlSessionFactory sqlSessionFactory = null;
try {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dsTwo);
sqlSessionFactory = bean.getObject();
} catch (Exception e) {
e.printStackTrace();
}
return sqlSessionFactory;
}
@Bean
SqlSessionTemplate sqlSessionTemplate2() {
return new SqlSessionTemplate(sqlSessionFactory2());
}
}
实体类
package com.zhouym.mutilmybatis.Bean;
/**
* 〈〉
*
* @author zhouym
* @create 2019/8/11
* @since 1.0.0
*/
public class Users {
private Integer userid;
private String username;
private Integer userage;
public Users() {
}
public Users(Integer userid, String username, Integer userage) {
this.userid = userid;
this.username = username;
this.userage = userage;
}
public Integer getUserid() {
return userid;
}
public void setUserid(Integer userid) {
this.userid = userid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Integer getUserage() {
return userage;
}
public void setUserage(Integer userage) {
this.userage = userage;
}
@Override
public String toString() {
return "Users{" +
"userid=" + userid +
", username='" + username + '\'' +
", userage=" + userage +
'}';
}
}
以上我们的mybatis的配置类就算完后了,接下来我们需要在mybatis1和mybatis2两个包中添加mapper接口以及接口映射文件了
mybatis1包,这里注意的是最好将接口类和接口映射文件的名称一致
package com.zhouym.mutilmybatis.mybatis1;
import com.zhouym.mutilmybatis.Bean.Users;
import java.util.List;
public interface UserMapperOne {
List<Users> getAllUser();
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zhouym.mutilmybatis.mybatis1.UserMapperOne">
<select id="getAllUser" resultType="com.zhouym.mutilmybatis.Bean.Users">
select * from users
</select>
</mapper>
mybatis2包,与mybatis1包下的内容差不多
package com.zhouym.mutilmybatis.mybatis2;
import com.zhouym.mutilmybatis.Bean.Users;
import java.util.List;
public interface UserMapperTwo {
List<Users> getAllUser();
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zhouym.mutilmybatis.mybatis2.UserMapperTwo">
<select id="getAllUser" resultType="com.zhouym.mutilmybatis.Bean.Users">
select * from users
</select>
</mapper>
由于我们将接口类和接口映射文件放在了src/main/java目录下,spring boot默认是去查找的是resources的xml文件,所以这里我们需要在pom.xml配置文件指明,告诉spring boot我们将接口类和接口映射文件放在一起了,查找的时候按照我指定的路径去查找,但是呢,resources目录下的文件就不会去找了,还要告诉spring boot也要去resources目录下去查找需要的文件,下面我们来看在pom.xml文件中怎么配置
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
下面我们直接在测试类中测试
package com.zhouym.mutilmybatis;
import com.zhouym.mutilmybatis.Bean.Users;
import com.zhouym.mutilmybatis.mybatis1.UserMapperOne;
import com.zhouym.mutilmybatis.mybatis2.UserMapperTwo;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import javax.annotation.Resource;
import java.util.List;
@RunWith(SpringRunner.class)
@SpringBootTest
public class MutilmybatisApplicationTests {
@Resource
UserMapperOne userMapper1;
@Resource
UserMapperTwo userMapper2;
@Test
public void contextLoads() {
List<Users> allUser1 = userMapper1.getAllUser();
List<Users> allUser2 = userMapper2.getAllUser();
System.out.println(allUser1);
System.out.println(allUser2);
}
}
来看看测试结果