第一步:引入jar包
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mf</groupId>
<artifactId>spring2.0</artifactId>
<version>1.0-SNAPSHOT</version>
<!--spring-boot-starter-parent 整合第三方常用框架依赖信息(各种依赖信息)-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
</parent>
<dependencies>
<!--添加 spring-boot-starter-web 模块依赖-->
<!--
spring-boot-starter-web 是springBoot 整合springMVC web
实现原理:Maven依赖继承关系,相当于把第三方常用maven依赖信息,在parent 项目中封装好了,使用
springboot 提供依赖信息关联整合的jar包
在springboot中 快速开发原理(Maven 子父依赖关系)springboot 对常用依赖信息的封装
-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<!--可以不用写版本号在parent中已经写好了-->
<!--<version>2.0.0.RELEASE</version>-->
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
<!--springboot 外部tomcat支持-->
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
<!--整合 FreeMarker-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<!-- springboot-log4j-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j</artifactId>
<version>1.4.0.BUILD-SNAPSHOT</version>
</dependency>
<!--springboot-aop 技术-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!--springboot 集成lombok依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!-- springboot集成mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<!-- springboot 测试 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.45</version>
</dependency>
<!-- 添加JDBC依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- com.alibaba.druid数据库连接池 -->
<dependency>
<groupId>com.alibaba.druid</groupId>
<artifactId>druid-wrapper</artifactId>
<version>0.2.9</version>
</dependency>
<!--jta+atomikos:全局事务-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jta-atomikos</artifactId>
</dependency>
<!--springboot 整合 pagehelper-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.10</version>
</dependency>
</dependencies>
</project>
第二步:新建配置文件
新建springboot配置文件 application.properties:
#配置端口号
server.port=8084
#####配置默认环境(default environment)
spring.profiles.active=dev
新建开发环境(development environment)配置文件 application-dev.properties:
####### development environment 开发环境 #########
# 配置多数据源
## 主库
spring.datasource.master.url=jdbc:mysql://localhost:3306/test01
spring.datasource.master.username=root
spring.datasource.master.password=soft01
spring.datasource.master.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.master.minPoolSize=3
spring.datasource.master.maxPoolSize=10
spring.datasource.master.maxLifetime=20000
spring.datasource.master.borrowConnectionTimeout=30
spring.datasource.master.loginTimeout=30
spring.datasource.master.mainteanceInterval=60
spring.datasource.master.maxIdleTime=60
## 从库
spring.datasource.slaver.url=jdbc:mysql://localhost:3306/test02
spring.datasource.slaver.username=root
spring.datasource.slaver.password=soft01
spring.datasource.slaver.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.slaver.minPoolSize=3
spring.datasource.slaver.maxPoolSize=10
spring.datasource.slaver.maxLifetime=20000
spring.datasource.slaver.borrowConnectionTimeout=30
spring.datasource.slaver.loginTimeout=30
spring.datasource.slaver.mainteanceInterval=60
spring.datasource.slaver.maxIdleTime=60
第三步:写两个配置数据库类。
配置主数据库 MasterDataSourceConfiguration.java 使用@Primary 注解默认数据源
package com.mf.util.datasource;
import com.alibaba.druid.pool.DruidDataSource;
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.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
@Configuration
@MapperScan(basePackages = "com.mf.mapper.master", sqlSessionTemplateRef = "masterSqlSessionTemplate")
public class MasterDataSourceConfiguration {
@Value("${spring.datasource.master.driver-class-name}")
private String driverClassName;
@Value("${spring.datasource.master.url}")
private String url;
@Value("${spring.datasource.master.username}")
private String username;
@Value("${spring.datasource.master.password}")
private String password;
@Bean(name = "masterDataSource")
@Primary
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(this.driverClassName);
dataSource.setUrl(this.url);
dataSource.setUsername(this.username);
dataSource.setPassword(this.password);
return dataSource;
}
@Bean(name = "masterSqlSessionFactory")
@Primary
public SqlSessionFactory sqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception {
// 创建SqlSession工厂
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mybatis/master/*.xml"));
return bean.getObject();
}
@Bean(name = "masterTransactionManager")
@Primary
public DataSourceTransactionManager transactionManager(@Qualifier("masterDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "masterSqlSessionTemplate")
@Primary
public SqlSessionTemplate sqlSessionTemplate(@Qualifier("masterSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
配置从数据库 SlaverDataSourceConfiguration.java
package com.mf.util.datasource;
import com.alibaba.druid.pool.DruidDataSource;
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.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
/**
* @ClassName SlaverDataSourceConfiguration
* @Description TODO
* @Author msi
* @Date 2019/8/2 21:44
*/
@Configuration
@MapperScan(basePackages = "com.mf.mapper.slaver", sqlSessionTemplateRef = "slaverSqlSessionTemplate")
public class SlaverDataSourceConfiguration {
@Value("${spring.datasource.slaver.driver-class-name}")
private String driverClassName;
@Value("${spring.datasource.slaver.url}")
private String url;
@Value("${spring.datasource.slaver.username}")
private String username;
@Value("${spring.datasource.slaver.password}")
private String password;
@Bean(name = "slaverDataSource")
public DataSource dataSource() {
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName(this.driverClassName);
dataSource.setUrl(this.url);
dataSource.setUsername(this.username);
dataSource.setPassword(this.password);
return dataSource;
}
@Bean(name = "slaverSqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(@Qualifier("slaverDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mybatis/slaver/*.xml"));
return bean.getObject();
}
@Bean(name = "slaverTransactionManager")
public DataSourceTransactionManager transactionManager(@Qualifier("slaverDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "slaverSqlSessionTemplate")
public SqlSessionTemplate sqlSessionTemplate(@Qualifier("slaverSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
第四步:业务代码
主库dao 级 xml :
package com.mf.mapper.master;
import com.mf.entity.User;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* @ClassName UserMasterDao
* @Description TODO
* @Author msi
* @Date 2019/8/2 22:12
*/
public interface UserMasterDao {
int addUser(User user);
int deleteUserById(Long id);
int updateUserById(User user);
User queryUserById(Integer id);
List<User> queryUserList();
}
<?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.mf.mapper.master.UserMasterDao" >
<!-- Result Map-->
<resultMap id="BaseResultMap" type="com.mf.entity.User" >
<result column="id" property="id"/>
<result column="name" property="name"/>
<result column="age" property="age"/>
</resultMap>
<!-- th_role_user table all fields -->
<sql id="Base_Column_List" >
id, name, age
</sql>
<insert id="addUser" parameterType="com.mf.entity.User" >
insert into t_user (id, name, age)
values (#{id},#{name},#{age});
</insert>
<delete id="deleteUserById" parameterType="java.lang.Long">
delete from t_user where id=#{id}
</delete>
<update id="updateUserById" parameterType="com.mf.entity.User" >
update t_user set
<trim suffixOverrides="," >
<if test="id != null and id != ''">
id=#{id},
</if>
<if test="name != null and name != ''">
name=#{name},
</if>
<if test="age != null and age != ''">
age=#{age},
</if>
</trim> where id=#{id}
</update>
<select id="queryUserById" resultMap="BaseResultMap" parameterType="java.lang.Integer">
select <include refid="Base_Column_List" />
from t_user where id = #{id}
</select>
<select id="queryUserList" resultMap="BaseResultMap">
select <include refid="Base_Column_List" />
from t_user
</select>
</mapper>
从库库dao 级 xml :
package com.mf.mapper.slaver;
import com.mf.entity.User;
import java.util.List;
/**
* @ClassName UserMasterDao
* @Description TODO
* @Author msi
* @Date 2019/8/2 22:12
*/
public interface UserSlaverDao {
int addUser(User user);
int deleteUserById(Long id);
int updateUserById(User user);
User queryUserById(Integer id);
List<User> queryUserList();
}
<?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.mf.mapper.slaver.UserSlaverDao" >
<!-- Result Map-->
<resultMap id="BaseResultMap" type="com.mf.entity.User" >
<result column="id" property="id"/>
<result column="name" property="name"/>
<result column="age" property="age"/>
</resultMap>
<!-- th_role_user table all fields -->
<sql id="Base_Column_List" >
id, name, age
</sql>
<insert id="addUser" parameterType="com.mf.entity.User" >
insert into t_user (id, name, age)
values (#{id},#{name},#{age});
</insert>
<delete id="deleteUserById" parameterType="java.lang.Long">
delete from t_user where id=#{id}
</delete>
<update id="updateUserById" parameterType="com.mf.entity.User" >
update t_user set
<trim suffixOverrides="," >
<if test="id != null and id != ''">
id=#{id},
</if>
<if test="name != null and name != ''">
name=#{name},
</if>
<if test="age != null and age != ''">
age=#{age},
</if>
</trim> where id=#{id}
</update>
<select id="queryUserById" resultMap="BaseResultMap" parameterType="java.lang.Integer">
select <include refid="Base_Column_List" />
from t_user where id = #{id}
</select>
<select id="queryUserList" resultMap="BaseResultMap">
select <include refid="Base_Column_List" />
from t_user
</select>
</mapper>
service:(在使用事务时需要明确指定具体事务:@Transactional(transactionManager = "masterTransactionManager"))
package com.mf.service;
import com.mf.entity.User;
import com.mf.mapper.master.UserMasterDao;
import com.mf.mapper.slaver.UserSlaverDao;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* @ClassName UserService
* @Description TODO
* @Author msi
* @Date 2019/8/1 21:34
*/
@Service
@Slf4j // Lombok日志注解,需要引入jar包,IDE安装插件
public class UserService {
@Autowired
private UserMasterDao masterDao;
@Autowired
private UserSlaverDao slaverDao;
/**********数据源一************/
public User getUserByid(Integer id){
log.info("###################id:{}", id);
return masterDao.queryUserById(id);
}
// 有事务时的情况下:在当前方法执行完毕前报错,那么sql执行失败,事务回滚。
// 没有事务的情况:在异常前执行的sql仍然生效,sql执行成功。
// 没有指定事务管理器,不然不知道需要回滚哪个事务
// 在这里value 和 transactionManager 一样的效果
// @Transactional(value = "masterTransactionManager")
@Transactional(transactionManager = "masterTransactionManager")
public Integer insertUserTest01(Integer age, String name){
User user = new User();
user.setName(name);
user.setAge(age);
Integer value = masterDao.addUser(user);
// 当age=0 模拟错误,查看事务回滚
int i = 10/age;
return value;
}
/**********数据源二************/
public User getUserSlaveById(Integer id){
return slaverDao.queryUserById(id);
}
@Transactional(value = "slaverTransactionManager")
public Integer insertUserTest02(Integer age, String name){
User user = new User();
user.setName(name);
user.setAge(age);
Integer value = slaverDao.addUser(user);
// 当age=0 模拟错误,查看事务回滚
// int i = 10/age;
return value;
}
}
controller:
package com.mf.controller;
import com.mf.entity.User;
import com.mf.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
/**
* @ClassName UserCOntroller
* @Description TODO
* @Author msi
* @Date 2019/8/1 21:37
*/
@RestController
public class UserController {
@Autowired
private UserService userService;
/**
* 数据库test1
* @param id
* @return
*/
@RequestMapping("/getUser01ById")
public User selectUserById(Integer id){
return userService.getUserByid(id);
}
@RequestMapping("/addUserTest01")
public String addUser1(Integer age, String name){
userService.insertUserTest01(age,name);
return "addUser1成功";
}
/************************************************/
/**
* 数据库test2
* @param id
* @return
*/
@RequestMapping("/getUser02ById")
public User selectUserSlaveById(Integer id){
return userService.getUserSlaveById(id);
}
@RequestMapping("/addUserTest02")
public String addUser2(Integer age, String name){
userService.insertUserTest02(age,name);
return "addUser2成功";
}
}
浏览器访问测试:http://localhost:8084/getUser01ById?id=1
访问 http://localhost:8084/getUser02ById?id=1
至此springboot的多数据源配置成功。
总结:springboot配置多数据源的方法有两种
1.分包名(业务)
2. 注解方式(使用AOP在执行方法前设置指定数据源)。
上面就是根据分包来配置多数据源