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

这篇具有很好参考价值的文章主要介绍了Mybatis-Plus 使用隐患,太坑了!。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

作者:糊涂码
链接: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 的字段名怎么办

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

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

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

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

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

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

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

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

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

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

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

select SUM(price_count) from  bla_order_data LIMIT 100

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

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

除非去使用QueryWrapper

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

还有就是分页查询

// 条件查询
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 的操作性很不舒服 比如我们去多表查询 你怎么去写呢

看一个例子

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

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

就是通过

@Select 注解

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

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

咱就是一整个大问号 联表老老实实去写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开发手册(嵩山版)》最新发布,速速下载!

觉得不错,别忘了随手点赞+转发哦!文章来源地址https://www.toymoban.com/news/detail-750180.html

到了这里,关于Mybatis-Plus 使用隐患,太坑了!的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Mybatis-plus的使用

    Mybatis-plus的使用 一、简介 Mybatis-plus的基于mybatis的,简化了单表mybatis的操作。 注意:它并没有提升性能,只是简化了开发过程。 二、在springboot中的基本使用 1、导入依赖 2、添加相应的数据库配置(application.properties) 3、在Application类上添加dao接口的路径扫描 4、编写实体类

    2024年02月09日
    浏览(40)
  • 微信收款码费率0.38太坑了

    作为一个有多年运营经验的商家,我本人在申请收款功能时曾经走过了不少弯路。我找遍了市面上的知名的支付公司,但了解到的收款手续费率通常都在0.6左右,最低也只能降到0.38。这个过程吃过不少苦头。毕竟,收款功能是我们商家的命脉,而且每天的流水也不小。因此降

    2024年02月07日
    浏览(33)
  • Mybatis-plus框架使用配置

    MyBatis-Plus(简称 MP)是一个基于 MyBatis 的增强工具,它对 Mybatis 的基础功能进行了增强,但未做任何改变。使得我们可以可以在 Mybatis 开发的项目上直接进行升级为 Mybatis-plus,正如它对自己的定位,它能够帮助我们进一步简化开发过程,提高开发效率。 Mybatis-Plus 其实可以看

    2024年02月09日
    浏览(39)
  • Mybatis-Plus使用方法

    MyBatis-Plus 提供了丰富的增强版的 CRUD 方法,使得开发者能够更简洁、高效地进行数据库操作。以下是如何使用 MyBatis-Plus 自带的增强版 CRUD 方法的基本步骤: 添加依赖 首先,确保你的 Maven 项目中已经添加了 MyBatis-Plus 的相关依赖,包括核心依赖和数据库驱动依赖。 xml复制代

    2024年04月11日
    浏览(44)
  • mybatis-plus与mybatis同时使用别名问题

    在整合mybatis和mybatis-plus的时候发现一个小坑,单独使用mybatis,配置别名如下: XML映射文件如下: 单元测试发现没有问题 添加mybatis-plus依赖后,单元测试报错: 显示无法解析XML映射文件中的student 解决办法:要把配置文件里的别名配置改成mybatis-plus的配置,如下: 区别

    2024年04月13日
    浏览(38)
  • 使用Mybatis-Plus问题解答

    我们使用一个新的框架难免会遇到各种问题,当然使用这款国产的优秀的Mybatis-Plus框架也不例外,下面我就给大家列举一下使用Mybatis-Plus可能遇到的一些问题,并做一下一一的解答。 1:如何排除非表的字段 (这个问题一定要注意,我们Java中写的Entity类的属性是和表的字段一

    2024年02月08日
    浏览(39)
  • 使用Mybatis-plus清空表数据

    方法一:  方法二: 直接使用自带的remove接口 ,同时使用QueryWrapper参数如: 引申一下 Mybatis-plus这个好用的框架: 我们知道 MyBatis 是一个基于 java 的持久层框架,它内部封装了 jdbc,极大提高了我们的开发效率。 但是使用 Mybatis 开发也有很多痛点: 每个 Dao 接口都需要自己

    2023年04月09日
    浏览(36)
  • mybatis-plus使用updateBatchById小记

    过程  staff_info表里,我通过sql把entry_time字段先设置成2,然后再通过代码设置成0,设置成2的时候一共有483条数据,然后通过代码修改的时候,我把number=0132791的数据设置成null,即更新这一条数据肯定会报错,通过debug我知道number=2这条数据在更新的list中处于index=141的位置,所

    2024年02月12日
    浏览(43)
  • mybatis-plus的一些使用案例

    (1)需求分析 在创建和修改的时候,需要判断库名是否重复,而库名是全英文,所以要忽略字母大小写,大小写不同被认为是相同的字母 (2)解决思路 把数据库里的字段,还有要查的条件字段,都转成小写或者大写,然后再判断是否相同 (3)代码案例 (1)Api接口层 参数

    2024年02月13日
    浏览(37)
  • SpringBoot(整合MyBatis + MyBatis-Plus + MyBatisX插件使用)

    1.需求分析 2.数据库表设计 3.数据库环境配置 1.新建maven项目 2.pom.xml 引入依赖 3.application.yml 配置数据源 数据库名 用户名 密码 驱动是mysql8的(因为上面使用了版本仲裁) 4.Application.java 编写启动类 5.测试 6.配置类切换druid数据源 7.测试数据源是否成功切换 4.Mybatis基础配置 1

    2024年03月20日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包