springboot+mybatis整合多个数据源

12 篇文章 0 订阅
9 篇文章 0 订阅

本文章实现同一个项目,使用不同的参数,来调取不同数据库的数据。

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"为启动类的包名。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值