Java基础之《mybatis-plus多数据源配置》

1、pom文件引入依赖
引入MyBatis-Plus之后请不要再次引入MyBatis以及mybatis-spring-boot-starter和MyBatis-Spring,以避免因版本差异导致的问题

		<!--引入 MyBatis-Plus 之后请不要再次引入 MyBatis 以及 mybatis-spring-boot-starter和MyBatis-Spring,以避免因版本差异导致的问题--><!--<dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>${spring-boot.mybatis}</version></dependency>--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>${mybatis-plus.version}</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-annotation</artifactId><version>${mybatis-plus.version}</version></dependency>

2、DataSourceConfig.java
数据源

package cn.xxx.coupon.pay.config;import javax.sql.DataSource;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 com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceBuilder;@Configuration
public class DataSourceConfig {@Primary@ConfigurationProperties(prefix = "spring.datasource.druid.one")@Bean(name = "dsOne")public DataSource dsOne() {return DruidDataSourceBuilder.create().build();}@ConfigurationProperties(prefix = "spring.datasource.druid.two")@Bean(name = "dsTwo")public DataSource dsTwo() {return DruidDataSourceBuilder.create().build();}}

3、MybatisPlusConfigOne.java
配置mybatis-plus第一个数据库的SqlSessionFactory和SqlSessionTemplate

