在实际项目开发中,我们可能会遇到,想要不改变当前数据库结构的情况下,调用另外一个数据库,这个时候我们就需要用到多数据源了(在文章的底部有本案例有详细的代码提供下载(SpringBoot多数据源案例)),接下来开始具体实现过程的讲解。
1、首先创建一个springBoot的项目。如图:



2、在pom.xml中配置相关的JAR包
- <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>dsjy</groupId>
- <artifactId>dsjy</artifactId>
- <version>0.0.1-SNAPSHOT</version>
- <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-web</artifactId>
- </dependency>
- <!--freemarker支持 -->
- <dependency>
- <groupId>org.springframework.boot</groupId>
- <artifactId>spring-boot-starter-freemarker</artifactId>
- </dependency>
- <!-- mysql驱动 -->
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- </dependency>
- <!--整合mybatis -->
- <dependency>
- <groupId>org.mybatis.spring.boot</groupId>
- <artifactId>mybatis-spring-boot-starter</artifactId>
- <version>1.1.1</version>
- </dependency>
- </dependencies>
- </project>
3、在resource包中创建application.properties文件,并且在文件中配置相应的数据库
- ## test1 database
- spring.datasource.test1.jdbc-url=jdbc:mysql://localhost:3306/mybatisstudy?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
- spring.datasource.test1.username=root
- spring.datasource.test1.password=3edcVFR$
- spring.datasource.test1.driverClassName=com.mysql.jdbc.Driver
- ## test2 database
- spring.datasource.test2.jdbc-url=jdbc:mysql://localhost:3306/mybatisstudy2?useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false
- spring.datasource.test2.username=root
- spring.datasource.test2.password=3edcVFR$
- spring.datasource.test2.driverClassName=com.mysql.jdbc.Driver
4、做完基本配置以后,接下来就需要配置每个数据源的加载类,创建config的数据包,创建test1数据源的加载类,代码如下:
- package com.dsjy.Config;
- 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;
- //这里配置mapper所在的包
- @Configuration
- //配置数据源 basePackages指扫描的mapper目录
- @MapperScan(basePackages="com.dsjy.test1",sqlSessionFactoryRef="test1SqlSessionFactory")
- public class DataSourceConfig1 {
- @Bean(name="test1DataSource")
- @ConfigurationProperties(prefix="spring.datasource.test1")
- @Primary //将数据库作为主数据库
- public DataSource testDataSource()
- {
- return DataSourceBuilder.create().build();
- }
- @Bean(name="test1SqlSessionFactory")
- @Primary
- public SqlSessionFactory testSqlSessionFactory
- (@Qualifier("test1DataSource") DataSource dataSource) throws Exception
- {
- SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
- bean.setDataSource(dataSource);
- //读取mybatis小配置文件
- // bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/test1/*.xml"));
- return bean.getObject();
- }
- @Bean(name="test1TransactionManager")
- @Primary
- public DataSourceTransactionManager testTransactionManager
- (@Qualifier("test1DataSource") DataSource dataSource)
- {
- return new DataSourceTransactionManager(dataSource);
- }
- @Bean(name="test1SqlSessionTemplate")
- @Primary
- public SqlSessionTemplate testSqlSessionTemplate
- (@Qualifier("test1SqlSessionFactory") SqlSessionFactory sqlSessionFactory)
- {
- return new SqlSessionTemplate(sqlSessionFactory);
- }
- }
注:MapperScan使用来扫描对应文件夹下的Mapper,Primary默认将该数据库作为主数据库
test1数据源加载类创建好以后,接下来需要创建test2数据源的加载类,我们可以直接复制test1数据源的加载类,然后修改相应的参数即可,代码如下:
- package com.dsjy.Config;
- 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;
- //这里配置mapper所在的包
- @Configuration
- //配置数据源 basePackages指扫描的mapper目录
- @MapperScan(basePackages="com.dsjy.test2",sqlSessionFactoryRef="test2SqlSessionFactory")
- public class DataSourceConfig2 {
- @Bean(name="test2DataSource")
- @ConfigurationProperties(prefix="spring.datasource.test2")
- public DataSource testDataSource()
- {
- return DataSourceBuilder.create().build();
- }
- @Bean(name="test2SqlSessionFactory")
- public SqlSessionFactory testSqlSessionFactory
- (@Qualifier("test2DataSource") DataSource dataSource) throws Exception
- {
- SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
- bean.setDataSource(dataSource);
- //读取mybatis小配置文件
- // bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/test1/*.xml"));
- return bean.getObject();
- }
- @Bean(name="test2TransactionManager")
- public DataSourceTransactionManager testTransactionManager
- (@Qualifier("test2DataSource") DataSource dataSource)
- {
- return new DataSourceTransactionManager(dataSource);
- }
- @Bean(name="test2SqlSessionTemplate")
- public SqlSessionTemplate testSqlSessionTemplate
- (@Qualifier("test2SqlSessionFactory") SqlSessionFactory sqlSessionFactory)
- {
- return new SqlSessionTemplate(sqlSessionFactory);
- }
- }
注:此加载类中需要去掉primary
5、创建表的数据模型,首先创建一个包名称为entity,然后创建User的模型类(此类可以根据数据库的数据模型来创建,在此就不再贴代码了)
6、创建test1和test2的包,分别将数据源1的mapper和数据源2的mapper创建在对应的包中,代码如下:
- package com.dsjy.test1.dao;
- import java.util.List;
- import org.apache.ibatis.annotations.Delete;
- import org.apache.ibatis.annotations.Insert;
- import org.apache.ibatis.annotations.Mapper;
- import org.apache.ibatis.annotations.Param;
- import org.apache.ibatis.annotations.Select;
- import org.apache.ibatis.annotations.Update;
- import com.dsjy.entity.User;
- @Mapper
- public interface UserMapper1 {
- @Select("select * from mybatis_user where id=${id}")
- public User getUserById(@Param("id") Integer id);
- @Insert("insert into mybatis_user(userName)values(#{userName})")
- public void insertData(@Param("userName") String userName);
- @Select("select * from mybatis_user")
- public List<User> getUser();
- @Delete("delete from mybatis_user where ${id}")
- public void delUser(@Param("id") Integer id);
- @Update("update mybatis_user set userName=#{userName} where id=${id}")
- public void updUserById(@Param("userName") String userName,@Param("id") Integer id);
- }
注:数据源2的mapper的代码和数据源2的代码一样,这里就不再贴具体的代码,如果对 mybatis不太了解的朋友可以参考的我的另外一条博客springBoot中mybatis的使用,在这条博客中有对mybatis的具体讲解。
7、mapper创建完成以后,多数据源的配置就完成了,然后我们就可以创建一个对应的controller来测试一下效果,创建controller的包,然后在包中创建一个UserController的类,代码如下:
- package com.dsjy.Controller;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RestController;
- import com.dsjy.test1.dao.UserMapper1;
- import com.dsjy.test2.dao.UserMapper2;
- @RestController
- public class UserController {
- @Autowired
- private UserMapper1 userMapper1;
- @Autowired
- private UserMapper2 userMapper2;
- @RequestMapping("/insertUser1")
- public String insertUser1(String userName)
- {
- userMapper1.insertData(userName);
- return "success";
- }
- @RequestMapping("/getUser1")
- public Object getUser1(int id)
- {
- return userMapper1.getUserById(id);
- }
- @RequestMapping("/getAllUser1")
- public Object getAllUser1()
- {
- return userMapper1.getUser();
- }
- @RequestMapping("/insertUser2")
- public String insertUser2(String userName)
- {
- userMapper2.insertData(userName);
- return "success";
- }
- @RequestMapping("/getUser2")
- public Object getUser2(int id)
- {
- return userMapper2.getUserById(id);
- }
- @RequestMapping("/getAllUser2")
- public Object getAllUser2()
- {
- return userMapper2.getUser();
- }
- }
8、最后创建springBoot的启动类,类名Application,代码如下:
- package com.dsjy;
- import org.springframework.boot.SpringApplication;
- import org.springframework.boot.autoconfigure.SpringBootApplication;
- @SpringBootApplication
- public class Application {
- public static void main(String[] args) {
- SpringApplication.run(Application.class, args);
- }
- }
最后启动项目,调用相应的接口就可以看到效果了。
SpringBoot多数据源案例 https://download.youkuaiyun.com/download/feritylamb/11390922
本文详细介绍如何在SpringBoot项目中配置多个数据源,并通过示例代码演示具体步骤,包括项目搭建、依赖配置、数据源配置及控制器实现。
989

被折叠的 条评论
为什么被折叠?



