9、SpringBoot-mybatis-druid多源数据多源数据
系列导航
6、SpringBoot-mybatis分页实现pagehelper
9、SpringBoot-mybatis-druid多源数据多源数据
10、SpringBoot-mybatis-plus-druid多源数据
11、SpringBoot-mybatis-plus-druid多源数据事务
12、SpringBoot-mybatis-plus-ehcache
14、SpringBoot-easyexcel导出excle
完结
当一个mybatis工程中想操作多个数据库的时候就需要配置多数据源的工程,这里分享一个例子
1数据库中创建表
zy数据库:
CREATE TABLE TEST_BLOCK_T
(
BLOCK_ID VARCHAR2(10 BYTE) PRIMARY KEY, --编码
BLOCK_NAME VARCHAR2(200 BYTE) --资源名称
);
Insert into TEST_BLOCK_T (BLOCK_ID, BLOCK_NAME) Values ('1', 'java');
COMMIT;
yc数据库:
CREATE TABLE TEST_USER_T
(
USER_ID VARCHAR2(10 BYTE) PRIMARY KEY,
NAME VARCHAR2(200 BYTE)
);
Insert into TEST_USER_T (USER_ID, NAME) Values ('1', '张三');
COMMIT;
2、pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description> <properties>
<java.version>1.8</java.version>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<spring-boot.version>2.1.17.RELEASE</spring-boot.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency> <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> <!-- oracle驱动 -->
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc6</artifactId>
<version>11.2.0.3</version>
</dependency> <!-- 集成druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency> <!-- 集成mybatis -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
</dependencies> <dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement> <build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>UTF-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.1.17.RELEASE</version>
<configuration>
<mainClass>com.example.demo.DemoApplication</mainClass>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build> </project>
3、 application.properties配置
# 应用名称
spring.application.name=demo
# 应用服务 WEB 访问端口
server.port=8080 # druid配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource #mybatis-plus控制台打印sql
mybatis-plus.configuration.log-impl: org.apache.ibatis.logging.stdout.StdOutImpl zy.datasource.username=zy
zy.datasource.password=1
zy.datasource.url=jdbc:oracle:thin:@192.168.0.100:1521:orcl
zy.datasource.driver-class-name=oracle.jdbc.OracleDriver yc.datasource.username=yc
yc.datasource.password=1
yc.datasource.url=jdbc:oracle:thin:@192.168.0.100:1521:orcl
yc.datasource.driver-class-name=oracle.jdbc.OracleDriver
4、文件目录