package cn.xxx.coupon.pay.config;import javax.sql.DataSource;import org.apache.ibatis.logging.stdout.StdOutImpl;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;@Configuration
@MapperScan(basePackages = "cn.xxx.coupon.pay.mapper.dsOne", sqlSessionFactoryRef = "dsOneSqlSessionFactory", sqlSessionTemplateRef = "dsOneSqlSessionTemplate")
public class MybatisPlusConfigOne {@Bean(name = "dsOneSqlSessionFactory")public SqlSessionFactory dsOneSqlSessionFactory(@Qualifier("dsOne") DataSource datasource) throws Exception {MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();// 设置mybatis的xml所在位置// bean.setMapperLocations(new// PathMatchingResourcePatternResolver().getResources("classpath*:mapper/db2/*.xml"));// configuration配置bean// MybatisConfiguration configuration = new MybatisConfiguration();// configuration.setMapUnderscoreToCamelCase(true); //数据库字段下划线到Java的驼峰的映射,默认true// configuration.setCacheEnabled(true); //是否支持mybatis的二级缓存,默认true// 配置打印sql语句// configuration.setLogImpl(StdOutImpl.class);// 添加自定义配置// bean.setConfiguration(configuration);// 设置datasourcebean.setDataSource(datasource);// 插件对象MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();// 分页插件mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));bean.setPlugins(mybatisPlusInterceptor);return bean.getObject();}@Bean(name = "dsOneSqlSessionTemplate")public SqlSessionTemplate dsOneSqlSessionTemplate(@Qualifier("dsOneSqlSessionFactory") SqlSessionFactory sessionFactory) {return new SqlSessionTemplate(sessionFactory);}
}

4、MybatisPlusConfigTwo.java
配置mybatis-plus第二个数据库的SqlSessionFactory和SqlSessionTemplate

package cn.xxx.coupon.pay.config;import javax.sql.DataSource;import org.apache.ibatis.logging.stdout.StdOutImpl;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;@Configuration
@MapperScan(basePackages = "cn.xxx.coupon.pay.mapper.dsTwo", sqlSessionFactoryRef = "dsTwoSqlSessionFactory", sqlSessionTemplateRef = "dsTwoSqlSessionTemplate")
public class MybatisPlusConfigTwo {@Bean(name = "dsTwoSqlSessionFactory")public SqlSessionFactory dsTwoSqlSessionFactory(@Qualifier("dsTwo") DataSource datasource) throws Exception {MybatisSqlSessionFactoryBean bean = new MybatisSqlSessionFactoryBean();// 设置mybatis的xml所在位置// bean.setMapperLocations(new// PathMatchingResourcePatternResolver().getResources("classpath*:mapper/db2/*.xml"));// configuration配置bean// MybatisConfiguration configuration = new MybatisConfiguration();// configuration.setMapUnderscoreToCamelCase(true); //数据库字段下划线到Java的驼峰的映射,默认true// configuration.setCacheEnabled(true); //是否支持mybatis的二级缓存,默认true// 配置打印sql语句// configuration.setLogImpl(StdOutImpl.class);// 添加自定义配置// bean.setConfiguration(configuration);// 设置datasourcebean.setDataSource(datasource);// 插件对象MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();// 分页插件mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));bean.setPlugins(mybatisPlusInterceptor);return bean.getObject();}@Bean(name = "dsTwoSqlSessionTemplate")public SqlSessionTemplate dsTwoSqlSessionTemplate(@Qualifier("dsTwoSqlSessionFactory") SqlSessionFactory sessionFactory) {return new SqlSessionTemplate(sessionFactory);}
}

5、@MapperScan和dao层@Mapper二选一

6、定义接口类BranchInfoMapper.java

package cn.xxx.coupon.pay.mapper.dsTwo;import com.baomidou.mybatisplus.core.mapper.BaseMapper;import cn.xxx.coupon.pay.dto.commodity.BranchInfo;public interface BranchInfoMapper extends BaseMapper<BranchInfo> {}

7、测试代码MybatisPlusTest.java

package cn.xxx.coupon.pay.test.coupon;import java.util.List;import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;import cn.xxx.coupon.pay.PreCouponPayApplication;
import cn.xxx.coupon.pay.dto.commodity.BranchInfo;
import cn.xxx.coupon.pay.mapper.dsTwo.BranchInfoMapper;@SpringBootTest(classes = PreCouponPayApplication.class)
public class MybatisPlusTest {@Autowiredprivate BranchInfoMapper branchInfoMapper;@Testpublic void testSelectList() {System.out.println(("----- selectAll method test ------"));List<BranchInfo> branchInfos = branchInfoMapper.selectList(null);branchInfos.forEach(System.out::println);}@Testpublic void testSelectOne() {System.out.println(("----- selectOne method test ------"));QueryWrapper<BranchInfo> queryWrapper = new QueryWrapper<>();queryWrapper.eq("storecode", "012999");queryWrapper.eq("issue_id", "80501");BranchInfo branchInfo = branchInfoMapper.selectOne(queryWrapper);System.out.println(branchInfo);}@Testpublic void testSelectPage() {QueryWrapper<BranchInfo> queryWrapper = new QueryWrapper<>();Page<BranchInfo> page = new Page<>(2, 30);Page<BranchInfo> branchInfoPage = branchInfoMapper.selectPage(page, queryWrapper);System.out.println("当前页:" + branchInfoPage.getCurrent());System.out.println("每页记录数:" + branchInfoPage.getSize());System.out.println("总记录数:" + branchInfoPage.getTotal());System.out.println("总页数:" + branchInfoPage.getPages());List<BranchInfo> branchInfoList = branchInfoPage.getRecords();branchInfoList.forEach(System.out::println);}
}

8、问题1:启动日志会打印两遍mybatis-plus的logo

 _ _   |_  _ _|_. ___ _ |    _ 
| | |\/|_)(_| | |_\  |_)||_|_\ /               |         3.5.5 _ _   |_  _ _|_. ___ _ |    _ 
| | |\/|_)(_| | |_\  |_)||_|_\ /               |         3.5.5 

9、问题2:eclipse里mybatis-plus自动提示显示中文乱码
Window -> Preferences -> General -> Workspace,找到Text file encoding,设置为UTF-8,保存重启eclipse

10、小结mybatis-plus使用方式
方式一:
自定义xxxMapper接口并继承BaseMapper接口,提供默认方法

方式二:
用IService接口,提供默认方法
(1)自定义xxxService接口并继承IService
(2)自定义接口实现类xxxServiceImpl,并继承ServiceImpl,并实现xxxService接口
IBranchInfoService.java

package cn.xxx.coupon.pay.mapper.service;import com.baomidou.mybatisplus.extension.service.IService;import cn.xxx.coupon.pay.dto.commodity.BranchInfo;/*** 在自己定义的service接口当中继承IService接口*/
public interface IBranchInfoService extends IService<BranchInfo> {}

