Spring Boot整合MyBatis多数据源
Spring Boot整合MyBatis多数据源
对于Spring Boot 整合JdbcTemplate多数据源,此方式相对比较复杂一些,没有整合JdbcTemplate多数据源相对简单一些,但此方式也是一种技术,我们也是要掌握的。
创建工程
首先我们需要创建一个Spring Boot 项目工程,并且添加Mybatis、Mysql以及web的相关依赖:
创建好项目后,由于我们每个人的数据库版本不一样,我们要自己指定版本号,这里,我的数据库版本使用的依赖时5.1.47版本的,并且添加数据库连接池Druid依赖,我们整合JdbcTemplate时也是要添加Druid依赖,但是我们要添加Spring Boot打造的Druid,不能使用传统的Druid。依赖如下:
<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.0.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.16</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
多数据源配置
首先,我们要有两个数据源,数据库中有两个数据源。然后,我们在项目中application.properties中配置数据库基本信息,然后提供两个DataSource即可。application.properties中的配置如下:
spring.datasource.one.url=jdbc:mysql:///zmf
spring.datasource.one.username=root
spring.datasource.one.password=root
spring.datasource.one.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.one.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.two.url=jdbc:mysql:///test
spring.datasource.two.username=root
spring.datasource.two.password=root
spring.datasource.two.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.two.driver-class-name=com.mysql.jdbc.Driver
然后,我们再提供两个DataSource,如下:
@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的配置是有那么麻烦一点,因为要提供SqlSessionFactory和SqlSessionTemplate这两个bean,所以这里的两个数据源我们将在两个类中分开来配置。下面我们先看第一个数据源Mybatis的配置:
@Configuration
@MapperScan(basePackages = "org.zmf.mybatis.mapper1",sqlSessionFactoryRef = "sqlSessionFactoryOne",sqlSessionTemplateRef = "sqlSessionTemplateOne")
public class MybatisConfigOne {
@Resource(name = "dsOne")
DataSource dsOne;
@Bean
SqlSessionFactory sqlSessionFactoryOne() {
SqlSessionFactory sessionFactory = null;
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dsOne);
try {
sessionFactory = bean.getObject();
} catch (Exception e) {
e.printStackTrace();
}
return sessionFactory;
}
@Bean
SqlSessionTemplate sqlSessionTemplateOne() {
return new SqlSessionTemplate(sqlSessionFactoryOne());
}
}
说明:
创建MyBatisConfigOne类,首先指明该类是一个配置类,配置类中要扫描的包是org.zmf.mybatis.mapper1,即该包下的Mapper接口将操作dsOne中的数据,对应的SqlSessionFactory和SqlSessionTemplate分别是sqlSessionFactoryOne和sqlSessionTemplateOne,在MyBatisConfigOne内部,分别提供SqlSessionFactory和SqlSessionTemplate即可,SqlSessionFactory根据dsOne创建,然后再根据创建好的SqlSessionFactory创建一个SqlSessionTemplate。
下面,我们配置第二个数据源:
@Configuration
@MapperScan(basePackages = "org.zmf.mybatis.mapper2",sqlSessionFactoryRef = "sqlSessionFactoryTwo",sqlSessionTemplateRef = "sqlSessionTemplateTwo")
public class MybatisConfigTwo {
@Resource(name = "dsTwo")
DataSource dsTwo;
@Bean
SqlSessionFactory sqlSessionFactoryTwo() {
SqlSessionFactory sessionFactory = null;
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dsTwo);
try {
sessionFactory = bean.getObject();
} catch (Exception e) {
e.printStackTrace();
}
return sessionFactory;
}
@Bean
SqlSessionTemplate sqlSessionTemplateTwo() {
return new SqlSessionTemplate(sqlSessionFactoryTwo());
}
}
bean创建
根据以上配置,我们先创建mapper所需要的bean,因为我的两个数据源中的数据不一致所以创建如下:
public class User {
private Integer id;
private String name;
private String password;
//此处省略get和set方法
}
public class Book {
private Integer id;
private String name;
private String author;
//此处省略get和set方法
}
mapper创建
根据上面的配置,下面我们创建所需要的mapper:
首先我们先创建org.zmf.mybatis.mapper1中的mapper:
public interface UserMapper {
List<User> getAllUser();
}
对应的XML文件:
<?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="org.zmf.mybatis.mapper1.UserMapper">
<select id="getAllUser" resultType="org.zmf.mybatis.bean.User">
select * from user
</select>
</mapper>
org.zmf.mybatis.mapper2中的mapper:
public interface BookMapper {
List<Book> getAllBook();
}
对应的XML文件:
<?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="org.zmf.mybatis.mapper2.BookMapper">
<select id="getAllBook" resultType="org.zmf.mybatis.bean.Book">
select * from book
</select>
</mapper>
测试
测试代码如下:
@RunWith(SpringRunner.class)
@SpringBootTest
public class MybatisApplicationTests {
@Autowired
UserMapper userMapper;
@Autowired
BookMapper bookMapper;
@Test
public void contextLoads() {
List<User> allUser = userMapper.getAllUser();
System.out.println(allUser);
List<Book> allBook = bookMapper.getAllBook();
System.out.println(allBook);
}
}
注意:
到这里我们启动可能会报错:
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): org.zmf.mybatis.mapper1.UserMapper.getAllUser
原因,我们在启动的时候,Spring Boot默认把我们mapper1和mapper2中的xml文件过滤掉了。
解决办法:
我们在pom文件中build
节点中添加如下配置:
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
再次启动一样报同样的错误,那就把项目中的target删掉,重新启动: