首页 > 其他分享 >Mybatis-Plus 使用隐患,太坑了!

Mybatis-Plus 使用隐患,太坑了!

时间:2023-11-10 14:34:17浏览次数:40  
标签:nodeMapper 使用 太坑 查询 Plus MP Sql Mybatis 我们

作者:糊涂码
链接:https://juejin.cn/post/7156428078061895710

前言

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

like:

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

dislike:

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

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

推荐一个开源免费的 Spring Boot 实战项目:

https://github.com/javastacks/spring-boot-best-practice

优点

操作简洁

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

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

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

nodeMapper.selectById(1);
nodeMapper.deleteById(2);
nodeMapper.updateById(new Node());
nodeMapper.insert(new Node());

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

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

SELECT Id,name,pid FROM node WHERE Id=?

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

nodeMapper.selectOne(new QueryWrapper<Node>().eq("id",1).select("id"));

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

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

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

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

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

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

nodeMapper.selectOne(new QueryWrapper<Node>().eq("id",1).select("id"));

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

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

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

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

Node node = nodeMapper.selectOne(new LambdaQueryWrapper<Node>().eq(Node::getId, 1).select(Node::getId));

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

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

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

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

select SUM(price_count) from  bla_order_data LIMIT 100

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

除非去使用QueryWrapper

还有就是分页查询

// 条件查询
LambdaQueryWrapper<UserInfo> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(UserInfo::getAge, 20);
// 分页对象
Page<UserInfo> queryPage = new Page<>(page, limit);
// 分页查询
IPage<UserInfo> iPage = userInfoMapper.selectPage(queryPage , queryWrapper);
// 数据总数
Long total = iPage.getTotal();
// 集合数据
List<UserInfo> list = iPage.getRecords();

这个还是非常简单的

简单总结

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

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

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

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

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

缺点

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

看一个例子

就是通过

@Select 注解

将Mp的查询条件嵌入进去
${ew.customSqlSegment}

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

总结

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

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

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

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

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

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

完结有想到的会补充各位同僚有其他意见可以评论区见 会补充修正。

近期热文推荐:

1.1,000+ 道 Java面试题及答案整理(2022最新版)

2.劲爆!Java 协程要来了。。。

3.Spring Boot 2.x 教程,太全了!

4.别再写满屏的爆爆爆炸类了,试试装饰器模式,这才是优雅的方式!!

5.《Java开发手册(嵩山版)》最新发布,速速下载!

觉得不错,别忘了随手点赞+转发哦!

标签:nodeMapper,使用,太坑,查询,Plus,MP,Sql,Mybatis,我们
From: https://www.cnblogs.com/javastack/p/17824021.html

相关文章

  • 实现MyBatisPlus自定义sql注入器
    目标:新增mysql下的插入更新的语法INSERTINTO%s%sVALUES%sONDUPLICATEKEYUPDATE%s新增方法类,新增的方法名称为insertOrUpdate和insertOrUpdateBatch方法,但其mapper层的方法名为insertOrUpdate方法importcom.baomidou.mybatisplus.annotation.IdType;importcom.b......
  • 手把手教你如何扩展(破解)mybatisplus的sql生成 | 京东云技术团队
    mybatisplus的常用CRUD方法众所周知,mybatisplus提供了强大的代码生成能力,他默认生成的常用的CRUD方法(例如插入、更新、删除、查询等)的定义,能够帮助我们节省很多体力劳动。他的BaseMapper中定义了这些常用的CRUD方法,我们在使用时,继承这个BaseMapper类就默认拥有了这些能力。如果我......
  • mybatis-plus 根据当前时间,判断检索
    <iftest="timeStatus!=nullandtimeStatus.trim()!=''"><iftest="timeStatus==1"><![CDATA[ANDDATE_FORMAT(now(),'%Y-%m-%d%H:%i:%S')<DATE_FORMAT(start_date,'%Y-%m-%d......
  • mybatis中日期时间比较遇到得问题
    今天进行下面得查询得时候,总是报:Cause:java.lang.IllegalArgumentException:invalidcomparison:java.time.LocalDateandjava.lang.String,提示不能将LocalDate类型与String类型进行比较,刚开始一直在检查<if>下得条件,寻思是不是类型写的不对,后来才发现是<if>标签中得判断问题,......
  • mybatis
    5.解决属性名和字段名不一致的问题解决方法:起别名ResultMap6.日志6.1日志工厂如果一个数据库出现了异常,我们经常需要排错,日志是最好的助手。曾经:sout,debug现在:日志需要掌握的:LOG4JSTDOUT_LOGGING至于具体使用哪一个,在MyBatis中设置。 需要在核心配置文......
  • mybatis使用id集合查询数据
    dao层intdelUser(@Param("menuId")IntegermenuId,@Param("idList")List<String>idList);xml层<deleteid="delUser">deleteFROMuser_role_menuWHEREmenu_id=#{menuId}ANDuser_idNOTIN<f......
  • elementplus弹窗可拖拽draggable,点击空白处不消失close-on-click-modal,modal是否去掉
    <el-dialog:modal="false"v-model="dialogVisible"title=""width="30%"draggable:close-on-click-modal="false"class="message-dialog"></el-dialog&g......
  • IDEA 集成 EasyCode 插件,快速生成自定义 mybatisplus 代码
    IDEA集成easyCode插件在idea插件市场中,搜索EasyCode插件,下载并进行安装EasyCode插件介绍1.修改作者名称EasyCode插件可以修改作者名称,即生成代码后,注释中自动添加相应作者的姓名。2.TypeMapperTypeMapper指的是生成mapper.xml文件中数据库中的字段和java......
  • No MyBatis mapper was found in ‘[SpringBoot启动类所在路径]‘ package 原因解析及
    NoMyBatismapperwasfoundin‘[SpringBoot启动类所在路径]‘package原因解析及解决方案NoMyBatismapperwasfoundin'[XXX]'package友情提示:搜到这篇文章的,一般是急于解决这个问题的,看下常见原因排除后,可以忽略分析过程直接看解决方案,我自己出现这个问题的原因主......
  • mybatisplus实现一次多表联查+分页查询
    众所周知,mybatisplus非常好用,但是他不好用就不好用在不可以多表联查。在mybatisplusjoin中提供了联查的方法,那个参数我没看懂Orz不过,历经千辛万苦,我通过xml终于写出来了mybatisplus也可以简单实现的多表联查!我这里是以书籍整理为例,书籍是一个单独的表,书籍类别是另一个表,通过书籍......