SpringBoot 配置多数据源

SpringBoot 配置多数据源

    • 建mapper和XML

之前一直没想过这个问题,直到有一天项目经理和我说能不能再关联一个数据库,往里面存数据。然后他给我展示他是咋样连两个数据库的,因为他用的是PHP ,贼简单,,,两段代码配置数据源就行了,。我觉得java应该不难吧,然后上网一查,崩溃啊。真麻烦诶,麻烦也得搞,于是就有了这篇文章。
首先说一下我自己的项目结构,配置文件还是老旧的application.properties,用的是eclipse,也无法换成yml文件(有可能是我还不知道),持久层在mapper文件夹下面,xml文件在resources里面,
SpringBoot 配置多数据源_第1张图片 SpringBoot 配置多数据源_第2张图片 SpringBoot 配置多数据源_第3张图片
这里我使用的是按包来区分两个数据源,大家一起来看代码吧!

##首先在配置文件中配置两个数据源

SpringBoot 配置多数据源_第4张图片
数据源中用前缀区分:
bbs为一个数据源,test为另一个数据源,分别代表两个数据库
SpringBoot 配置多数据源_第5张图片
建database包配置两个数据源
在这里插入图片描述
详细代码如下

package com.muzijin.bbs.database;

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.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

@Configuration//注冊到spring容器中
//配置mapper扫描的包
@MapperScan(basePackages="com.muzijin.bbs.mapper1",sqlSessionFactoryRef="bbsSqlSessionFactory")
public class DataSource1 {
	/**
	 * 配置bbs数据库
	 */
	@Bean(name= "bbsDataSource")//名字可以自定义,和下面的同名参数保持一致即可
	@ConfigurationProperties(prefix="spring.datasource.bbs")//取前缀为spring.datasource.bbs的配置
	@Primary//设置默认数据库
	public DataSource testDataSource() {
		return DataSourceBuilder.create().build();	
	}
	@Bean(name="bbsSqlSessionFactory")
	@Primary
	public SqlSessionFactory testSqlSessionFactory(@Qualifier("bbsDataSource")DataSource dataSource) throws Exception {
		SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
		bean.setDataSource(dataSource);
		bean.setMapperLocations(
				// 设置mybatis的xml所在位置
				new PathMatchingResourcePatternResolver().getResources("classpath*:mappers/mapper1/*.xml"));
		return bean.getObject();
	}
	/**
	 * 配置事务管理器
	 * @param dataSource
	 * @return
	 */
	@Bean(name="bbsTransactionManager")
	@Primary
	public  DataSourceTransactionManager testTransactionManager(@Qualifier("bbsDataSource")DataSource dataSource) {
		return new DataSourceTransactionManager(dataSource);
	}
	@Bean(name="bbsSqlSessionTemplate")
	@Primary
	public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("bbsSqlSessionFactory")SqlSessionFactory sqlSessionFactory) {
		return new SqlSessionTemplate(sqlSessionFactory);
	}
}

package com.muzijin.bbs.database;

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.context.properties.ConfigurationPropertiesBinding;
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.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

@Configuration//注冊到spring容器中
@MapperScan(basePackages="com.muzijin.bbs.mapper2",sqlSessionFactoryRef="testSqlSessionFactory")
public class DataSource2 {
	/**
	 * 配置bbs数据库
	 */
	@Bean(name= "testDataSource")
	@ConfigurationProperties(prefix="spring.datasource.test")
	public DataSource testDataSource() {
		return DataSourceBuilder.create().build();	
	}
	@Bean(name="testSqlSessionFactory")
	@Primary
	public SqlSessionFactory testSqlSessionFactory(@Qualifier("testDataSource")DataSource dataSource) throws Exception {
		SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
		bean.setDataSource(dataSource);
		bean.setMapperLocations(
				// 设置mybatis的xml所在位置
				new PathMatchingResourcePatternResolver().getResources("classpath*:mappers/mapper2/*.xml"));
		return bean.getObject();
	}
	@Bean(name="testTransactionManager")
	public  DataSourceTransactionManager testTransactionManager(@Qualifier("testDataSource")DataSource dataSource) {
		return new DataSourceTransactionManager(dataSource);
	}
	@Bean(name="testSqlSessionTemplate")
	public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("testSqlSessionFactory")SqlSessionFactory sqlSessionFactory) {
		return new SqlSessionTemplate(sqlSessionFactory);
	}
}


两个类配置不同的数据源,需要注意的就是

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

引号中的字符串为你配置文件中的前缀

@MapperScan(basePackages="com.muzijin.bbs.mapper2",sqlSessionFactoryRef="testSqlSessionFactory")

前面的配置是配置对应mapper的包名,后面的变量名以及name="" 都可以自定义,保持一致就行

bean.setMapperLocations(
				// 设置mybatis的xml所在位置
				new PathMatchingResourcePatternResolver().getResources("classpath*:mappers/mapper2/*.xml"));

这一行的参数是配置对应的xml文件,一般情况把引号后面的改了就行了

建mapper和XML

SpringBoot 配置多数据源_第6张图片
SpringBoot 配置多数据源_第7张图片
为了区分,把之前的mapper包分为mapper1和mapper2两个包,mapper2里面存放的是test这个数据库的持久层接口

这样配置完,基本上就完成了,剩下步骤就和平时一样了,先写一个测试供参考

获取test数据库下的urldata表的数据
SpringBoot 配置多数据源_第8张图片

package com.muzijin.bbs.mapper2;


import com.muzijin.bbs.entity.UrlData;

public interface UrlDataMapper {
	UrlData find();
}

urldata实体类的数据就不看了

<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"      
	"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="com.muzijin.bbs.mapper2.UrlDataMapper">
	<select id="find" resultType="com.muzijin.bbs.entity.UrlData">
		SELECT
			corpId
		FROM
			urldata
		WHERE
			id=1
	</select>
	
</mapper>

测试类

package com.muzijin.bbs.mapper;


import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import com.muzijin.bbs.entity.UrlData;
import com.muzijin.bbs.mapper2.UrlDataMapper;
@RunWith(SpringRunner.class)
@SpringBootTest
public class UrlDataMapperTestCase {
	@Autowired
	private UrlDataMapper mapper;
	@Test
	public void test() {
		System.err.println(mapper);
		UrlData data = mapper.find();
		System.err.println("data:"+data);
	}

}

结果
在这里插入图片描述
文章写得不好大家多见谅.有什么问题欢迎留言!

你可能感兴趣的:(笔记,SpringBoot,Mysql,多数据库源)