IBranchInfoServiceImpl.java

package cn.xxx.coupon.pay.mapper.service.Impl;import org.springframework.stereotype.Service;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;import cn.xxx.coupon.pay.dto.commodity.BranchInfo;
import cn.xxx.coupon.pay.mapper.dsTwo.BranchInfoMapper;
import cn.xxx.coupon.pay.mapper.service.IBranchInfoService;/*** 在接口实现impl当中继承ServiceImpl,实现自己的接口*/
@Service
public class IBranchInfoServiceImpl extends ServiceImpl<BranchInfoMapper, BranchInfo> implements IBranchInfoService {}

方式三:
复杂sql在mapper中用@Select、@Update、@Insert、@Delete自定义sql语句
BranchInfoMapper.java

package cn.xxx.coupon.pay.mapper.dsTwo;import org.apache.ibatis.annotations.Select;import com.baomidou.mybatisplus.core.mapper.BaseMapper;import cn.xxx.coupon.pay.dto.commodity.BranchInfo;public interface BranchInfoMapper extends BaseMapper<BranchInfo> {@Select("select storecode, locname, loctype, supzone, supzonename, afbmerchantid, issue_id from t_afb_branchinfo where storecode = #{storeCode} and issue_id = #{issueId}")public BranchInfo selectBranchInfoByStoreCode(String storeCode, String issueId);
}

方式四:
复杂sql在mapper中使用@SelectProvider、@UpdateProvider、@InsertProvider、@DeleteProvider注解结合对应的Provider类,以及动态sql注解来实现动态生成sql语句

方式五:
是方式二和方式三的结合,在自定义接口实现类xxxServiceImpl调用mapper类里写好的方法。外部只调用service类不调用mapper类

11、测试类

package cn.xxx.coupon.pay.test.coupon;import java.util.List;import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;import cn.xxx.coupon.pay.PreCouponPayApplication;
import cn.xxx.coupon.pay.dto.commodity.BranchInfo;
import cn.xxx.coupon.pay.mapper.dsTwo.BranchInfoMapper;
import cn.xxx.coupon.pay.mapper.service.IBranchInfoService;@SpringBootTest(classes = PreCouponPayApplication.class)
public class MybatisPlusTest {@Autowiredprivate BranchInfoMapper branchInfoMapper;@Autowiredprivate IBranchInfoService iBranchInfoService;@Testpublic void testSelectList() {System.out.println(("----- selectAll method test ------"));List<BranchInfo> branchInfos = branchInfoMapper.selectList(null);branchInfos.forEach(System.out::println);}/*** >:gt* =:eq* <:lt* >=:ge* <=:le*/@Testpublic void testSelectOne() {System.out.println(("----- selectOne method test ------"));QueryWrapper<BranchInfo> queryWrapper = new QueryWrapper<>();queryWrapper.eq("storecode", "012999");queryWrapper.eq("issue_id", "80501");BranchInfo branchInfo = branchInfoMapper.selectOne(queryWrapper);System.out.println(branchInfo);}@Testpublic void testSelectPage() {QueryWrapper<BranchInfo> queryWrapper = new QueryWrapper<>();Page<BranchInfo> page = new Page<>(2, 30);Page<BranchInfo> branchInfoPage = branchInfoMapper.selectPage(page, queryWrapper);System.out.println("当前页:" + branchInfoPage.getCurrent());System.out.println("每页记录数:" + branchInfoPage.getSize());System.out.println("总记录数:" + branchInfoPage.getTotal());System.out.println("总页数:" + branchInfoPage.getPages());List<BranchInfo> branchInfoList = branchInfoPage.getRecords();branchInfoList.forEach(System.out::println);}@Testpublic void testSelectList2() {System.out.println(("----- selectAll method test2 ------"));List<BranchInfo> branchInfos = iBranchInfoService.list();branchInfos.forEach(System.out::println);}@Testpublic void testSelectOne2() {System.out.println(("----- selectOne method test2 ------"));BranchInfo branchInfo = branchInfoMapper.selectBranchInfoByStoreCode("012999", "80501");System.out.println(branchInfo);}}

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

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

