1. Mybaits-plus实战(二)

1.1. mybatis-plus插件

1.1.1. 用法

  1. 先举个例子介绍用法,如下:直接作为Bean注入,一般来讲插件太多印象性能,所以大部分插件都只在测试,开发环境使用,一般不上生产环境,下面我介绍的插件都以xml格式配置为例,因为那样参数展示会多一些,使用时直接pom使用或作为如下Bean注入
    @Beanpublic 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

  1. 看到有个jackson的json序列化溢出transient功能,即controller层请求返回对象中属性若有transient修饰,则去掉该属性不传回去
  2. 但我不习惯用jackson,所以改了fastjson的方式
@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic 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. 执行分析插件

  1. 用作拦截全表的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. 性能分析插件

  1. 用于输出每条 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. 乐观锁插件

  1. 实体字段需要加上@version注解
<bean class="com.baomidou.mybatisplus.plugins.OptimisticLockerInterceptor"/>
public class User {@Versionprivate Integer version;...
}

1.1.6. 注入自定义SQL

  1. 自定义注入全表删除方法 deteleAll

1.1.6.1. java

  1. 配置注入方法
public class MySqlInjector extends AutoSqlInjector {@Overridepublic 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

  1. 声明方法
public interface UserMapper extends BaseMapper<User> {/*** 自定义注入方法*/int deleteAll();}

1.1.6.3. xml

  1. 启用
<!-- 定义 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. 读写分离与多数据源

  1. 集成pom
<dependency><groupId>com.baomidou</groupId><artifactId>dynamic-datasource-spring-boot-starter</artifactId><version>2.x.x</version>
</dependency>
  1. 配置主从数据源
spring:datasource:dynamic:primary: master #设置默认的数据源或者数据源组,默认值即为master,如果你主从默认下主库的名称就是master可不定义此项。datasource:master:username: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://47.100.20.186:3306/dynamic?characterEncoding=utf8&useSSL=falseslave_1:username: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://47.100.20.186:3307/dynamic?characterEncoding=utf8&useSSL=falseslave_2:username: rootpassword: 123456driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://47.100.20.186:3308/dynamic?characterEncoding=utf8&useSSL=false#......省略#以上会配置一个默认库master,一个组slave下有两个子库slave_1,slave_2
  1. 切换数据源
    使用 @DS 注解切换数据源。

1.1.9.1. 读写分离

1.1.9.1.1. 配置
sharding:jdbc:datasource:names: ds_master,ds_slave_0,ds_slave_1ds_master:...ds_slave_0:...ds_slave_1:...config:masterslave:load-balance-algorithm-type: round_robinname: ds_msmaster-data-source-name: ds_masterslave-data-source-names: ds_slave_0,ds_slave_1

1.1.10. Sequence主键

  1. 它提供了id_worker,id_worker_str,uuid三种自定义主键生成器,对oracle可以用OracleKeyGenerator配置主键自增
  2. id_worker就是雪花算法

1.1.11. 其他功能

  1. 多租户 SQL 解析器
  2. 通用枚举扫描并自动关联注入

1.2. 条件构造器

  1. 开始接触mybatis-plus肯定会常常看到AbstractWrapper这个条件包装类,通常使用两个实现QueryWrapperUpdateWrapper
  2. 我列一些觉得常用的
    1. 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);
    2. eq,很明显,=
    3. ne不等于
    4. 大于小于gt,lt,范围betweenlike,常用的关键字都有
    5. last直接拼接sql到最后,如:last("limit 1")
  3. 至于联合查询什么的,或者条件比较复杂的and,or啥的,我觉的还是直接在mapper.xml里直接写sql比较好,那样更简洁明了,它的语法查些简单的语句还是不错的

1.3. 附加知识点

  1. 在逐步研究mybatis-plus的过程中,遇到的一些实用知识点整理下

1.3.1. 跳过transient属性的值

  1. 我们从数据库所取的字段很多时候是有冗余的,加了transient字段,在controller层返回的时候,json会过滤掉它
  2. 还需要配置内容如下,主要是SerializerFeature.SkipTransientField
@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic 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. 日期自动格式化

  1. 对日期字段,返回前端需要的是格式化后的,所以也如上配置SerializerFeature.WriteDateUseDateFormat即可

官网gitee:https://baomidou.gitee.io/mybatis-plus-doc/#/page-plugin
官网:https://mp.baomidou.com/guide/wrapper.html#abstractwrapper

转载于:https://www.cnblogs.com/sky-chen/p/10775856.html