5、源码
启动类
package com.example.demo; import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication
public class DemoApplication { public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
} }
数据源yc配置类
这里注意指定扫描mapper和xml文件的路径
package com.example.demo.config; import com.alibaba.druid.pool.DruidDataSource;
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager; @Configuration
@MapperScan(basePackages = YcDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "ycSqlSessionFactory")
public class YcDataSourceConfig { /**
* 配置多数据源 关键就在这里 这里配置了不同的数据源扫描不同mapper
*/
static final String PACKAGE = "com.example.demo.mapper.yc";
static final String MAPPER_LOCATION = "classpath:mybatis/yc/mapper/*.xml"; /**
* 连接数据库信息 这个其实更好的是用配置中心完成
*/
@Value("${yc.datasource.url}")
private String url; @Value("${yc.datasource.username}")
private String username; @Value("${yc.datasource.password}")
private String password; @Value("${yc.datasource.driver-class-name}")
private String driverClassName; @Bean("ycDataSource")
public DataSource ycDataSource(){ DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
dataSource.setDriverClassName(driverClassName); return dataSource;
} @Bean(name = "ycTransactionManager")
public DataSourceTransactionManager ycTransactionManager() {
return new DataSourceTransactionManager(ycDataSource());
} @Bean(name = "ycSqlSessionFactory")
public SqlSessionFactory ycSqlSessionFactory(@Qualifier("ycDataSource") DataSource ycDataSource)
throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(ycDataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(YcDataSourceConfig.MAPPER_LOCATION)); return sessionFactory.getObject();
} }
数据源zy配置类
这里注意指定扫描mapper和xml文件的路径
package com.example.demo.config; import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import javax.sql.DataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
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
@MapperScan(basePackages = ZyDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "zySqlSessionFactory")
public class ZyDataSourceConfig { /**
* 配置多数据源 关键就在这里 这里配置了不同的数据源扫描不同mapper
*/
static final String PACKAGE = "com.example.demo.mapper.zy"; static final String MAPPER_LOCATION = "classpath:mybatis/zy/mapper/*.xml";
/**
* 连接数据库信息 这个其实更好的是用配置中心完成
*/
@Value("${zy.datasource.url}")
private String url; @Value("${zy.datasource.username}")
private String username; @Value("${zy.datasource.password}")
private String password; @Value("${zy.datasource.driver-class-name}")
private String driverClassName; // 注解@Primary表示是主数据源
@Bean("zyDataSource")
@Primary
public DataSource zyDataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
dataSource.setDriverClassName(driverClassName); return dataSource;
} //设置登录druid监控的用户名和密码
@Bean
public ServletRegistrationBean druidServlet() {
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
// IP白名单
servletRegistrationBean.addInitParameter("allow", "127.0.0.1");
// IP黑名单(共同存在时,deny优先于allow)
// servletRegistrationBean.addInitParameter("deny", "192.168.1.100");
//控制台管理用户
servletRegistrationBean.addInitParameter("loginUsername", "admin");
servletRegistrationBean.addInitParameter("loginPassword", "admin");
//是否能够重置数据 禁用HTML页面上的“Reset All”功能
servletRegistrationBean.addInitParameter("resetEnable", "false");
return servletRegistrationBean;
} @Bean(name = "zyTransactionManager")
@Primary
public DataSourceTransactionManager zyTransactionManager() {
return new DataSourceTransactionManager(zyDataSource());
} @Bean(name = "zySqlSessionFactory")
@Primary
public SqlSessionFactory zySqlSessionFactory(@Qualifier("zyDataSource") DataSource zyDataSource)
throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(zyDataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources(ZyDataSourceConfig.MAPPER_LOCATION)); return sessionFactory.getObject();
}
}
实体类User
package com.example.demo.domain.yc;
public class User {
private static final long serialVersionUID = 1L;
private String userId;
/**
* $field.comment。
*/
private String name;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "User{" +
"userId='" + userId + '\'' +
", name='" + name + '\'' +
'}';
}
}
实体类block
package com.example.demo.domain.zy;
public class Block {
private static final long serialVersionUID = 1L;
private String blockId;
/**
* $field.comment。
*/
private String blockName;
public String getBlockId() {
return blockId;
}
public void setBlockId(String blockId) {
this.blockId = blockId;
}
public String getBlockName() {
return blockName;
}
public void setBlockName(String blockName) {
this.blockName = blockName;
}
@Override
public String toString() {
return "XyDicBlockT{" +
"blockId='" + blockId + '\'' +
", blockName='" + blockName + '\'' +
'}';
}
}
mapper类
package com.example.demo.mapper.yc;
import com.example.demo.domain.yc.User;
public interface UserMapper {
// 对应xml映射文件元素的ID
User selectByPrimaryKey(String userId);
}
package com.example.demo.mapper.zy;
import com.example.demo.domain.zy.Block;
public interface BlockMapper {
// 对应xml映射文件元素的ID
Block selectByPrimaryKey(String blockId);
}
service类
package com.example.demo.service; import com.example.demo.mapper.yc.UserMapper;
import com.example.demo.mapper.zy.BlockMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; @Service
public class ManySourceService { @Autowired
BlockMapper BlockMapper; @Autowired
UserMapper userMapper; //获取zy库中的block中的数据
public String getZyBlock() {
return BlockMapper.selectByPrimaryKey("1").toString();
} //获取yc库中的user中的数据
public String getYcUser() {
return userMapper.selectByPrimaryKey("1").toString() ;
} }
xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.yc.UserMapper">
<resultMap id="BaseResultMap" type="com.example.demo.domain.yc.User">
<result property="userId" column="USER_ID"/>
<result property="name" column="NAME"/>
</resultMap> <sql id="Base_Column_List">
USER_ID,NAME
</sql>
<select id="selectByPrimaryKey" parameterType="String" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from TEST_USER_T
where USER_ID = #{userId,jdbcType=VARCHAR}
</select>
</mapper>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.demo.mapper.zy.BlockMapper">
<resultMap id="BaseResultMap" type="com.example.demo.domain.zy.Block">
<result property="blockId" column="block_Id"/>
<result property="blockName" column="block_Name"/>
</resultMap> <sql id="Base_Column_List">
block_id,block_name
</sql>
<select id="selectByPrimaryKey" parameterType="String" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from TEST_BLOCK_T
where block_Id = #{blockId,jdbcType=VARCHAR}
</select>
</mapper>
6、启动项目访问项目
(1)访问http://localhost:8080/hello/getZyBlock 成功取到zy库里的数据

(2)访问http://localhost:8080/hello/getYcUser 成功取到yc库里的数据

(3)查看druid的数据源信息
先要执行一下上面两个请求这个页面才能出来(估计是不执行以上请求连接池里没有数据)
浏览器输入:http://localhost:8080/druid/

上下拖动发现有两个数据源

