0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Mybatis-Plus使用技巧与隐患分析

jf_ro2CN3Fa 来源:稀土掘金 2023-07-27 10:39 次阅读

前言

MP 从出现就一直有争议 感觉一直 都存在两种声音

like:

很方便啊 通过函数自动拼接Sql 不需要去XML 再去使用标签 之前一分钟写好的Sql 现在一秒钟就能写好 简直不要太方便

dislike:

侵入Service层 不好维护 可读性差 代码耦合 效率不行 sql优化比较难

之前也有前辈说少用MP 理由就是不好维护 但是这个东西真的是方便 只要不是强制不让用 就还是会去使用 存在集合里 最近也确实有一些体会 就从两个角度去看一下MP

优点

操作简洁

就从我们编码中最常用的增删改查去说

按照我们之前去使用Mybatis的喜欢我们就要去建立一个XML文件 去编写Sql语句 算是半自动 我们可以直接去操控Sql语句 但是会比较麻烦 很多简单的数据查询我们都要去写一个标签 感觉这种没有意义的操作还是比较烦的 那么MP里面怎么实现

第一种:最简单我们就是直接去使用提供的方法 我们非常简单就能做到这些操作 但是这个就有一个问题

nodeMapper.selectById(1);
nodeMapper.deleteById(2);
nodeMapper.updateById(newNode());
nodeMapper.insert(newNode());

维护性差 以查询为例 这个默认提供的方法都是查询所有字段我们都知道在编写Sql的时候第一条优化准则就是不要使用Select * 因为这种写法是很Low

这个就是上面selectById执行的结果

SELECTId,name,pidFROMnodeWHEREId=?

这种Sql 肯定是不好的所以我们在使用MP的时候尽量不要去使用自带的快捷查询 我们可以去使用它里面的构造器

nodeMapper.selectOne(newQueryWrapper().eq("id",1).select("id"));

这汇总写法 我们可以通过后面的select() 去指定我们需要查询的字段 算是解决上面那个问题吗 但是这个就完事了吗?这还有一个问题

我们在开发中经常会说一个叫魔法值的东西

//这个就是魔法值
if("变成派大星".equals(node.getName())){
System.out.println("魔法值");
}

之所以不要多用魔法值就是为了后期维护 我们建议使用枚举 或者建一个常量类 通过Static final修饰

上面那段代码是不是也有同样问题 "id"算不算魔法值呢 这种构造器产生的问题就是 不好维护

假设 我们的这Node类是高度使用的 我们到处都在写

nodeMapper.selectOne(newQueryWrapper().eq("id",1).select("id"));

刚开始没事 我们乐呵呵的 但是一旦我去修改Id 的字段名怎么办

1047af64-2c1e-11ee-a368-dac502259ad0.jpg

我修改成test(数据库同步修改) 现在这个实体类中没有这个字段 我们再去看我们的代码

105fb21c-2c1e-11ee-a368-dac502259ad0.jpg

没有什么反应 没有给我提示报错 我这个时候去运行怎么办 我要一个个去找这个错误吗 这明显很费时间

这个确实是一个问题 但是也是可以解决的

Nodenode=nodeMapper.selectOne(newLambdaQueryWrapper().eq(Node::getId,1).select(Node::getId));

上面这种代码就可以去解决这个问题 我们在使用的时候可以多用这个东西

108021d2-2c1e-11ee-a368-dac502259ad0.jpg

一旦修改字段就会立马报错

但是 这就万事大吉了吗 NO No NO 我们要是处理稍微复杂的语句怎么办?比如如我们字段求和 这个LambdaQueryWrapper还是存在限制的

如果我们想实现这种 怎么去做呢

selectSUM(price_count)frombla_order_dataLIMIT100

首先这种写法肯定是不太行的 编译不通过

108fee3c-2c1e-11ee-a368-dac502259ad0.jpg

除非去使用QueryWrapper

10a60d70-2c1e-11ee-a368-dac502259ad0.jpg

还有就是分页查询

//条件查询
LambdaQueryWrapperqueryWrapper=newLambdaQueryWrapper<>();
queryWrapper.eq(UserInfo::getAge,20);
//分页对象
PagequeryPage=newPage<>(page,limit);
//分页查询
IPageiPage=userInfoMapper.selectPage(queryPage,queryWrapper);
//数据总数
Longtotal=iPage.getTotal();
//集合数据
Listlist=iPage.getRecords();

这个还是非常简单的

简单总结

MP 在做一些简单的单表查询可以去使用但是对于一些复杂的SQl操作还是不要用

1、SQL侵入Service 的问题我们可以仿照 Mybatis 建一个专门存放 MP查询的包

2、关于维护性 我们可以尽量去使用 LambdaQueryWrapper 去构造

3、MP是有内置的主键生成策略

4、内置分页插件:基于 Mybatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通List查询。

缺点

我就说一个最大的缺点就是对于复杂Sql 的操作性很不舒服 比如我们去多表查询 你怎么去写呢

看一个例子

10bc9446-2c1e-11ee-a368-dac502259ad0.jpg10cd123a-2c1e-11ee-a368-dac502259ad0.jpg

就是通过 @Select 注解将Mp的查询条件嵌入进去${ew.customSqlSegment}

咱就是一整个大问号 联表老老实实去写XML吧 这种真的不要去用 太丑了

总结

没有过多的东西 基本都是最近看到的东西

1、复杂语句不推荐使用MP 能用最好也别用 可读性差 难维护 使用刚开始没感觉 后期业务扩充 真的恶心的

