Mybaits-plus实战(二)
1. Mybaits-plus实战(二)
1.1. mybatis-plus插件
1.1.1. 用法
- 先举个例子介绍用法,如下:直接作为Bean注入,一般来讲插件太多印象性能,所以大部分插件都只在测试,开发环境使用,一般不上生产环境,下面我介绍的插件都以xml格式配置为例,因为那样参数展示会多一些,使用时直接pom使用或作为如下Bean注入
@Bean
public PerformanceInterceptor performanceInterceptor() {
PerformanceInterceptor performanceInterceptor = new PerformanceInterceptor();
/*<!-- SQL 执行性能分析,开发环境使用,线上不推荐。 maxTime 指的是 sql 最大执行时长 -->*/
performanceInterceptor.setMaxTime(1000);
/*<!--SQL是否格式化 默认false-->*/
performanceInterceptor.setFormat(false);
return performanceInterceptor;
}
1.1.2. 分页插件
<plugins>
<!--
| 分页插件配置
| 插件提供二种方言选择:1、默认方言 2、自定义方言实现类,两者均未配置则抛出异常!
| overflowCurrent 溢出总页数,设置第一页 默认false
| optimizeType Count优化方式 ( 版本 2.0.9 改为使用 jsqlparser 不需要配置 )
| -->
<!-- 注意!! 如果要支持二级缓存分页使用类 CachePaginationInterceptor 默认、建议如下!! -->
<plugin interceptor="com.baomidou.mybatisplus.plugins.PaginationInterceptor">
<property name="sqlParser" ref="自定义解析类、可以没有" />
<property name="localPage" value="默认 false 改为 true 开启了 pageHeper 支持、可以没有" />
<property name="dialectClazz" value="自定义方言类、可以没有" />
</plugin>
</plugins>
1.1.2.1. json序列化移除transient
- 看到有个jackson的json序列化溢出transient功能,即controller层请求返回对象中属性若有transient修饰,则去掉该属性不传回去
- 但我不习惯用jackson,所以改了fastjson的方式
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
FastJsonConfig fj = new FastJsonConfig();
fj.setSerializerFeatures(SerializerFeature.SkipTransientField);
fastJsonHttpMessageConverter.setFastJsonConfig(fj);
converters.add(fastJsonHttpMessageConverter);
}
}
1.1.3. 执行分析插件
- 用作拦截全表的delete和update操作,防止瞎写的sql语句
<plugins>
<!-- SQL 执行分析拦截器 stopProceed 发现全表执行 delete update 是否停止运行 -->
<plugin interceptor="com.baomidou.mybatisplus.plugins.SqlExplainInterceptor">
<property name="stopProceed" value="false" />
</plugin>
</plugins>
1.1.4. 性能分析插件
- 用于输出每条 SQL 语句及其执行时间
<plugins>
....
<!-- SQL 执行性能分析,开发环境使用,线上不推荐。 maxTime 指的是 sql 最大执行时长 -->
<plugin interceptor="com.baomidou.mybatisplus.plugins.PerformanceInterceptor">
<property name="maxTime" value="100" />
<!--SQL是否格式化 默认false-->
<property name="format" value="true" />
</plugin>
</plugins>
1.1.5. 乐观锁插件
- 实体字段需要加上
@version注解
<bean class="com.baomidou.mybatisplus.plugins.OptimisticLockerInterceptor"/>
public class User {
@Version
private Integer version;
...
}
1.1.6. 注入自定义SQL
- 自定义注入全表删除方法 deteleAll
1.1.6.1. java
- 配置注入方法
public class MySqlInjector extends AutoSqlInjector {
@Override
public void inject(Configuration configuration, MapperBuilderAssistant builderAssistant, Class<?> mapperClass,
Class<?> modelClass, TableInfo table) {
/* 添加一个自定义方法 */
deleteAllUser(mapperClass, modelClass, table);
}
public void deleteAllUser(Class<?> mapperClass, Class<?> modelClass, TableInfo table) {
/* 执行 SQL ,动态 SQL 参考类 SqlMethod */
String sql = "delete from " + table.getTableName();
/* mapper 接口方法名一致 */
String method = "deleteAll";
SqlSource sqlSource = languageDriver.createSqlSource(configuration, sql, modelClass);
this.addMappedStatement(mapperClass, method, sqlSource, SqlCommandType.DELETE, Integer.class);
}
}
1.1.6.2. Mapper
- 声明方法
public interface UserMapper extends BaseMapper<User> {
/**
* 自定义注入方法
*/
int deleteAll();
}
1.1.6.3. xml
- 启用
<!-- 定义 MP 全局策略,安装集成文档部分结合 -->
<bean id="globalConfig" class="com.baomidou.mybatisplus.entity.GlobalConfiguration">
.....
<!-- 自定义注入 deleteAll 方法 -->
<property name="sqlInjector" ref="mySqlInjector" />
</bean>
<!-- 自定义注入器 -->
<bean id="mySqlInjector" class="com.baomidou.test.MySqlInjector" />
1.1.7. 公共字段自动填充
MyMetaObjectHandler的用法,前一篇文章有用到
1.1.8. 逻辑删除
LogicSqlInjector的用法,前一篇有用到
1.1.9. 读写分离与多数据源
- 集成pom
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>2.x.x</version>
</dependency>
- 配置主从数据源
spring:
datasource:
dynamic:
primary: master #设置默认的数据源或者数据源组,默认值即为master,如果你主从默认下主库的名称就是master可不定义此项。
datasource:
master:
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://47.100.20.186:3306/dynamic?characterEncoding=utf8&useSSL=false
slave_1:
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://47.100.20.186:3307/dynamic?characterEncoding=utf8&useSSL=false
slave_2:
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://47.100.20.186:3308/dynamic?characterEncoding=utf8&useSSL=false
#......省略
#以上会配置一个默认库master,一个组slave下有两个子库slave_1,slave_2
- 切换数据源
使用 @DS 注解切换数据源。
1.1.9.1. 读写分离
1.1.9.1.1. 配置
sharding:
jdbc:
datasource:
names: ds_master,ds_slave_0,ds_slave_1
ds_master:
...
ds_slave_0:
...
ds_slave_1:
...
config:
masterslave:
load-balance-algorithm-type: round_robin
name: ds_ms
master-data-source-name: ds_master
slave-data-source-names: ds_slave_0,ds_slave_1
1.1.10. Sequence主键
- 它提供了id_worker,id_worker_str,uuid三种自定义主键生成器,对oracle可以用
OracleKeyGenerator配置主键自增 - id_worker就是雪花算法
1.1.11. 其他功能
- 多租户 SQL 解析器
- 通用枚举扫描并自动关联注入
1.2. 条件构造器
- 开始接触mybatis-plus肯定会常常看到
AbstractWrapper这个条件包装类,通常使用两个实现QueryWrapper和UpdateWrapper - 我列一些觉得常用的
allEq,常用allEq(Map<R, V> params)和allEq(Map<R, V> params, boolean null2IsNull),分别表示key对应的值为null,需不需要判断isnull;allEq(BiPredicate<R, V> filter, Map<R, V> params)应该比较少用- 例子:值的范围大于2000的条件才被入选
Map<String, Object> map = new HashMap<>();
map.put("daily_price_id", 1117L);
QueryWrapper<DailyPrice> queryWrapper = new QueryWrapper<DailyPrice>().allEq((k, v) -> ((Long) v) > 2000L, map);
List<DailyPrice> dailyPrices = dailyPriceService.getBaseMapper().selectList(queryWrapper);
eq,很明显,=ne不等于大于小于
gt,lt,范围between,like,常用的关键字都有last直接拼接sql到最后,如:last("limit 1")
- 至于联合查询什么的,或者条件比较复杂的and,or啥的,我觉的还是直接在mapper.xml里直接写sql比较好,那样更简洁明了,它的语法查些简单的语句还是不错的
1.3. 附加知识点
- 在逐步研究mybatis-plus的过程中,遇到的一些实用知识点整理下
1.3.1. 跳过transient属性的值
- 我们从数据库所取的字段很多时候是有冗余的,加了
transient字段,在controller层返回的时候,json会过滤掉它 - 还需要配置内容如下,主要是
SerializerFeature.SkipTransientField
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
FastJsonHttpMessageConverter fastJsonHttpMessageConverter = new FastJsonHttpMessageConverter();
FastJsonConfig fj = new FastJsonConfig();
// 跳过transient属性的值,浏览器兼容,日期自动格式化
fj.setSerializerFeatures(SerializerFeature.SkipTransientField,SerializerFeature.BrowserCompatible,SerializerFeature.WriteDateUseDateFormat);
fastJsonHttpMessageConverter.setFastJsonConfig(fj);
converters.add(fastJsonHttpMessageConverter);
}
}
1.3.2. 日期自动格式化
- 对日期字段,返回前端需要的是格式化后的,所以也如上配置
SerializerFeature.WriteDateUseDateFormat即可
官网gitee:https://baomidou.gitee.io/mybatis-plus-doc/#/page-plugin
官网:https://mp.baomidou.com/guide/wrapper.html#abstractwrapper
Mybaits-plus实战(二)的更多相关文章
- coreseek实战(二):windows下mysql数据源部分配置说明
coreseek实战(二):windows下mysql数据源部分配置说明 关于coreseek在windows使用mysql数据源的配置,以及中文分词的详细说明,请参考官方文档: mysql数据源配置 ...
- 【NFS项目实战二】NFS共享数据的时时同步推送备份
[NFS项目实战二]NFS共享数据的时时同步推送备份 标签(空格分隔): Linux服务搭建-陈思齐 ---本教学笔记是本人学习和工作生涯中的摘记整理而成,此为初稿(尚有诸多不完善之处),为原创作品, ...
- chrome调试工具高级不完整使用指南(实战二)
3.3 给页面添加测试脚本 在现实的工作中,我们往往会遇到一些问题在线上就会触发然后本地就触发不了的问题.或者是,要给某个元素写一个测试脚本.这个时候如果是浏览器有提供一个添加脚本的功能的话,那么我们 ...
- Python爬虫实战二之爬取百度贴吧帖子
大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 前言 亲爱的们,教程比较旧了,百度贴吧页面可能改版,可能代码不 ...
- 转 Python爬虫实战二之爬取百度贴吧帖子
静觅 » Python爬虫实战二之爬取百度贴吧帖子 大家好,上次我们实验了爬取了糗事百科的段子,那么这次我们来尝试一下爬取百度贴吧的帖子.与上一篇不同的是,这次我们需要用到文件的相关操作. 本篇目标 ...
- Netty 仿QQ聊天室 (实战二)
Netty 聊天器(百万级流量实战二):仿QQ客户端 疯狂创客圈 Java 分布式聊天室[ 亿级流量]实战系列之15 [博客园 总入口 ] 源码IDEA工程获取链接:Java 聊天室 实战 源码 写在 ...
- kubernetes实战(二十八):Kubernetes一键式资源管理平台Ratel安装及使用
1. Ratel是什么? Ratel是一个Kubernetes资源平台,基于管理Kubernetes的资源开发,可以管理Kubernetes的Deployment.DaemonSet.Stateful ...
- SpringSecurity权限管理系统实战—二、日志、接口文档等实现
系列目录 SpringSecurity权限管理系统实战-一.项目简介和开发环境准备 SpringSecurity权限管理系统实战-二.日志.接口文档等实现 SpringSecurity权限管理系统实战 ...
- miniFTP项目实战二
项目简介: 在Linux环境下用C语言开发的Vsftpd的简化版本,拥有部分Vsftpd功能和相同的FTP协议,系统的主要架构采用多进程模型,每当有一个新的客户连接到达,主进程就会派生出一个ftp服务 ...
- C# Redis实战(二) [转]
二.Redis服务 在C# Redis实战(一)中我将所有文件拷贝到了D盘redis文件夹下,其中redis-server.exe即为其服务端程序,双击即开始运行,如图 ...
随机推荐
- Fibonacci数列的解法
Fibonacci数列的解法: 1.递归算法 递归的概念,我说不清楚,语文不好.但是核心思想,我认为就是入栈出栈.比方说,你想要求得某个结果,如果一步求解不出来,那么先把最后一步的计算步骤进栈,先不考 ...
- CSS学习笔记二:css 画立体图形
继上一次学了如何去运用css画平面图形,这一次学如何去画正方体,从2D向着3D学习,虽然有点满,但总是一个过程,一点一点积累,然后记录起来. Transfrom3D 在这一次中运用到了一下几种属性: ...
- JS——函数
一.函数的种类 1.无参函数 function showName() { alert("我是无参函数"); } 2.有参函数 在函数中的参数为"形式参数" 形式 ...
- js相关
记录工作中用到的js实用方法: 1. 判断包含:indexOf "https".indexOf("http") 包含结果为0,不包含结果为-1: 通常用(&qu ...
- Vlan 原理
VLAN(Virtual LAN),翻译成中文是"虚拟局域网".LAN可以是由少数几台家用计算机构成的网络,也可以是数以百计的计算机构成的企业网络.VLAN所指的LAN特指使用路由 ...
- mysql explain中key_len值的说明
在mysql 的explain的输出中,有个key_len的列,其数据是如何计算的呢? 在看到了淘宝的dba以前发布的博客后,我在mysql 5.6上操作一番,了解了一点. 环境准备 – 创建表. u ...
- linux Tcpdump使用方法
用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具. tcpdump可以将网络中传送的数据包的&qu ...
- Spring_boot简单操作数据库
Spring_boot搭配Spring Data JPA简单操作数据库 spring boot 配置文件可以使用yml文件,默认spring boot 会加载resources目录的下的applica ...
- 关于Kafka日志留存策略的讨论
关于Kafka日志留存(log retention)策略的介绍,网上已有很多文章.不过目前其策略已然发生了一些变化,故本文针对较新版本的Kafka做一次统一的讨论.如果没有显式说明,本文一律以Kafk ...
- Java语言 链接Oracle数据库
package com.tao.pojo; import java.sql.Connection; import java.sql.DriverManager; import java.sql.Pre ...