mysql-plus多数据库_IDEA项目搭建九——MybatisPlus多数据库实现

一、简介

MybatisPlus中引用多数据库时,传统的配置就失效了,需要单独写配置来实现,下面就说一下具体应该如何操作

二、引入MybatisPlus多数据源配置

还是先看一下我的项目结构,Model是单独的模块,请自行创建

2dea29b60c97ae4957caf2159331f140.png

1、创建一个Maven项目,修改pom.xml文件增加对spring boot、mybatis plus、druid、mysql connector的引用

org.springframework.boot

spring-boot-dependencies

2.0.3.RELEASE

pom

import

org.springframework.boot

spring-boot-starter-web

com.alibaba

druid-spring-boot-starter

1.1.10

mysql

mysql-connector-java

5.1.9

com.baomidou

mybatis-plus-boot-starter

2.3

2、创建resources文件夹,并创建application.yml文件增加以下配置,此处不需要写mybatis plus的配置了,因为多数据源时这里的mybatis plus会失效,具体原因还没找到

#设置提供的服务名

spring:

application:

name: javademo-tyh-service-hotel#配置数据库

datasource:

type: com.alibaba.druid.pool.DruidDataSource

db1:

url: jdbc:mysql://10.11.12.237:3306/db_test?useUnicode=true&characterEncoding=utf8

username: root

password: root

driver-class-name: com.mysql.jdbc.Driver

db2:

url: jdbc:mysql://10.11.12.237:3306/tyh_test?useUnicode=true&characterEncoding=utf8

username: root

password: root

driver-class-name: com.mysql.jdbc.Driver#设置自己启动的端口

server:

port:12000

3、在resources文件夹下创建mapper文件夹,在其内部创建两个数据库的两张表的mapper.xml文件,分别编写一个自定义方法

BaseInfoMapper.xml

select count(*) from base_info;

UserInfoMapper.xml

select count(*) from user_info;

4、打开main方法所在的类并修改为如下代码

importorg.mybatis.spring.annotation.MapperScan;importorg.springframework.boot.SpringApplication;importorg.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication

@MapperScan("javademo.tyh.service.hotel.mapper")//标记扫描的mapper位置

public classAppServiceHotel

{public static voidmain( String[] args )

{

SpringApplication.run(AppServiceHotel.class, args);

}

}

5、创建config文件夹,存放mybatis plus的相关配置,此内部的类很多都摘自官网,是按照他的方式进行实现的

创建枚举DBTypeEnum

/*** 多数据源枚举*/

public enumDBTypeEnum {

db1("db1"), db2("db2");privateString value;

DBTypeEnum(String value) {this.value =value;

}publicString getValue() {returnvalue;

}

}

创建数据源操作类DbContextHolder

public classDbContextHolder {private static final ThreadLocal contextHolder = new ThreadLocal<>();/*** 设置数据源

*@paramdbTypeEnum*/

public static voidsetDbType(DBTypeEnum dbTypeEnum) {

contextHolder.set(dbTypeEnum.getValue());

}/*** 取得当前数据源

*@return

*/

public staticString getDbType() {return(String) contextHolder.get();

}/*** 清除上下文数据*/

public static voidclearDbType() {

contextHolder.remove();

}

}

创建spring的DataSource抽象类 DynamicDataSource

importorg.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;/** 扩展Spring的AbstractRoutingDataSource抽象类,实现动态数据源。

* AbstractRoutingDataSource中的抽象方法determineCurrentLookupKey是实现数据源的route的核心,

* 这里对该方法进行Override。 【上下文DbContextHolder为一线程安全的ThreadLocal】*/

public class DynamicDataSource extendsAbstractRoutingDataSource {/*** 取得当前使用哪个数据源

*@return

*/@OverrideprotectedObject determineCurrentLookupKey(){returnDbContextHolder.getDbType();

}

}

创建MybatisPlusConfig配置类

