springboot 配置多数据源(按包划分)

第一步:引入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在执行方法前设置指定数据源)。

上面就是根据分包来配置多数据源

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值