9、SpringBoot-mybatis-druid多源数据多源数据的更多相关文章
- 基于Maven的Springboot+Mybatis+Druid+Swagger2+mybatis-generator框架环境搭建
基于Maven的Springboot+Mybatis+Druid+Swagger2+mybatis-generator框架环境搭建 前言 最近做回后台开发,重新抓起以前学过的SSM(Spring+Sp ...
- 3分钟搞定SpringBoot+Mybatis+druid多数据源和分布式事务
文章来自: https://blog.csdn.net/qq_29242877/article/details/79033287 在一些复杂的应用开发中,一个应用可能会涉及到连接多个数据源,所谓多数据 ...
- springboot+mybatis+druid+atomikos框架搭建及测试
前言 因为最近公司项目升级,需要将外网数据库的信息导入到内网数据库内.于是找了一些springboot多数据源的文章来看,同时也亲自动手实践.可是过程中也踩了不少的坑,主要原因是我看的文章大部分都是s ...
- springboot+mybatis+druid+sqlite/mysql/oracle
搭建springboot+mybatis+druid+sqlite/mysql/oracle附带测试 1.版本 springboot2.1.6 jdk1.8 2.最简springboot环境 http ...
- 记录一下自己搭建springboot+mybatis+druid 多数据源的过程
前言 上次的一个项目(springboot+mybatis+vue),做到后面的时间发现需要用到多数据源.当时没有思路..后来直接用了jdbc来实现.这几天不是很忙,所以决定自己再搭建一次.不多说, ...
- SpringBoot+Mybatis+ Druid+PageHelper 实现多数据源并分页
前言 本篇文章主要讲述的是SpringBoot整合Mybatis.Druid和PageHelper 并实现多数据源和分页.其中SpringBoot整合Mybatis这块,在之前的的一篇文章中已经讲述了 ...
- springboot+mybatis+druid数据库连接池
参考博客https://blog.csdn.net/liuxiao723846/article/details/80456025 1.先在pom.xml中引入druid依赖包 <!-- 连接池 ...
- SpringBoot+Mybatis+Druid批量更新 multi-statement not allow异常
本文链接:https://blog.csdn.net/weixin_43947588/article/details/90109325 注:该文是本博主记录学习之用,没有太多详细的讲解,敬请谅解! ...
- Springboot+mybatis+druid 配置多数据源
项目结构 application.yml配置文件 spring: application: name: service datasource: primary: jdbc-url: jdbc:orac ...
- springboot + mybatis +druid
Druid Spring Boot Starter mybatis-spring-boot-autoconfigure mybatis-spring-boot-samples 新建spring boo ...
随机推荐
- 【ASP.NET Core】MVC过滤器:常见用法
前面老周给大伙伴们演示了过滤器的运行流程,大伙只需要知道下面知识点即可: 1.过滤器分为授权过滤.资源访问过滤.操作方法(Action)过滤.结果过滤.异常过滤.终结点过滤.上一次咱们没有说异常过滤和 ...
- skywalking插件工作原理剖析
1. 官方插件二次开发 前面在介绍skywalking-agent目录时,提到了它有一个插件目录,并支持动态的开发插件.其实skywalking默认已经提供大部分框架的插件了,一般情况下不需要额外开发 ...
- Head First Java学习:第七章-继承和多态
第七章:继承和多态 1. 覆盖(override) 覆盖的意思是由子类重新定义继承下来的方法,以改变或延伸此方法的行为. 2. 继承(extends) 类的成员:实例变量+方法 实例变量无法覆盖是因为 ...
- 解密Prompt系列21. LLM Agent之再谈RAG的召回信息密度和质量
话接上文的召回多样性优化,多路索引的召回方案可以提供更多的潜在候选内容.但候选越多,如何对这些内容进行筛选和排序就变得更加重要.这一章我们唠唠召回的信息密度和质量.同样参考经典搜索和推荐框架,这一章对 ...
- MySQL 8.0.32 InnoDB ReplicaSet 配置和手动切换
1.环境准备 主库:192.168.137.4 mytest3 从库:192.168.137.5 mytest4 MySQL: 8.0.32 2.配置 ReplicaSet 实例 启动 mysql s ...
- 持续集成Jenkins
一.简单慨念 持续集成(Continuous integration,简称 CI),随着近几年的发展,持续集成在项目中 得到了广泛的推广和应用. 软件集成就是用一种较好的方式,使多种软件的功能集成到一 ...
- CentOS 7 NTP服务端和客户端详细配置
参考: https://blog.csdn.net/ankang654321/article/details/103542015 ntp同步时间实验 服务端IP 192.168.1.101 ...
- libGDX游戏开发之打包游戏(十二)
libGDX游戏开发之打包游戏(十二) libGDX系列,游戏开发有unity3D巴拉巴拉的,为啥还用java开发?因为我是Java程序员emm-国内用libgdx比较少,多数情况需要去官网和goog ...
- ensp命令行大全
命令符从用户视图切换到系统视图 system–view 从系统视图切换到用户视图 quit 连入接口命令 interface IP地址 子网掩码配置命令 ip address 接口IP信息查看命令 d ...
- CodeForces 1105D 嵌套BFS
CodeForces 1105D 嵌套BFS 题意 - 给我们一个n*m的阵列,一个格子如果是#则为障碍,若为.则为空,若为数字,则代表这个格子属于该数字代表的玩家. - 给我们每个玩家(不到十个)的 ...