本文章实现同一个项目,使用不同的参数,来调取不同数据库的数据。
jar依赖
pom.xml
<!-- springboot的父类依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.RELEASE</version>
</parent>
<dependencies>
<!-- springboot的web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- springboot整合mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency>
<!-- mysql -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
</dependencies>
#配置mybatis
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.my.pojo/**
#日志配置
logging.level.com.project=INFO
logging.level.com.my.mapper=DEBUG
#配置数据库
spring.datasource.db1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.db1.username=root
spring.datasource.db1.password=ManYu2018!
spring.datasource.db1.url=jdbc:mysql://114.55.242.163:3306/myctt?serverTimezone=CTT&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&autoReconnect=true&useSSL=false
spring.datasource.db2.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.db2.username=root
spring.datasource.db2.password=ManYu2018!
spring.datasource.db2.url=jdbc:mysql://47.99.209.209:3306/ctt?serverTimezone=CTT&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true&autoReconnect=true&useSSL=false
实体类
SysUser.java
package com.my.pojo;
import java.util.Date;
public class SysUser {
private Integer id;
private String userName;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName == null ? null : userName.trim();
}
}
注:"com.my.pojo”为实体类的包名。
数据源类
FirstDataSource .java(第一个数据源)
package com.my.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.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
//import org.springframework.core.io.Resource;
//import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
@Configuration
//"basePackages"指明该数据所属的mapper的包路径;"sqlSessionFactoryRef"指明该数据源要使用的"sqlSessionFactory"
@MapperScan(basePackages="com.my.mapper.first",sqlSessionFactoryRef="firstSqlSessionFactory")
public class FirstDataSource {
/**
* 配置第一个DataSource(数据源)
* @return
*/
@Bean(name = "firstDatasource")
@ConfigurationProperties(prefix="spring.datasource.db1")
@Primary
public DataSource testDatasource(){
return DataSourceBuilder.create().build();
}
/**
* 创建第一个SqlSessionFactory
* @param dataSource
* @return
* @throws Exception
*/
@Bean(name="firstSqlSessionFactory")
@Primary
public SqlSessionFactory testSqlSessionFactory(@Qualifier("firstDatasource") DataSource dataSource) throws Exception{
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
// 使用xml方式的需要设置mybatis的xml所在位置,否则会报错
// Resource[] resources = new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml");
// bean.setMapperLocations(resources);
return bean.getObject();
}
/**
* 配置事务管理
* @param dataSource
* @return
*/
@Bean(name="firstTransactionManager")
@Primary
public DataSourceTransactionManager testTransactionManager(@Qualifier("firstDatasource") DataSource dataSource){
return new DataSourceTransactionManager(dataSource);
}
/**
* 创建第一个SqlSessionTemplate
* @param sqlSessionFactory
* @return
*/
@Bean(name="firstSqlSessionTemplate")
@Primary
public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("firstSqlSessionFactory") SqlSessionFactory sqlSessionFactory){
return new SqlSessionTemplate(sqlSessionFactory);
}
}
SecondDataSource.java(第二个数据源)
package com.my.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.autoconfigure.jdbc.DataSourceBuilder;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
@Configuration
//"basePackages"指明该数据所属的mapper的包路径;"sqlSessionFactoryRef"指明该数据源要使用的"sqlSessionFactory"
@MapperScan(basePackages="com.my.mapper.second",sqlSessionFactoryRef="secondSqlSessionFactory")
public class SecondDataSource {
/**
* 配置第二个DataSource(数据源)
* @return
*/
@Bean(name = "secondDatasource")
@ConfigurationProperties(prefix="spring.datasource.db2")
public DataSource testDatasource(){
return DataSourceBuilder.create().build();
}
/**
* 创建第二个SqlSessionFactory
* @param dataSource
* @return
* @throws Exception
*/
@Bean(name="secondSqlSessionFactory")
public SqlSessionFactory testSqlSessionFactory(@Qualifier("secondDatasource") DataSource dataSource) throws Exception{
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
// 使用xml方式的需要设置mybatis的xml所在位置,否则会报错
// Resource[] resources = new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml");
// bean.setMapperLocations(resources);
return bean.getObject();
}
/**
* 配置事务管理
* @param dataSource
* @return
*/
@Bean(name="secondTransactionManager")
public DataSourceTransactionManager testTransactionManager(@Qualifier("secondDatasource") DataSource dataSource){
return new DataSourceTransactionManager(dataSource);
}
/**
* 创建第一个SqlSessionTemplate
* @param sqlSessionFactory
* @return
*/
@Bean(name="secondSqlSessionTemplate")
public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("secondSqlSessionFactory") SqlSessionFactory sqlSessionFactory){
return new SqlSessionTemplate(sqlSessionFactory);
}
}
注:“com.my.datasource"是数据类的包名。在这两个数据源中"FirstDataSource"使用了”@Primary"注解设置成默认数据源。
Mapper层
FirstSysUserMapper.java
package com.my.mapper.first;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.springframework.beans.factory.annotation.Qualifier;
import com.my.pojo.SysUser;
//指明该接口调用哪个数据源数据
@Qualifier("firstSqlSessionFactory")
public interface FirstSysUserMapper {
@Select("select * from sys_user where ID = #{id}")
@Results(id="recPartiesDetailsMap1", value={
@Result(column="ID", property="id", id=true),
@Result(column="USER_NAME", property="userName")
})
SysUser selectSysUserById(@Param("id") Integer id);
}
SecondSysUserMapper.java
package com.my.mapper.second;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import org.springframework.beans.factory.annotation.Qualifier;
import com.my.pojo.SysUser;
//指明该接口调用哪个数据源数据
@Qualifier("secondSqlSessionFactory")
public interface SecondSysUserMapper {
@Select("select * from sys_user where ID = #{id} ")
@Results(id="recPartiesDetailsMap2", value={
@Result(column="ID", property="id", id=true),
@Result(column="USER_NAME", property="userName")
})
List<SysUser> selectSysUserByHosId(@Param("hosId")Integer hosId);
}
注:"com.my.mapper.first"为第一个数据源所属的mapper的包名;"com.my.mapper.second"为第一个数据源所属的mapper的包名。
Service层
SysUserService.java
package com.my.service;
import com.my.pojo.SysUser;
public interface SysUserService {
SysUser findSysUserById(Integer id, Integer type);
}
SysUserServiceImpl.java
package com.my.service.impl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.my.mapper.first.FirstSysUserMapper;
import com.my.mapper.second.SecondSysUserMapper;
import com.my.pojo.SysUser;
import com.my.service.SysUserService;
@Service
public class SysUserServiceImpl implements SysUserService{
@Autowired
private FirstSysUserMapper firstSysUserMapper;
@Autowired
private SecondSysUserMapper secondSysUserMapper;
@Override
public SysUser findSysUserById(Integer id, Integer type) {
List<SysUser> list = null;
if(type == 1){
list = firstSysUserMapper.selectSysUserByHosId(hosId);
}else{
list = secondSysUserMapper.selectSysUserByHosId(hosId);
}
return list;
}
}
注:"com.my.service"为接口的包名;"com.my.service.impl"为实现类的包名。
Controller层
package com.my.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import com.my.pojo.SysUser;
import com.my.service.SysUserService;
@RestController
public class SysUserController {
@Autowired
private SysUserService sysUserService;
@GetMapping("/findSysUserById")
public SysUser findSysUserById(Integer id, Integer type){
return sysUserService.findSysUserById(hosId,type);
}
}
注:"com.my.controller"为"Controller"的包名。
启动类
SpringApplications.java
package com.my.app;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import com.my.app.SpringApplications;
@SpringBootApplication(scanBasePackages={"com.my"})
@MapperScan("com.my.mapper")
public class SpringApplications {
public static void main(String[] args) {
SpringApplication.run(SpringApplications.class, args);
}
}
注:"com.my.app"为启动类的包名。