importcom.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;importcom.baomidou.mybatisplus.MybatisConfiguration;importcom.baomidou.mybatisplus.entity.GlobalConfiguration;importcom.baomidou.mybatisplus.mapper.LogicSqlInjector;importcom.baomidou.mybatisplus.plugins.PaginationInterceptor;importcom.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean;importorg.apache.ibatis.plugin.Interceptor;importorg.apache.ibatis.session.SqlSessionFactory;importorg.apache.ibatis.type.JdbcType;importorg.springframework.beans.factory.annotation.Qualifier;importorg.springframework.boot.context.properties.ConfigurationProperties;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;importorg.springframework.context.annotation.Primary;importorg.springframework.core.io.support.PathMatchingResourcePatternResolver;importjavax.sql.DataSource;importjava.util.HashMap;importjava.util.Map;/*** MybatisPlus配置*/@Configurationpublic classMybatisPlusConfig {//分页拦截器

@BeanpublicPaginationInterceptor paginationInterceptor() {return newPaginationInterceptor();

}//定义db1

@Bean(name = "db1")

@ConfigurationProperties(prefix= "spring.datasource.db1")//与配置文件中的层次结构相同

publicDataSource db1() {returnDruidDataSourceBuilder.create().build();

}//定义db2

@Bean(name = "db2")

@ConfigurationProperties(prefix= "spring.datasource.db2")//与配置文件中的层次结构相同

publicDataSource db2() {returnDruidDataSourceBuilder.create().build();

}/*** 动态数据源配置

*@return

*/@Bean

@Primarypublic DataSource multipleDataSource(@Qualifier("db1") DataSource db1, @Qualifier("db2") DataSource db2) {

DynamicDataSource dynamicDataSource= newDynamicDataSource();

Map targetDataSources = new HashMap<>();

targetDataSources.put(DBTypeEnum.db1.getValue(), db1);

targetDataSources.put(DBTypeEnum.db2.getValue(), db2);

dynamicDataSource.setTargetDataSources(targetDataSources);

dynamicDataSource.setDefaultTargetDataSource(db1);returndynamicDataSource;

}

@Bean("sqlSessionFactory")public SqlSessionFactory sqlSessionFactory() throwsException {//***导入MybatisSqlSession配置***

MybatisSqlSessionFactoryBean sqlSessionFactory = newMybatisSqlSessionFactoryBean();//指明数据源

sqlSessionFactory.setDataSource(multipleDataSource(db1(), db2()));//指明mapper.xml位置(配置文件中指明的xml位置会失效用此方式代替,具体原因未知)

sqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:/mapper/**Mapper.xml"));//指明实体扫描(多个package用逗号或者分号分隔)

sqlSessionFactory.setTypeAliasesPackage("javademo.tyh.model.base;javademo.tyh.model.hotel");//***导入Mybatis配置***

MybatisConfiguration configuration = newMybatisConfiguration();

configuration.setJdbcTypeForNull(JdbcType.NULL);

configuration.setMapUnderscoreToCamelCase(true);

configuration.setCacheEnabled(false);

sqlSessionFactory.setConfiguration(configuration);

sqlSessionFactory.setPlugins(newInterceptor[]{paginationInterceptor()});//***导入全局配置***

sqlSessionFactory.setGlobalConfig(globalConfiguration());returnsqlSessionFactory.getObject();

}/*** 在代码中配置MybatisPlus替换掉application.yml中的配置

*@return

*/@BeanpublicGlobalConfiguration globalConfiguration() {

GlobalConfiguration conf= new GlobalConfiguration(newLogicSqlInjector());//主键类型 0:数据库ID自增, 1:用户输入ID,2:全局唯一ID (数字类型唯一ID), 3:全局唯一ID UUID

conf.setIdType(0);//字段策略(拼接sql时用于判断属性值是否拼接) 0:忽略判断,1:非NULL判断,2:非空判断

conf.setFieldStrategy(2);//驼峰下划线转换含查询column及返回column(column下划线命名create_time,返回java实体是驼峰命名createTime,开启后自动转换否则保留原样)

conf.setDbColumnUnderline(true);//是否动态刷新mapper

conf.setRefresh(true);returnconf;

}

}

6、创建mapper文件夹用于存放于xml对应的mapper接口

BaseInfoMapper

importcom.baomidou.mybatisplus.mapper.BaseMapper;importjavademo.tyh.model.hotel.BaseInfoModel;importorg.springframework.stereotype.Component;

@Componentpublic interface BaseInfoMapper extends BaseMapper{//自定义方法

intlistCount();

}

UserInfoMapper

importcom.baomidou.mybatisplus.mapper.BaseMapper;importjavademo.tyh.model.hotel.UserInfoModel;importorg.springframework.stereotype.Component;

@Componentpublic interface UserInfoMapper extends BaseMapper{//自定义方法

intlistCount();

}

7、创建service文件夹用于存放业务逻辑类

importjavademo.tyh.model.hotel.BaseInfoModel;importjavademo.tyh.model.hotel.UserInfoModel;importjavademo.tyh.service.hotel.config.DBTypeEnum;importjavademo.tyh.service.hotel.config.DbContextHolder;importjavademo.tyh.service.hotel.mapper.BaseInfoMapper;importjavademo.tyh.service.hotel.mapper.UserInfoMapper;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Service;

@Servicepublic classHotelService {

@Autowired

BaseInfoMapper baseMapper;

@Autowired

UserInfoMapper userMapper;public voidtestDynamicDb() {//使用db1

DbContextHolder.setDbType(DBTypeEnum.db1);

BaseInfoModel baseModel= baseMapper.selectById(1);int baseCount =baseMapper.listCount();

System.out.println("db1=" +baseModel.getNickname());//使用db2

DbContextHolder.setDbType(DBTypeEnum.db2);

UserInfoModel userModel= userMapper.selectById(1);int userCount =userMapper.listCount();

System.out.println("db2=" +userModel.getUsername());

}

}

8、创建controller文件夹编写一个controller和action用于测试

importjavademo.tyh.service.hotel.service.HotelService;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.stereotype.Controller;importorg.springframework.web.bind.annotation.RequestMapping;importorg.springframework.web.bind.annotation.ResponseBody;

@Controller

@RequestMapping("/hotel")public classHotelController {

@Autowired

HotelService service;

@ResponseBody

@RequestMapping("/test")public voidtest() {

service.testDynamicDb();

}

}

9、创建自己的实体Model,get/set方法自己生成吧

BaseInfoModel

importcom.baomidou.mybatisplus.annotations.TableName;importjava.time.LocalDateTime;

@TableName("base_info")public classBaseInfoModel {private intid;privateString nickname;privateLocalDateTime updateTime;

}

UserInfoModel

importcom.baomidou.mybatisplus.annotations.TableName;importjava.time.LocalDateTime;

@TableName("user_info")public classUserInfoModel {private intid;privateString username;privateString password;private intsex;private intage;privateLocalDateTime createTime;

}

OK,至此Mybatis Plus多数据源配置Demo就完成了,可以运行http://localhost:12000/hotel/test看一下console控制台会得到以下输出,db1和db2就切换成功了

38b2f4f5762a3b7a83d8023771714df8.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/366421.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字逻辑基础篇1

1. 双阈值准则在模拟条件下&#xff0c;假设点亮灯泡需要1.7V以上电压。抽象为数字电路&#xff0c;可以认为&#xff1a; U>1.7V U1 U<1.7V U0 这种条件称之为单阈值&#xff08;1.7&#xff09;&#xff0c;但是单阈值导致的问题是&#xff1a; 电压在1.7V附近…

Neo4j:在Neo4j浏览器的帮助下探索新数据集

当我查看一个新的Neo4j数据库时&#xff0c;发现困难之一是确定其中包含的数据的结构。 我习惯于关系数据库&#xff0c;在该数据库中您可以轻松地获取表列表和外键&#xff0c;从而使它们彼此连接。 传统上&#xff0c;使用Neo4j时很难做到这一点&#xff0c;但是随着Neo4j浏…

V8 —— 你需要知道的垃圾回收机制

前言V8 blog近日发布了文章描述了“并发标记”的新技术&#xff0c;提升标记过程的效率。并发标记是一个主要用新的平行和并发的垃圾收集器替换旧的垃圾回收器的项目&#xff0c;现在Chrome 64和Node.js v10已经默认启用并发标记。讲解之前我们先回顾一下基本知识点。基本概念 …

词法分析器java_Java代码到底是如何编译成机器指令的。

原文地址&#xff1a;https://mp.weixin.qq.com/s/XH-JajAne0O7_yCYE5wBbg作者&#xff1a;Hollis在《Java代码的编译与反编译》中&#xff0c;有过关于Java语言的编译和反编译的介绍。我们可以通过javac命令将Java程序的源代码编译成Java字节码&#xff0c;即我们常说的class文…

python中的PEP是什么?怎么理解?(转)

PEP是什么&#xff1f; PEP的全称是Python Enhancement Proposals&#xff0c;其中Enhancement是增强改进的意思&#xff0c;Proposals则可译为提案或建议书&#xff0c;所以合起来&#xff0c;比较常见的翻译是Python增强提案或Python改进建议书。 我个人倾向于前一个翻译&…

2017前端技术大盘点

前言 临近2017的尾声&#xff0c;总是希望来盘点一下这一年中前端的发展。到目前为止&#xff0c;前端的井喷期也快临近尾声了。并不像几年前一样&#xff0c;总是会有层出不穷的新东西迸发出来。同时&#xff0c;前端技术也慢慢的趋于稳固&#xff0c;自成一套体系。如果你喜…

jenkins pipeline api获取stage的详细信息_Jenkins + Docker 助力 Serverless 应用构建与部署...

本文来源&#xff1a; ServerlessLife 公众号近日&#xff0c;使用 Serverless 开发了一个应用。其中 CI/CD&#xff0c;是需要考虑的一个问题。这里用到了 Jenkins 和 Docker。并且 Jenkins Pipeline 运行在容器中。本文将介绍如何使用 Jenkins 和 Docker 构建并部署 Serverle…

项目本地部署

1.将数据库导出&#xff0c;并导入到本地 exp dgpdg/pass192.168.1.33/ORCL fileD:\gd_base.dmp logD:\gd_base.log&#xff08;不要加fully&#xff0c;会把整个数据库下所有用户的表倒下来&#xff09; imp dgpdg/pass127.0.0.1/orcl file"D:\gd_base.dmp" log&quo…

命名空间不能直接包含字段或方法之类的成员是什么意思_Python 学习笔记之类与实例...

Python 学习笔记之类与实例一、定义1.1、定义类 (class) 封装一组相关数据&#xff0c;使之成为一个整体&#xff0c;并使用一种方法持续展示和维护。这有点像把零件组装成整车提供给用户&#xff0c;无须了解汽车的内部结构和工作原理&#xff0c;只要知道方向盘&#xff0c;刹…

跨平台开发框架 Lynx 初探

跨平台开发是目前开发较热门的方向&#xff0c;React Native 在这方面取得了很大的成功&#xff0c;同时 Flutter 也获得了非常多的关注。React Native 采用 Web 框架开发并使用 Native UI 进行渲染&#xff0c;很大程度上降低了 Native 开发的门槛并且提高迭代的效率&#xff…

ajax包含mysql吗_php 实例ajax与mysql怎么只查询出一条数据?

http://www.runoob.com/php/php...使用这个实例操作之后为什么只显示一条数据&#xff0c;如何让符合条件的数据全部显示出来如&#xff0c;我使用的查询字段是yesterday_str&#xff0c;查询2017-04-18这个数据怎么样才能把2017-04-18包含这个的全部数据提取出来&#xff1f;p…

aspx写入mysql_Asp.net用户登陆数据库验证与注册写入数据库

1.思路与效果图Index.aspx注册注册成功登陆登陆验证通过进入内容页1登陆没通过验证思路&#xff1a;首先建一个Sqlserver数据库Student,再建一个student表(name,pwd)存放用户名和密码。然后注册功能的实现&#xff1a;通过数据库插入信息到表的Sql语句来实现&#xff0c;成功提…

页面体验提升小技巧—渐进式图片

前端性能方面有许多可优化的点&#xff0c;而这些优化带来的就是用户体验的提升。今天我们要聊的东西并不能给性能带来提升&#xff0c;但却能在一定程度上提升用户的体验。 参考博客 场景&#xff1a;在访问页面的时候如果图片较大或者网速慢的情况我们会看到图片加载起来是有…

微信小程序搭配小白接口,自己没有服务器也能开发哦

这里将重点介绍&#xff0c;在自己没有服务器的情况下&#xff0c;如何在微信小程序里直接调用小白接口。 前提 假设你已经开通微信小程序&#xff0c;如果还没有&#xff0c;可前往微信公众平台开通&#xff1a;https://mp.weixin.qq.com 假设你已经开通小白接口&#xff0c…

怎么将自己做好的网站发布到互联网上呢?

如何将自己的网站上传到网站空间。 1.需要有一个上传网站的软件&#xff0c;在这里推荐大家使用 FTP全称是flashfxp这个软件&#xff0c;这个功能功能齐全而且操作简单。大家可以先去下载一下这个软 件 2. 打开FTP&#xff0c;界面如下 3.我们要点击链接按钮&#xff0c;然后FT…

[贝聊科技]网页端「应用跳转」技术实现演变

本文作者&#xff1a;Mr.Luo &#xff0c;贝聊前端经理。本文同时发布于作者 个人博客 。 由于网页传播的便捷性&#xff0c;从网页向APP导流几乎是所有APP厂商都会采用的推广手段&#xff0c;具体来说就是在网页上提供一些触发点&#xff08;例如按钮、链接&#xff09;&#…

Linux服务器配置---安装vsftpd

安装vsftpd 大多数Linux系统都使用vsftpd&#xff0c;因此这里我们也安装vsftpd 1、安装vsftpd [rootlocalhost phpMyAdmin]# yum install -y vsftpd Loaded plugins: fastestmirror, refresh-packagekit, security Installed: vsftpd.i686 0:2.2.2-11.el6_4.1 …

mysql怎么制作柱状图_从数据库中取出最近三十天的数据并生成柱状图

在终端用cd 命令进入文件目录说明&#xff1a;此处例子我是拿项目中的一个例子讲解的。1、新建一个项目 &#xff1a;用终端输入&#xff1a;zf create project Airline 格式&#xff1a;zf create action project project-name 备注&#xff1a;这些格式可以在终端输入zf 查看…

关于ES6的Promise

JavaScript的异步处理 提到JavaScript的异步处理&#xff0c;也许很多人和我一样想到利用回调函数。 例如&#xff1a; firstAsync(function(data){//处理得到的 data 数据//....secondAsync(function(data2){//处理得到的 data2 数据//....thirdAsync(function(data3){//处…

[转]我是如何走进黑客世界的?

*本文原创作者&#xff1a;MyselfExplorer&#xff1b;翻译编辑&#xff1a;楼兰&#xff0c;本文属FreeBuf原创奖励计划&#xff0c;未经许可禁止转载 我想给你一把打开这扇门的钥匙&#xff0c;而你要做的便是静静的聆听接下来的故事。挖掘 0day 一般需要掌握fuzzing&#xf…