相关文章

【C++】STL_ string的使用 + 模拟实现

前言 目录 1. STL简介&#xff08;1&#xff09;什么是STL&#xff08;2&#xff09;STL的版本&#xff08;3&#xff09;STL的六大组件 2. string的使用2.1 npos2.2 遍历字符串string的每一个字符2.3 迭代器&#xff1a;2.4 string的内存管理2.5 string模拟实现2.5.1 深拷贝&a…

Redis(主从复制搭建)

文章目录 1.主从复制示意图2.搭建一主多从1.搭建规划三台机器&#xff08;一主二从&#xff09;2.将两台从Redis服务都按照同样的方式配置&#xff08;可以理解为Redis初始化&#xff09;1.安装Redis1.yum安装gcc2.查看gcc版本3.将redis6.2.6上传到/opt目录下4.进入/opt目录下然…

iptables---防火墙

防火墙介绍 防火墙的作用可以理解为是一堵墙&#xff0c;是一个门&#xff0c;用于保护服务器安全的。 防火墙可以保护服务器的安全&#xff0c;还可以定义各种流量匹配的规则。 防火墙的作用 防火墙具有对服务器很好的保护作用&#xff0c;入侵者必须穿透防火墙的安全防护…

第V章-Ⅰ Vue3路由vue-router初识

第V章-Ⅰ Vue3路由vue-router初识 安装Vue路由基础router-link 组件导航router-view 路由出口单独导入关于路由的库文件定义路由组件定义路由规则对象创建router实例将路由对象挂载Vue实例上redirect 路由重定向嵌套路由 路由传参params形式传参query形式传参params方式与query…

Leetcode—1991. 找到数组的中间位置【简单】

2024每日刷题&#xff08;129&#xff09; Leetcode—1991. 找到数组的中间位置 实现代码 class Solution { public:int findMiddleIndex(vector<int>& nums) {int sum accumulate(nums.begin(), nums.end(), 0);int prefix 0;for(int i 0; i < nums.size();…

考情分析 | 2025年西北工业大学计算机考研考情分析!

西北工业简称西工大&#xff08;英文缩写NPU&#xff09;&#xff0c;大学坐落于古都西安&#xff0c;是我国唯一一所以同时发展航空、航天、航海工程教育和科学研究为特色&#xff0c;以工理为主&#xff0c;管、文、经、法协调发展的研究型、多科性和开放式的科学技术大学。十…

代码随想录-算法训练营day33【贪心算法03:K次取反后最大化的数组和、加油站、分发糖果】

代码随想录-035期-算法训练营【博客笔记汇总表】-CSDN博客 第八章 贪心算法 part03● 1005.K次取反后最大化的数组和 ● 134. 加油站 ● 135. 分发糖果 详细布置 1005.K次取反后最大化的数组和 本题简单一些&#xff0c;估计大家不用想着贪心 &#xff0c;用自己直觉也会有…

怎么制作好玩的gif?试试这个工具轻松制作

视频之所以受大众的喜爱是因为有声音、画面的搭配&#xff0c;让观者深入其中体验感会更强。但是视频的体积较大、时长也比较长&#xff0c;给我们的传播和保存造成了一定的影响。那么&#xff0c;我们可以将视频制作成gif图片来使用&#xff0c;不需要下载软件&#xff0c;使用…

最大数字——蓝桥杯十三届2022国赛大学B组真题

问题分析 这道题属于贪心加回溯。所有操作如果能使得高位的数字变大必定优先用在高位&#xff0c;因为对高位的影响永远大于对低位的影响。然后我们再来分析一下&#xff0c;如何使用这两种操作&#xff1f;对于加操作&#xff0c;如果能使这一位的数字加到9则变成9&#xff0…

LeetCode-hot100题解—Day6

原题链接&#xff1a;力扣热题-HOT100 我把刷题的顺序调整了一下&#xff0c;所以可以根据题号进行参考&#xff0c;题号和力扣上时对应的&#xff0c;那么接下来就开始刷题之旅吧~ 1-8题见LeetCode-hot100题解—Day1 9-16题见LeetCode-hot100题解—Day2 17-24题见LeetCode-hot…

