mybatis plus当月数据查询_Springboot+mybatis(plus)+druid多数据源

前言:

我不太喜欢AOP读自定义注解来切换数据源.因为如果我一个业务里需要同时查2个数据源的数据而又不想把这个业务拆成2个方法的时候,就比较麻烦了.

所以我打算根据package来扫描注入不同的DataSource.可能是我搜索的姿势不太对 , 资料比较少.也会碰到不少坑.所以记录一下.

正文:

mybatis 和 mybatisplus的区别不大 ,一起记了.

springboot 和 mybatis jar就不说了.

druid的jar⬇️

<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.1</version>
</dependency>
  1. 配置数据库连接信息
spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedruid:# psi 库psi:url: jdbc:postgresql://127.0.0.1:5432/psidbdriver-class-name: org.postgresql.Driverusername: usernamepassword: password# b2b 库b2badapter:url: jdbc:mysql://127.0.0.1:13306/b2b?useSSL=false&zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=UTF-8&characterSetResults=UTF-8&allowMultiQueries=truedriver-class-name: com.mysql.jdbc.Driverusername: usernamepassword: username

其实就是在spring.datasource.druid下再指定2个连接.

2.有了连接信息, 就去代码配置DataSource的Bean了.

@Configuration
public class DataSourceConfig {/*** PSI 库连接配置前缀 (与 yml 中的连接信息前缀一致 , 下同)*/private static final String PSI_DATASOURCE_PREFIX = "spring.datasource.druid.psi";/*** PSI 库连接Bean名字*/public static final String PSI_DATASOURCE_BEAN_NAME = "psiDataSource";/*** B2B 库中间库连接配置前缀*/private static final String B2B_DATASOURCE_PREFIX = "spring.datasource.druid.b2badapter";/*** B2B 库中间库连接Bean名字*/public static final String B2B_DATASOURCE_BEAN_NAME = "b2bDataSource";@Primary@Bean(name = PSI_DATASOURCE_BEAN_NAME)@ConfigurationProperties(prefix = PSI_DATASOURCE_PREFIX)public DruidDataSource psi() {return new DruidDataSource();}@Bean(name = B2B_DATASOURCE_BEAN_NAME)@ConfigurationProperties(prefix = B2B_DATASOURCE_PREFIX)public DruidDataSource b2b() {return new DruidDataSource();}
}

这个@Primary还是有点用, 等下说.

3.配置每个库对应的SqlSessionFactory

以第一个库(psi)举例

