SpringBoot根据包名进行区分使用多数据源

就是让一个项目应用并使用多个数据库,这里采用的是SpringBoot2.0、MySql5.7,使用两个两个MySql数据库

1、建立两个数据库

2、建立一个SpringBoot项目

3、Pom文件

<?xml version="1.0" encoding="utf-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 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>czs</groupId>  
  <artifactId>springboot-manyDatasource</artifactId>  
  <version>0.0.1-SNAPSHOT</version>  
  <packaging>jar</packaging>  
  <name>springboot-manyDatasource</name>  
  <description>springboot使用多个数据源(多个数据库)</description>  
  <parent> 
    <groupId>org.springframework.boot</groupId>  
    <artifactId>spring-boot-starter-parent</artifactId>  
    <version>2.0.0.RELEASE</version>  
    <relativePath/>  
    <!-- lookup parent from repository --> 
  </parent>  
  <properties> 
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>  
    <java.version>1.8</java.version> 
  </properties>  
  <dependencies> 
    <dependency> 
      <groupId>org.springframework.boot</groupId>  
      <artifactId>spring-boot-starter-jdbc</artifactId> 
    </dependency>  
    <dependency> 
      <groupId>org.springframework.boot</groupId>  
      <artifactId>spring-boot-starter-web</artifactId> 
    </dependency>  
    <!-- https://mvnrepository.com/artifact/org.mybatis.spring.boot/mybatis-spring-boot-starter -->  
    <dependency>    
      <groupId>org.mybatis.spring.boot</groupId>     
      <artifactId>mybatis-spring-boot-starter</artifactId>     
      <version>1.3.0</version>
      <!-- 1.3.0以上的版本没有@MapperScan以及@Select注解 --> 
    </dependency>  
    <dependency> 
      <groupId>org.springframework.boot</groupId>  
      <artifactId>spring-boot-devtools</artifactId>  
      <scope>runtime</scope> 
    </dependency>  
    <dependency> 
      <groupId>mysql</groupId>  
      <artifactId>mysql-connector-java</artifactId>  
      <scope>runtime</scope> 
    </dependency>  
    <dependency> 
      <groupId>org.projectlombok</groupId>  
      <artifactId>lombok</artifactId>  
      <optional>true</optional>  
      <version>1.18.2</version> 
    </dependency>  
    <dependency> 
      <groupId>org.springframework.boot</groupId>  
      <artifactId>spring-boot-starter-test</artifactId>  
      <scope>test</scope> 
    </dependency>  
    <dependency> 
      <groupId>org.springframework.boot</groupId>  
      <artifactId>spring-boot-configuration-processor</artifactId>  
      <optional>true</optional> 
    </dependency> 
  </dependencies>  
  <build> 
    <plugins> 
      <plugin> 
        <groupId>org.springframework.boot</groupId>  
        <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin> 
    </plugins> 
  </build> 
</project>

4、书写application.properties文件,配置两个数据库连接

###datasource1
spring.datasource.test1.driver-class-name = com.mysql.jdbc.Driver
spring.datasource.test1.jdbc-url = jdbc:mysql://192.168.25.11:3306/18-08-12-manyDatasource1?useUnicode=true&characterEncoding=utf-8
spring.datasource.test1.username = root
spring.datasource.test1.password = 

###datasource2
spring.datasource.test2.driver-class-name = com.mysql.jdbc.Driver
spring.datasource.test2.jdbc-url = jdbc:mysql://192.168.25.11:3306/18-08-12-manyDatasource2?useUnicode=true&characterEncoding=utf-8
spring.datasource.test2.username = root
spring.datasource.test2.password =

 发现前缀的不同没有?

数据源一是:spring.datasource.test1.   数据源二是:spring.datasource.test2.

这里记着配置文件中配置数据源是有前缀的,第七步记得有这个前缀

5、书写对应数据库的实体类文件

-------此处应用了lombok注解,不懂自行百度学习....

package czs.entity;
import lombok.Data;

/**
* @author czs
* @version 创建时间:2018年8月12日 下午2:30:46 
*/
@Data
public class User {
	private String name;
	private long age;
}

6、书写第一个Dao层的Mapper文件以及Service层

Mapper 

package czs.mapper1;

import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import czs.entity.User;

public interface UserMapper1 {
	// 查询语句
	@Select("SELECT * FROM users WHERE NAME = #{name}")
	User findByName(@Param("name") String name);

	// 添加
	@Insert("INSERT INTO users(NAME, AGE) VALUES(#{name}, #{age})")
	int insert(@Param("name") String name, @Param("age") Integer age);
}