UE5自动生成地形一:地形制作

UE5自动生成地形一&#xff1a;地形制作 常规地形制作地形编辑器地形管理添加植被手动修改部分地形的植被 置换贴图全局一致纹理制作地貌裸露岩石地形实例 常规地形制作 地形制作入门 地形导入部分 选择模式&#xff1a;地形模式。选择地形子菜单&#xff1a;管理->导入 …

STC8增强型单片机开发——C51版本Keil环境搭建

一、目标 了解C51版本Keil开发环境的概念和用途掌握C51版本Keil环境的安装和配置方法熟悉C51版本Keil开发环境的使用 二、准备工作 Windows 操作系统Keil C51 安装包&#xff08;可以从Keil官网下载&#xff09;一款8051单片机开发板 三、搭建流程 环境搭建的基本流程&#xf…

思维导图网页版哪个好?2024年值得推荐的8个在线思维导图软件!

思维导图如今已成为一种常用的工具&#xff0c;帮助我们清晰地组织和整理信息。随着科技的发展&#xff0c;思维导图的产品形态也经过多轮迭代&#xff0c;从最初的本地客户端过渡到基于云的 Web 端&#xff0c;各类网页版思维导图软件应运而生&#xff0c;它们方便快捷&#x…

【Linux】gcc/g++的使用

&#x1f389;博主首页&#xff1a; 有趣的中国人 &#x1f389;专栏首页&#xff1a; Linux &#x1f389;其它专栏&#xff1a; C初阶 | C进阶 | 初阶数据结构 小伙伴们大家好&#xff0c;本片文章将会讲解Linux中gcc/g使用的相关内容。 如果看到最后您觉得这篇文章写得不错…

【Linux】CAN根据时钟频率、波特率计算采样点详解

1、采样点知识回顾 参考博客:【CAN】知识点:帧类型、数据帧结构、传输速率、位时间、采样点 CAN 采样点是指在一个数据位的传输周期内,接收器实际采样数据的时间点。这个时间点是以百分比来表示的,它决定了在数据位的传输周期中,何时读取数据位的值。 正确设置采样点对…

js api part3

环境对象 环境对象&#xff1a; 指的是函数内部特殊的 变量 this &#xff0c; 它代表着当前函数运行时所处的环境 作用&#xff1a; 弄清楚this的指向&#xff0c;可以让我们代码更简洁 函数的调用方式不同&#xff0c;this 指代的对象也不同 【谁调用&#xff0c; this 就是…

Qt | QLineEdit 类(行编辑器)

01、上节回顾 Qt | QComboBox(组合框)02、QLineEdit 1、QLineEdit 类是 QWidget 类的直接子类,该类实现了一个单行的 输入部件,即行编辑器,见右图 2、验证器(QValidator 类)和输入掩码简介:主要作用是验证用户输入的字符是否符合验证器 的要求,即限制对用户的输入,比…

【C#_变量_格式化输出_If语句_微信猜拳_第一篇】

C#&#xff08;编程入门&#xff09; 练习来自腾讯课堂免费课程1.1.基本输出语句基本输出语句——知识点总结Console.Clear();清屏字符串和数字区分Console.ReadLine(); 1.2.变量的基本使用&#xff1a;变量的基本使用——知识点总结 1.3.格式化输出格式化输出——知识点总结 1…

01 设计模式--单例模式

1. 单例模式 单例模式有两种实现方式&#xff1a; 1.1 饿汉模式&#xff08;Eager Initialization&#xff09;&#xff1a;在类加载时就创建单例实例&#xff0c;无论是否需要使用该实例。 饿汉模式在类加载时就创建单例实例&#xff0c;无论是否需要使用该实例。 饿汉模式…

C++ Primer 中文版(第 5 版)-第二单元

第二单元 练习 2.1 通过读下面程序&#xff0c;写出程序运行结果。 #include <iostream>int main() {unsigned u 10, u2 42;std::cout << u2 - u << std::endl;std::cout << u - u2 << std::endl;int i 10, i2 42;std::cout << i2 …