@Configuration
@MapperScan(basePackages = "com.a.b.c.d.e.psi.dao", sqlSessionTemplateRef = "psiSqlSessionTemplate")
public class PsiDataSourceConfig {@Autowired@Qualifier(DataSourceConfig.PSI_DATASOURCE_BEAN_NAME)private DataSource psi;@Primary@Bean("psiSqlSessionFactory")public SqlSessionFactory psiSqlSessionFactory() throws Exception {MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean();factoryBean.setDataSource(psi);MybatisConfiguration configuration = new MybatisConfiguration();configuration.setDefaultScriptingLanguage(MybatisXMLLanguageDriver.class);configuration.setJdbcTypeForNull(JdbcType.NULL);factoryBean.setConfiguration(configuration);//指定xml路径.factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:com/a/b/c/d/e/psi/mapper/*Dao.xml"));return factoryBean.getObject();}@Primary@Bean("psiSqlSessionTemplate")public SqlSessionTemplate psiSqlSessionTemplate() throws Exception {SqlSessionTemplate template = new SqlSessionTemplate(psiSqlSessionFactory()); // 使用上面配置的Factoryreturn template;}
}

算了, 第二个也放上来吧

@Configuration
@MapperScan(basePackages = "com.a.b.c.d.e.b2b.dao", sqlSessionTemplateRef = "b2bSqlSessionTemplate")
public class B2BDataSourceConfig {@Autowired@Qualifier(DataSourceConfig.B2B_DATASOURCE_BEAN_NAME)private DataSource b2b;@Bean("b2bSqlSessionFactory")public SqlSessionFactory b2bSqlSessionFactory() throws Exception {MybatisSqlSessionFactoryBean factoryBean = new MybatisSqlSessionFactoryBean();factoryBean.setDataSource(b2b);MybatisConfiguration configuration = new MybatisConfiguration();configuration.setDefaultScriptingLanguage(MybatisXMLLanguageDriver.class);configuration.setJdbcTypeForNull(JdbcType.NULL);factoryBean.setConfiguration(configuration);//指定xml路径.factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:com/a/b/c/d/e/b2b/mapper/*Dao.xml"));factoryBean.setPlugins(new Interceptor[]{new PaginationInterceptor(),new PerformanceInterceptor(),new OptimisticLockerInterceptor()});return factoryBean.getObject();}@Bean("b2bSqlSessionTemplate")public SqlSessionTemplate b2bSqlSessionTemplate() throws Exception {SqlSessionTemplate template = new SqlSessionTemplate(b2bSqlSessionFactory()); // 使用上面配置的Factoryreturn template;}
}
这个配置是MybatisPlus的MybatisSqlSessionFactoryBean,通过这个类才能使用MybatisPlus的BaseMapper

如果只是Mybatis的话...

@Bean
public SqlSessionFactory mysqlSqlSessionFactory() throws Exception {SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();factoryBean.setDataSource(b2b);//指定xml路径.factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:com/a/b/c/d/e/b2b/mapper/*Dao.xml"));return factoryBean.getObject();
}

普通的SqlSessionFactoryBean就行了..

这2个数据源就是通过类上的

@MapperScan(basePackages = "com.a.b.c.d.e.b2b.dao")

来扫描项目不同包下的Mapper文件来注入不同的数据源.

如果,万一,在某些情况下. 2个MapperScan扫描到重复的包怎么办.....谁有@Primary就谁上..

4.最后的最后.去掉springboot/jpa,druid等的自动配置

在启动类上(当然你也可以在yml里去配)加上

@SpringBootApplication(exclude = {DruidDataSourceAutoConfigure.class,DataSourceAutoConfiguration.class,HibernateJpaAutoConfiguration.class,DataSourceTransactionManagerAutoConfiguration.class,JpaRepositoriesAutoConfiguration.class
})
如果是Mybatis的话,.. 只用去掉DataSourceAutoConfiguration.class应该就行了

/..

然后, 没了吧. 就可以用了.

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

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

相关文章

mybatis里mapper.xml中SQL语句if语句嵌套if语句

为了实现一个sql可以根据条件不同实现sql语句的动态查询&#xff0c;所以在使用mybatis时&#xff0c;对应的mapper.xml的sql语句可以根据条件值的不同执行不同的sql语句&#xff0c; 最开始在我的where子句中我的if语句是这么写的&#xff1a; <where><if test"…

脚手架 mixin (混入)

可以把多个组件共用的配置提取成一个混入对象 使用方式&#xff1a; 定义混合 {data() {},methods() {}... }使用混合 // 1. 引入混合 import {hunhe1, hunhe2} from /..mixin/// 1. 在 main.js 中全局混入&#xff1a; Vue.mixin(hunhe1)// 2. 局部混入 mixins: [hunhe1]

ug冲模标准件库_昆山兴模lt;携手gt;武汉益模,打通冲模“智能设计+精益管理”的最后一道关卡...

武汉益模科技股份有限公司是国内领先的工业互联网及智能制造的解决方案提供商&#xff0c;为模具、装备、军工、汽车、家电及等有柔性化生产需求的工厂提供专业的智能设计/信息化管理/智能加工/数字化工厂等工业软件、工业机器人自动化以及智能装备&#xff0c;拥有麦格纳、安波…

SpringBoot 异常回滚 事务的使用___Springboot @Transactional 事务不回滚

Springboot中事务的使用&#xff1a; 1、启动类加上EnableTransactionManagement注解&#xff0c;开启事务支持&#xff08;其实默认是开启的&#xff09;。 2、在使用事务的public&#xff08;只有public支持事务&#xff09;方法&#xff08;或者类-相当于该类的所有public…

简述网络调研的作用_利用龙伯球透镜天线提升高铁4G网络覆盖

透镜天线&#xff0c;一种能够通过电磁波&#xff0c;将点源或线源的球面波或柱面波转换为平面波从而获得笔形、扇形或其他形状波束的天线。通过合适设计透镜表面形状和折射率 n&#xff0c;调节电磁波的相速以获得辐射口径上的平面波前。透镜天线吸收了许多光信息工程技术&…

脚手架 插件

一、定义插件 plugin.js --> export default{} --> install() --> // 全局过滤器 Vue.filter(myFilter, function (value) {return value.slice(0, 4); });// 全局指令 Vue.directive("fbind", {bind(element, binding) {element.value binding.value;},i…

SQLIntegrityConstraintViolationException: 异常解决

SQLIntegrityConstraintViolationException: Duplicate entry ‘xxx’ for key yyyzzz’异常解决 一. 异常现象 在做Java Web项目操作数据库添加数据的时候&#xff0c;突然发现曝出如下图所示异常&#xff1a; Caused by: java.sql.SQLIntegrityConstraintViolationExceptio…

scoped 样式

一、加不加 scoped &#xff1f; 加上之后&#xff0c;让样式在局部生效&#xff0c;防止冲突 <!-- a.vue --> <style lang"less" scoped> #bg-red {background-color: #f00; } </style>不加&#xff0c;相当于是定义的全局样式&#xff0c;每个…

一步怎么测量图片_测量不容易?15套测量仪器实操手册+自动计算表格,自学也可以...

测量不容易&#xff1f;15套测量仪器实操手册自动计算表格&#xff0c;自学也可以很多施工羡慕测量工资高&#xff0c;但是测量工资高也就意味着责任大&#xff0c;施工在休息的时候测量就下工地了&#xff0c;施工聚会的时候&#xff0c;测量在埋头苦算。如果施工想要干测量该…

controller的异常处理以及service层的事务控制___controller层 trycatch不影响service层抛出的异常

controller的异常处理以及service层的事务控制 最近写代码涉及到一些事务&#xff0c;上午终于把代码给理顺了&#xff0c;之前不太清楚在哪里做异常处理&#xff0c;导致代码遍地try-catch&#xff0c;相当难看。 还是基于controller-service-dao三层来写代码&#xff0c;从…

Java 中判断一个字符串是否包含另外一个字符串的方法

方法一&#xff1a;indexOf(String s) 可以配合indexOf(String s)的使用&#xff0c;如果包含&#xff0c;返回的值是包含该子字符串在父类字符串中起始位置&#xff1b;如果不包含必定全部返回值为-1 public void test02() {String str1"张三";String str2"是…

速看!销冠高效给客户群发消息的秘诀

你是不是也有过这样的疑问&#xff1a;明明都是给客户群发消息&#xff0c;为什么别人的成交率那么高&#xff0c;自己却效果一般呢&#xff1f; 今天就给大家分享销冠常用的高效群发消息秘诀&#xff0c;让大家都能更好地与客户进行沟通&#xff0c;提高成交率&#xff01; …

不显示_电脑不显示桌面图标怎么办?

在现在这个社会时代中&#xff0c;人们对电脑的使用频率非常的高&#xff0c;电脑可以说已经成为了大家在生活中不可或缺的必备品。但是在使用电脑过程中的时候也都容易出现故障。那么&#xff0c;若碰上 电脑开机后只显示桌面的背景而没有任何程序和应用的情况&#xff0c;莫急…

Xshell 的基本使用

软件长这样 Xshell 链接地址 一、输入 ifconfig 查看 linux ip 地址 二、远程连接服务器 三、测试连接

Java中String类的concat方法___java的String字符串的concat()方法连接字符串和“+“连接字符串解释

Java中String类的concat方法 在了解concat&#xff08;&#xff09;之前&#xff0c;首先需要明确的是String的两点特殊性。 长度不可变值不可变 这两点从源码中对String的声明可以体现&#xff1a; private final char[] value ;其中final对应值的不可更改的特性&#xff1b…

大于小于优化_架构 - 以MySQL为例,详解数据库索引原理及深度优化

一、摘要本文以MySQL数据库为研究对象&#xff0c;讨论与数据库索引相关的一些话题。特别需要说明的是&#xff0c;MySQL支持诸多存储引擎&#xff0c;而各种存储引擎对索引的支持也各不相同&#xff0c;因此MySQL数据库支持多种索引类型&#xff0c;如BTree索引&#xff0c;哈…

Xftp 基本使用

vmware tool 安装 连接终端Xshell5_安装vmtools_

MySQL:日期函数、时间函数总结

MySQL 获得当前日期时间 函数 获得当前日期时间&#xff08;date time&#xff09;函数&#xff1a;now() mysql> select now();--------------------- | now() | --------------------- | 2008-08-08 22:20:46 | ---------------------获得当前日期时间&#xff08;date…

Vue 组件的自定义事件

绑定自定义事件 // 第一种方式 <Demo demo"test"/> || <Demo v-on:demo"test"/>// 第二种方式 <Demo ref"demo"/> ... mounted() {this.$refs.xxx.$on(demo, this.test) } // 如果想自定义事件只能触发一次&#xff0c;可以使…

c++byte数组和文件的相互转换_终于!word、excel、ppt文件相互转换技巧来了!

不知道大家在用Office软件的时候&#xff0c;有没有遇到过这样的问题。做了个Word文档总结&#xff0c;却需要转换成PPT上台汇报&#xff1b;做了个Word表格统计&#xff0c;却需要转换成Excel进行分析&#xff1b;做了个Excel图表分析&#xff0c;却需要放到Word或PPT上&#…