IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> Spring boot:Spring boot配置多数据源 -> 正文阅读

[Java知识库]Spring boot:Spring boot配置多数据源

?
关于Spring boot配置多数据源问题
1、首先需要在application.yml文件中添加两个数据源。具体格式如下:

datasource:
    ip: localhost
    port: 5432
    dbName: Test
    test1:
     username: postgres
     password: postgres
     jdbc-url:     
jdbc:postgresql://${spring.datasource.ip}:${spring.datasource.port}/${spring.datasource.dbName}
     driverClassName: org.postgresql.Driver
    test2:
     username: postgres
     password: 123456
     jdbc-url: jdbc:postgresql://192.168.1.103:5432/Student
     driverClassName: org.postgresql.Driver

2、由于Spring boot的自动装载不适用于多数据源,所以应该为每一个数据源各创建一个手动配置的配置文件。

注意:默认数据源配置文件里的每个方法都需要加@Primary注解,表示此数据源为默认数据源,不加的话Spring boot找不到默认的数据源

**默认数据源:**
package com.test.demo.config;

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 javax.sql.DataSource;
 
@Configuration
//数据源mapper接口所在包
@MapperScan(basePackages = "com.test.demo.dao.test1", sqlSessionFactoryRef = "db1SqlSessionFactory")
public class DataSourceConfig1 {

    @Primary 
    @Bean("db1DataSource")
    @ConfigurationProperties(prefix = "spring.datasource.test1") 
    public DataSource getDb1DataSource(){
        return DataSourceBuilder.create().build();
    }

    @Primary
    @Bean("db1SqlSessionFactory")
    public SqlSessionFactory db1SqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        //数据源的mapper.xml所在位置(具体到xml文件)
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:**/com/test/**/dao/test1/mapping/*Mapper.xml"));
        return bean.getObject();
    }

    @Primary
    @Bean("db1SqlSessionTemplate")
    public SqlSessionTemplate db1SqlSessionTemplate(@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory){
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

其他数据源:

package com.test.demo.config;

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.core.io.support.PathMatchingResourcePatternResolver;
 
import javax.sql.DataSource;
@Configuration
@MapperScan(basePackages = "com.test.demo.dao.test2", sqlSessionFactoryRef = "db2SqlSessionFactory")
public class DataSourceConfig2 {

    @Bean("db2DataSource")
    @ConfigurationProperties(prefix = "spring.datasource.test2")
    public DataSource getDb1DataSource(){
        return DataSourceBuilder.create().build();
    }

    @Bean("db2SqlSessionFactory")
    public SqlSessionFactory db1SqlSessionFactory(@Qualifier("db2DataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:**/com/test/**/dao/test2/mapping/*Mapper.xml"));
        return bean.getObject();
    }

    @Bean("db2SqlSessionTemplate")
    public SqlSessionTemplate db1SqlSessionTemplate(@Qualifier("db2SqlSessionFactory") SqlSessionFactory sqlSessionFactory){
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

3、由于Spring boot启动类的@Mapperscan和各数据源的@Mapperscan只能生效一种,且同时存在时以启动类优先,故应取消启动类的@Mapperscan注解

package com.test.demo;

import java.io.UnsupportedEncodingException;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication(scanBasePackages = "com.test")
@EnableScheduling
//@MapperScan("com.test.demo.dao")
public class DemoApplication {
	public static void main(String[] args) throws UnsupportedEncodingException {	
		SpringApplication.run(DemoApplication.class, args);  
	}
}

4、在为每个数据源编写Mapper接口及xml时,应按数据源将这些文件区分在不同的包下。

区分好包后,多数据源就配好了。写两个测试类:
Controller
test1

@RequestMapping(value="/getStudentList",method=RequestMethod.GET)
public List<Map<String,Object>> getStudentList() {
	return studentService.getStudentList();
}
test2
@RequestMapping(value="/getStudentsList",method=RequestMethod.GET)
	public List<Map<String,Object>> getStudentsList() {
		return userService.getStudentsList();
	}

ServiceImpl
test1:

@Override
public List<Map<String, Object>> getStudentList() {
	List<Map<String, Object>> studentList = null;
	try {
		studentList = studentMapper.getStudentList();
		return studentList;
	}catch(Exception e){
		log.error("getStudentList error ,errorMessage:{}", e.getMessage());
		return studentList;
	}
}
test2:
	@Override
public List<Map<String, Object>> getStudentsList() {
	List<Map<String, Object>> studentList = null;
	try {
		studentList = studentsMapper.getStudentsList();
		return studentList;
	}catch(Exception e){
		System.out.println(e);
		return studentList;
	}
}

Test1Mapper.xml

<mapper namespace="com.test.demo.dao.test1.StudentMapper">
<select id="getStudentList" resultType="java.util.LinkedHashMap" >
		SELECT
			tbl_student_info.student_id,
			student_name AS NAME,
			student_sex AS sex,
			student_age AS age,
			tbl_grade_info.grade_id AS gradeId,
			tbl_class_info.class_id AS classId,
		CASE 
			WHEN student_post = '' 
				THEN '' 
			WHEN student_post IS NULL 
				THEN '' 
			ELSE concat ( grade_name, class_name, student_post ) 
		END AS post 
		FROM
			tbl_student_conn
			LEFT JOIN tbl_student_info ON tbl_student_conn.student_id = tbl_student_info.student_id
			LEFT JOIN tbl_class_info ON tbl_student_conn.class_id = tbl_class_info.class_id
			LEFT JOIN tbl_grade_info ON tbl_student_conn.grade_id = tbl_grade_info.grade_id
		WHERE 
			tbl_student_info.deleted=0
		ORDER BY tbl_student_info.student_id ASC
	</select>
</mapper>

Test2Mapper.xml

<mapper namespace="com.test.demo.dao.test2.StudentMapper">
<select id="getStudentList" resultType="java.util.LinkedHashMap" >
		SELECT
			tbl_student_info.student_id,
			student_name AS NAME,
			student_sex AS sex,
			student_age AS age,
			tbl_grade_info.grade_id AS gradeId,
			tbl_class_info.class_id AS classId,
		CASE 
			WHEN student_post = '' 
				THEN '' 
			WHEN student_post IS NULL 
				THEN '' 
			ELSE concat ( grade_name, class_name, student_post ) 
		END AS post 
		FROM
			tbl_student_conn
			LEFT JOIN tbl_student_info ON tbl_student_conn.student_id = tbl_student_info.student_id
			LEFT JOIN tbl_class_info ON tbl_student_conn.class_id = tbl_class_info.class_id
			LEFT JOIN tbl_grade_info ON tbl_student_conn.grade_id = tbl_grade_info.grade_id
		WHERE 
			tbl_student_info.deleted=0
		ORDER BY tbl_student_info.student_id ASC
	</select>
</mapper>

test1的运行结果
Test1运行结果
test2的运行结果
test2的运行结果

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章           查看所有文章
加:2021-07-14 22:59:17  更:2021-07-14 23:00:30 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/18 16:49:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码