Mybaits-plus实战(二)相关推荐

  1. 【Qt】数据库实战(二)

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 连接到数据库 04. 操作结果集 06. 附录 01. 概述 SQL即结构化查询语言,是关系数据库的标准语言.前面已经在Q ...

  2. GridView实战二:使用ObjectDataSource数据源控件(自定义缓存机制实现Sort)

    参考资料:http://www.cnblogs.com/fsjohnhuang/archive/2011/12/17/2291200.html 因为使用ObjectDataSource自带的缓存机制无 ...

  3. CCNP精粹系列之十八--路由映射实战二,博主推荐文章

    路由映射实战二 本篇博文和上一篇是紧密结合的,只是在上个试验的基础上作了改动,达到其他的试验效果. 试验二: 在R1上增加一个网段,并发布路由.这里采用三种方法. 如下是第一种,是在试验一的基础上直接 ...

  4. Taro多端开发实现原理与项目实战(二)

    Taro多端开发实现原理与项目实战(二) 多端电商平台项目概述及开发准备 学习了前面的基础知识和进阶后是否跃跃欲试?我们准备了一个电商平台的项目来和大家一起实践使用 Taro 开发电商平台. 项目概述 ...

  5. 千张照片合成你一张美照-【OpenCV实战二】

    如果你手头有很多很多她的照片,想要给她一个惊喜,你一定要知道这篇文章的威力! OpenCV图像处理其中经典的案例就是千图合成技术,通过对于不同图像的特征提取,再拼合成指定的图像.快去给你的她也搞一个吧 ...

  6. OpenCV C++案例实战二十九《遥感图像分割》

    OpenCV C++案例实战二十九<遥感图像分割> 前言 一.准备数据 二.K-Means分类 三.效果显示 四.源码 总结 前言 本案例基于k-means机器学习算法进行遥感图像分割.主 ...

  7. 牛客网SQL实战二刷 | Day10

    「牛客网SQL实战二刷」是个系列学习笔记博文,今天解析7道SQL题目- 第55 - 61题. 每篇笔记的格式大致为,三大板块: 大纲 题目(题目描述.思路.代码.相关参考资料/答疑) 回顾 ❤️「往期 ...

  8. OpenCV C++案例实战二《生成蒙太奇图像》

    OpenCV C++案例实战二<生成蒙太奇图像> 前言 一.输入模板图像 二.读取素材图像 三.生成蒙太奇模板 四.生成蒙太奇图像 五.源码 总结 前言 本文将使用OpenCV C++ 生 ...

  9. jeesite实战(二)——jeesite工具生成基本的页面

    系列文章目录 jeesite实战(一)--基本环境搭建 jeesite实战(二)--jeesite工具生成基本的页面 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 系列文 ...

  10. WiFi基础学习到实战(二:WiFi网络“数据链路层”)

    欢迎大家一起学习探讨通信之WLAN.上节我们对802.11标准基于OSI模型进行了分析,主要将OSI模型的"数据链路层"定义分为"LLC层"和"MAC ...

最新文章

  1. JAVA简性_Java简介
  2. ABAP Authorization trace工具
  3. SSH登录太慢(等很久才提示输入密码)的问题
  4. WinCE 字体平滑 ClearType
  5. java水果超市mysql_Java基础 | 项目实战之水果超市
  6. React 是如何成为跨越前端开发鸿沟的桥梁?
  7. [Math Processing Error] 问题的解决(F5刷新页面与 Ctrl/Shift + F5 刷新页面的区别)
  8. Eclipse中如何让Java类与Servlet产生关联【实现处理请求内容】
  9. 小波变换与傅里叶变换的区别
  10. 算法笔记_面试题_22. 图与搜索(BFS/DFS)相关_模板及示例十几道
  11. 几种主流数据库类型简介
  12. 一场会带来啥改变?三翼鸟引领行业进入有脑时代
  13. Linux安装Tab键补全功能
  14. 深度学习中优化方法——momentum、Nesterov Momentum、AdaGrad、Adadelta、RMSprop、Adam
  15. 2018金山wps暑期招聘服务器端笔试题(第二批)
  16. 百度ueditor富文本--配置图片上传
  17. 计算机专业转ubc绩点,中国留学生申请加拿大名校,如何换算GPA成绩?
  18. 高德地图API创建地理围栏
  19. 关于Value ‘0000-00-00 00:00:00‘ can not be represented as java.sql.Timestamp错误
  20. linux查显卡型号_Windows/Linux下怎么查看笔记本显卡型号

热门文章

  1. MySQL性能优化之:索引下推
  2. 使用 Go 实现 TLS socket server
  3. Dubbo(十三)dubbo的负载均衡配置策略
  4. C语言模拟顺序栈的创建、入栈、出栈操作
  5. Java企业面试算法新得体会之5字符串问题24问
  6. Linux下使用curl
  7. jdk1.7 tomcat7 centos 安装
  8. java完全数判断_java基础之完数判断
  9. Golang中Goroutine与线程
  10. 预处理和typedef