Service

package czs.mapper1;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
* @author czs
* @version 创建时间:2018年8月12日 下午7:28:07 
*/
@Service
public class ManyService1 {
	@Autowired
	private UserMapper1 userMapper1;

	public int insert(String name, Integer age) {
		return userMapper1.insert(name, age);
	}
}

6、书写第二个Dao层的Mapper文件

--------------其实和上面那个想相比就是包名和类名以及Service层中的Mapper引用不同

Mapper 

package czs.mapper2;

import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import czs.entity.User;

public interface UserMapper2 {
	// 查询语句
	@Select("SELECT * FROM users WHERE NAME = #{name}")
	User findByName(@Param("name") String name);

	// 添加
	@Insert("INSERT INTO users(NAME, AGE) VALUES(#{name}, #{age})")
	int insert(@Param("name") String name, @Param("age") Integer age);
}

Service

package czs.mapper2;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
* @author czs
* @version 创建时间:2018年8月12日 下午7:28:07 
*/
@Service
public class ManyService2 {
	@Autowired
	private UserMapper2 userMapper2;

	public int insert(String name, Integer age) {
		return userMapper2.insert(name, age);
	}
}

7、配置数据源、事务管理器

非常重要的一步,也是这个来分配数据源给哪些类包的

注意类中@MapperScan注解中的basePackages的内容!

第4步说过注意前缀,就是在下面的@ConfigurationProperties(prefix = "spring.datasource.test1")中,是根据这个来选择数据源的

package czs.datasource;

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.jdbc.datasource.DataSourceTransactionManager;

/**
 * 读取DataSource01数据源<br>
 */
// DataSource01
@Configuration // 注册到springboot容器中
@MapperScan(basePackages = "czs.mapper1", sqlSessionFactoryRef = "test1SqlSessionFactory")
public class DataSource1Config {

	/**
	 * @methodDesc: 功能描述:(配置test01数据库)
	 */
	@Bean(name = "test1DataSource")
	@ConfigurationProperties(prefix = "spring.datasource.test1")
	public DataSource testDataSource() {
		return DataSourceBuilder.create().build();
	}

	/**
	 * @methodDesc: 功能描述:(test1 sql会话工厂)
	 */
	@Bean(name = "test1SqlSessionFactory")
	public SqlSessionFactory testSqlSessionFactory(@Qualifier("test1DataSource") DataSource dataSource) throws Exception {
		SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
		bean.setDataSource(dataSource);
		//bean.setMapperLocations(
			// new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/test1/*.xml")
		//);
		return bean.getObject();
	}

	/**
	 * @methodDesc: 功能描述:(test1 事物管理)
	 */
	@Bean(name = "test1TransactionManager")
	public DataSourceTransactionManager testTransactionManager(@Qualifier("test1DataSource") DataSource dataSource) {
		return new DataSourceTransactionManager(dataSource);
	}

	@Bean(name = "test1SqlSessionTemplate")
	public SqlSessionTemplate testSqlSessionTemplate( @Qualifier("test1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
		return new SqlSessionTemplate(sqlSessionFactory);
	}
}

8、还是非常重要的一步,也是这个来分配数据源给哪些类包的

就是复制上面那步的类,将@MapperScan注解中的basePackages改为放另一个Mapper接口的包名就好!

以下是两个类中不同的部分。。。。。。。。。。。

@MapperScan(basePackages = "czs.mapper1", sqlSessionFactoryRef = "test1SqlSessionFactory")

@ConfigurationProperties(prefix = "spring.datasource.test1")

@MapperScan(basePackages = "czs.mapper2", sqlSessionFactoryRef = "test1SqlSessionFactory")

@ConfigurationProperties(prefix = "spring.datasource.test2")

9、Controller层

package czs;

import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import czs.mapper1.ManyService1;
import czs.mapper2.ManyService2;

/**
* @author czs
* @version 创建时间:2018年8月12日 下午9:03:02 
*/
@RestController
public class ManyController {

	@Autowired
	private ManyService1 manyService1;

	@Resource
	private ManyService2 manyService2;

	@RequestMapping(value = "datasource1")
	public int datasource1(String name, Integer age) {
		return manyService1.insert(name, age);
	}

	@RequestMapping(value = "datasource2")
	public int datasource2(String name, Integer age) {
		return manyService2.insert(name, age);
	}
}

1   注意要注入两个Service

2   注意有两个@RequestMapping,里面的映射路径不一样

10、尝试访问

11、查看数据库

    数据源一插入成功!

     数据源二插入成功!

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值