2、可以使用MP中的分页 比较舒服 逐渐生成策略也舒服

3、尽量不要去使用MP中自带的selectById 等全表查询的方法

4、尽量使用LambdaQueryWrapper的书写形式 至少比较好维护

5、简单重复Sql 可以用MP。复杂SQL不要用






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 编码器
    +关注

    关注

    45

    文章

    3597

    浏览量

    134171
  • SQL
    SQL
    +关注

    关注

    1

    文章

    760

    浏览量

    44078
  • XML技术
    +关注

    关注

    0

    文章

    15

    浏览量

    6010

原文标题:Mybatis-Plus 使用技巧与隐患

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    一文了解MyBatis的查询原理

    本文通过MyBatis一个低版本的bug(3.4.5之前的版本)入手,分析MyBatis的一次完整的查询流程,从配置文件的解析到一个查询的完整执行过程详细解读MyBatis的一次查询流
    的头像 发表于 10-10 11:42 1402次阅读

    mybatis plus的常规用法

    上篇文章我们介绍过通过 Mybatis Plus 进行增删改查,如下这段代码: /** * 根据id修改 * UPDATE user SET user_name=?, user_age
    的头像 发表于 09-25 15:06 876次阅读
    <b class='flag-5'>mybatis</b> <b class='flag-5'>plus</b>的常规用法

    #硬声创作季 Java项目实战:MyBatis-Plus简介

    PlusJAVA编程语言
    Mr_haohao
    发布于 :2022年09月07日 10:15:17

    Mybatis的内部设计介绍

    Mybatis源码分析-整体设计(一)
    发表于 06-06 09:43

    一篇让你熟练掌握 MyBatis-Plus

    MyBatis-plus 是一款 Mybatis 增强工具,用于简化开发,提高效率。下文使用缩写 mp来简化表示 MyBatis-plus,本文主要介绍 mp 搭配 Spring Boot
    的头像 发表于 06-01 09:30 2574次阅读
    一篇让你熟练掌握 <b class='flag-5'>MyBatis-Plus</b>!

    Mybatis-Plus Mybatis增强工具包

    ./oschina_soft/gitee-mybatis-plus.zip
    发表于 06-13 11:34 1次下载
    <b class='flag-5'>Mybatis-Plus</b> <b class='flag-5'>Mybatis</b>增强工具包

    MyBatis-Plus的使用与测试

    本文主要介绍mybatis-plus这款插件,针对springboot用户。包括引入,配置,使用,以及扩展等常用的方面做一个汇总整理,尽量包含大家常用的场景内容。
    的头像 发表于 08-22 11:56 1290次阅读

    Fluent Mybatis、原生MybatisMybatis Plus对比

    mapper中再组装参数。那对比原生Mybatis, Mybatis Plus或者其他框架,FluentMybatis提供了哪些便利呢?
    的头像 发表于 09-15 15:41 1406次阅读

    SpringBoot中MybatisX插件的简单使用教程

    MybatisX 是一款基于 IDEA 的快速开发插件,方便在使用mybatis以及mybatis-plus开始时简化繁琐的重复操作,提高开发速率。
    的头像 发表于 02-21 09:49 1225次阅读

    MyBatis-Plus为什么不支持联表

    MyBatis Plus Join`一款专门解决MyBatis Plus 关联查询问题的扩展框架,他并不一款全新的框架,而是基于`MyBatis
    的头像 发表于 02-28 15:19 2405次阅读
    <b class='flag-5'>MyBatis-Plus</b>为什么不支持联表

    介绍一款基于Mybatis-Plus的代码自助生成器

    在基于Mybatis的开发模式中,很多开发者还会选择Mybatis-Plus来辅助功能开发,以此提高开发的效率。
    的头像 发表于 05-23 14:16 1124次阅读
    介绍一款基于<b class='flag-5'>Mybatis-Plus</b>的代码自助生成器

    如何调优MyBatis 25倍性能

    最近在压测一批接口,发现接口处理速度慢的有点超出预期,感觉很奇怪,后面定位发现是数据库批量保存这块很慢。 这个项目用的是 mybatis-plus,批量保存直接用的是 mybatis-plus 提供的 saveBatch。 我点进去看了下源码,感觉有点不太对劲
    的头像 发表于 05-30 09:56 581次阅读
    如何调优<b class='flag-5'>MyBatis</b> 25倍性能

    你还在手写join联表查询?MyBatis-Plus这样写太香了!

    众所周知,mybatis plus 封装的 mapper 不支持 join,如果需要支持就必须自己去实现。但是对于大部分的业务场景来说,都需要多表 join,要不然就没必要采用关系型数据库了。
    的头像 发表于 07-07 10:19 2497次阅读
    你还在手写join联表查询?<b class='flag-5'>MyBatis-Plus</b>这样写太香了!

    MyBatis Plus如何简化开发

    本篇文章,我们通过 MyBatis Plus 来对一张表进行 CRUD 操作,来看看是如何简化我们开发的。 1、创建测试表 创建 USER 表: DROP TABLE IF EXISTS
    的头像 发表于 10-09 15:08 400次阅读
    <b class='flag-5'>MyBatis</b> <b class='flag-5'>Plus</b>如何简化开发

    mybatis和mybatisplus的区别

    MyBatisMyBatis Plus是两个非常受欢迎的Java持久层框架。这两个框架在设计和功能上有一些区别,下面我将详细介绍它们之间的差异以及各自的特点。 设计理念与目标: MyBati
    的头像 发表于 12-03 11:53 2488次阅读