多数据库如何定位自己的数据源:1、分包名 2、注解形式,常用的就是分包名形式
1.我们案例以两个数据源为例子讲解:
首先我们准备两个数据库,一个springboot库(users表),一个springboottest(stu表)库,如下图:
2.导入pom依赖:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- 测试 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
<!-- mysql 依赖 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<!-- springboot-web组件 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
3.properties文件配置:
###datasource1
spring.datasource.has.driver-class-name = com.mysql.jdbc.Driver
spring.datasource.has.jdbc-url = jdbc:mysql://localhost:3306/springboot?useUnicode=true&characterEncoding=utf-8
spring.datasource.has.username = root
spring.datasource.has.password = root
###datasource2
spring.datasource.jjy.driver-class-name = com.mysql.jdbc.Driver
spring.datasource.jjy.jdbc-url = jdbc:mysql://localhost:3306/springboottest?useUnicode=true&characterEncoding=utf-8
spring.datasource.jjy.username = root
spring.datasource.jjy.password = root
注意:springboot2.0版本之前多数据源使用url没有问题,但是2.0版本开始需要使用jdbc-url否则会报错
这里采用分包机制,数据源配置中一个has包,一个jjy包
4.新建两个包:com.ansheng.config.has ,com.ansheng.config.jjy 数据源配置,然后分别新建HasDataSourceConfig类和JjyDataSourceConfig类,如下图所示:
HasDataSourceConfig源码:
package com.ansheng.config.has;
import javax.sql.DataSource;
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.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import com.fasterxml.jackson.databind.ser.std.DateSerializer;
@Configuration
@MapperScan(basePackages="com.ansheng.has",sqlSessionTemplateRef="hasSqlSessionTemplate")
public class HasDataSourceConfig {
@Bean(name="hasDataSource")
@ConfigurationProperties(prefix="spring.datasource.has")
public DataSource hasDataSource() {
return DataSourceBuilder.create().build();
}
//sqlsession
@Bean(name = "hasSqlSessionFactory")
public SqlSessionFactory hasSqlSessionFactory(@Qualifier("hasDataSource") DataSource dataSource)
throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(hasDataSource());
return bean.getObject();
}
@Bean(name = "hasTransactionManager")
public DataSourceTransactionManager hasTransactionManager(@Qualifier("hasDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "hasSqlSessionTemplate")
public SqlSessionTemplate hasSqlSessionTemplate(
@Qualifier("hasSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
JjyDataSourceConfig源码:
package com.ansheng.config.jjy;
import javax.sql.DataSource;
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.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import com.fasterxml.jackson.databind.ser.std.DateSerializer;
@Configuration
@MapperScan(basePackages="com.ansheng.jjy",sqlSessionTemplateRef="jjySqlSessionTemplate")
public class JjyDataSourceConfig {
@Bean(name="jjyDataSource")
@ConfigurationProperties(prefix="spring.datasource.jjy")
public DataSource jjyDataSource() {
return DataSourceBuilder.create().build();
}
//����sqlsession
@Bean(name = "jjySqlSessionFactory")
public SqlSessionFactory jjySqlSessionFactory(@Qualifier("jjyDataSource") DataSource dataSource)
throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(jjyDataSource());
return bean.getObject();
}
@Bean(name = "jjyTransactionManager")
public DataSourceTransactionManager jjyTransactionManager(@Qualifier("jjyDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "jjySqlSessionTemplate")
public SqlSessionTemplate jjySqlSessionTemplate(
@Qualifier("jjySqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
5.新建mapper接口,既然多数据源,那就新建两个包,一个com.ansheng.has,一个com.ansheng.jjy,分别新建象个接口
HasMapper.java和JjyMapper.java,目录结构如下图:
6.新建一个controller
controller源码:
package com.ansheng.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Conditional;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import com.ansheng.has.HasMapper;
import com.ansheng.jjy.JjyMapper;
@RestController
public class TestController {
@Autowired
private HasMapper hasMapper;
@Autowired
private JjyMapper jjyMapper;
@RequestMapping("/testHas")
public String Testhas() {
String name="古三通";
String descr="不败顽童";
int i=hasMapper.insertUsersInfo(name,descr);
if(i>0) {
return "has-success";
}else {
return "has-fail!";
}
}
@RequestMapping("/testJjy")
public String Testjjy() {
String name="杨戬";
String classx="灌江口";
int i=jjyMapper.insertStuInfo(name,classx);
if(i>0) {
return "jjy-success!";
}else {
return "jjy-fail!";
}
}
}
注意:时间关系这里省略service层,我直接在controller中调用mapper层
7.HasMapper源码:
8.JjyMapper源码:
9.新建启动类app.java
10.测试,访问接口:http://localhost:8080/testHas
访问接口:http://localhost:8080/testJjy
11.这个时候我们查看数据库,先看springboot库的users表是否有数据:
然后查看springboottest库的stu表:
12.ok,多数据元配置成功,测试通过,有没有感觉很easy,项目工程源码地址:
https://download.youkuaiyun.com/download/royal1235/12114551
感兴趣的小伙伴可以扫码关注下公众号哦,公众号会分享高质量的技术文章哦