服务端架构:Mybatis-Plus的优缺点

2023-11-10

前段时间帮朋友处理java后端架构问题,看到了mybatis-plus,其实早几年就知道这个东西,但一直没用没学,这两天许久未见的web服务看了看,聊聊个人感受

如有不适,请见谅

优点

本文没有优点介绍,若要看到优点,自己去官方文档看吧,全是优点,明明白白

缺点

两大缺点足以限制其在大规模服务中使用:入侵Service和Controller、查询代码太复杂SQL被封装拼接导致的可读性差、不利于优化。

就这俩足以泯灭其他光环,懂了就直接跳到小结

1.对数据访问层DAO的上层入侵太强,入侵到service、甚至controller!

mybatis-plus其中,其中重要的plus的东西就是帮你把大多数简单查询给封装了

上一段代码

mapper的XML文件

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="qky.api.dao.UserDao">

</mapper>

DAO层

@Mapper
public interface UserDao extends BaseMapper<UserEntity> {

}

Service层

public interface UserService extends IService<UserEntity> {

}
@Service("userService")
public class UserServiceImpl extends ServiceImpl<UserDao, UserEntity> implements UserService {
	
}

Controller

UserEntity userEntity = userService.getOne(new QueryWrapper<UserEntity>().eq("mobile", mobile)); 
  • 乍一看,这特么舒服,开发效率嘎嘎的!可是,那个“mobile”知道是啥吗,是数据库表的column!到这里能感觉到问题吗??

  • 问题很明显,数据访问层或者存储层的东西直接入侵到Controller了!!!

  • 说实话我第一眼看到在Controller层出现了表的列名,我就感到不适!即使在Service层也不应该出现

  • 大家看,从xml到dao接口到service接口和实现类,完全没有一个方法定义(没有删减代码贴过来,直接复制的),那么直接我在Contoller层直接可以做查询,简单的CRUD方法,在那个Iserver里,在那个BaseMapper全部定义好了,关联表查询等只要你按照规则定义好也可以直接在Controller直接自己构造一个QueryWrapper即可完成查询

  • 有人会说,这有啥问题,我自己开发我去查下数据库表结构不就可以了。是的你个demo作品,你个小流量网站几个人撑起整个研发团队,是没啥问题,但是一旦跃迁到微服务,MVC分层思想,业务复杂度架构复杂度变高,你说这么开发,它是不是格格不入:看似DAO–》Service–》Conroller 层次明明白白,但这都是虚的,从你实现的情况来看,从你所谓的DAO、Service、Controller其实都归属实际意义上的DAO

  • 总而言之,第一个缺点:对DAO以上的层次结构入侵!耦合起来了!

补充:有人说这是MP的错误用法,正常开发不会这么干(另外一些没那么熟MP的人呢?)。没错,那么从另一个思路考虑:一个工具应该提供简单明了通用合适的使用方法,错误的或者说不适当的使用方案就不该提供,只会徒增使用者能力要求(要求有能驾驭得住的正确的姿势的架构师从提供的所有可行的方法中找到合适的组合链路),其实就是徒增使用成本(代码评审、编码原则制定等等)。

2.查询代码拼接逻辑复杂,最终SQL黑盒,不清晰,不利于业务性优化,不利于排查问题

这里说的复杂、不清晰、不利于,都是相对SQL而言,单纯看MP来评价当然会有有人认为也很简单

  • 如上代码,这个大家想到了类似的dao框架还有啥?springData、Hibernate。。。。这俩应用广泛吗?NO

  • 你想想在代码中用什么eq,like等等一堆方法一个一个字段拼接出来一条语句,一旦字段一多,条件一复杂,可读性直接没了。开发一时爽,维护时,一脸懵逼,想直接重构。扪心自问,你看到别人一坨代码只为了拼接一条sql,你要不要骂两句,你烦不烦

  • 有人说了,在xml文件用标签、这些不也是一长串代码吗?你自己好好比较可读性,后端开发如果不是很熟mybatis-plus,会看得很吃力,额外学习成本,而会mybatis-plus的必然会mybatis吧?而且在XML文件中大多数看到的是SQL语句,SQL是最流行的语言了,sql要干啥很快就能分析出来吧,而且代码中QueryWrap拼接出来的查询,仍然是被翻译成SQL语句,我直接写sql语句,简单清晰,他不香吗

  • 单表,字段少逻辑简单当然易读,字段多,逻辑复杂,读起来相对于SQL会复杂些,你要花时间硬读,当然可以读的懂,年轻时间多当然可以

  • 简单点就是:不利于维护,可读性不强,额外学习成本,查询黑盒子不利于业务性优化和性能逻辑优化。这几个其实就是SpringData和Hibernate等ORM框架虽然开发效率高但是仍然使用很少的一个重大原因。

以上两个(可能说了多个点)点,个人观点,足以让mybatis-plus难以在复杂大规模服务上应用,可以学习思想思路。
mybatis他不香吗?写sql都不愿意写?简单的通用的查询用代码生成不就行了!!!你还一个一个去敲?什么年代了

小结

  • MP单表的便捷能力,mybatis全都可以用代码生成器实现,而且代码生成器可以定制,CRUD列表分页批量操作等等,包括嵌入业务逻辑。那么,MP是不是比较尴尬:MP很多人都是单表用增强的方法,多表写原生xml SQL,可是mybatis单表代码生成器,多表也写SQL,更快更轻量更易维护

  • 倒不是要一棒子打死MP,他有他可以使用的场景,但不代表mybatis达不到他的效率或者便捷性。只是出于上述的一些能力考虑,给各位想了解对这俩区别的做一个这个方向上的思路参考

  • MP和原生Mybatis路线是不一样的:MP增强的是上层横向应用能力,接近业务开发,用代码封装(解决)SQL。Mybatis是往极致的对数据库高性能操作,上层应用开发效率上是让给了它的代码生成器来增强。所以严格来说,MP和Mybatis不是一个维度考虑的东西,MP和代码生成器才是一个维度的可比较的东西。代码生成器保持了Mybatis原生的特性(可维护性、可读性、扩展性、性能等等),并且是可高度定制化的。MP的可维护性和可读性在业务复杂度比较高的场景是要低于原生mybatis的

  • 有人更喜欢写代码写MP,但MP局限性比较多,所谓功能增强的并没有那么感人,而已

  • 其实回到了原始的考虑:代码和SQL,你更喜欢维护哪一个

个人建议不能大规模应用的框架,了解能做啥和设计思路就行了,你的团队重度使用它的话,那。。。。不多说,只适合快速小应用开发,虽然五脏俱全,但是不足以抗风抗雨!

除非。。。。除非你就是想用它,毫无理由,跟爱情一样!!!

抄录远古长者的范言:

  • 你倾向于什么,你就更愿意学习什么,就自然会靠近什么,最终最有可能成为什么
  • 相比SQL,任何人都不愿意维护一坨长长的代码
  • 初学者,相比SQL,更熟悉写代码,所以会更愿意用代码来解决SQL问题
  • 代码实现一时爽,维护起来,有几个人就有几行泪
  • 自己维护自己的代码,就好像有些人喜欢挖完鼻子后再闻一闻,掏完耳朵后在欣赏欣赏,回味无穷。但是这件事让别人来做:别人来挖来闻、别人来掏来欣赏、别人来维护你的代码,大都有个想法:砍了你!哪个沙雕写的屎山,还连个形状都没有!
  • 有些工具它对效率的提升,随着业务的复杂度和团队的复杂度增加,他的开发效率大可能是前期很快,到了某个复杂度,越来越慢。如果你评估未来业务复杂度和团队复杂度只会收敛在前期,那么你可以放心的用它

不接受反驳!个人观点,如有不适,把浏览页叉掉即可!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

服务端架构:Mybatis-Plus的优缺点 的相关文章

  • 清理码头 - 删除“不必要”的东西

    我习惯用Jetty http jetty codehaus org jetty 作为我的网络容器 我对我做了什么安装步骤得到原始的焦油球并且清理一些目录和文件从中 我在这里想提出的是 您通常从 Jetty 中删除什么以在生产 登台环境中使用
  • 使用cameltestsupport进行Camel单元测试,模板始终为空

    我正在用 Camel 做一个简单的单元测试 我想做的就是从文件 在资源下 读取 JSON 内容 将其发送到 Java 类进行验证 这是我试图测试的路线 无论我做什么 模板 我用来发送正文 json 始终为空 这是我的代码 public cl
  • 如何使用 SimpleDateFormat 解析多种格式的日期

    我正在尝试解析文档中的一些日期 用户似乎以类似但不完全相同的格式输入了这些日期 以下是格式 9 09 9 2009 09 2009 9 1 2009 9 1 2009 尝试解析所有这些内容的最佳方法是什么 这些似乎是最常见的 但我想让我困扰
  • 对话框上的 EditText 不返回任何文本

    我太累了 找不到错误 我没有发现任何错误 但我没有从 editText 收到任何文本 请看下面的代码 活动密码 xml
  • Grails 2.3.0 自动重新加载不起作用

    我最近将我们的项目升级到 grails 2 3 0 一切工作正常 除了每当我更改代码时自动重新加载都无法工作的问题 这包括所有项目工件 控制器 域 服务 gsps css 和 javascript 文件 我的旧版本 grails 可以正常工
  • 在java中实现你自己的阻塞队列

    我知道这个问题之前已经被问过并回答过很多次了 但我只是无法根据互联网上找到的示例找出窍门 例如this http tutorials jenkov com java concurrency blocking queues html or t
  • 将表值参数与 SQL Server JDBC 结合使用

    任何人都可以提供一些有关如何将表值参数 TVP 与 SQL Server JDBC 一起使用的指导吗 我使用的是微软提供的6 0版本的SQL Server驱动程序 我已经查看了官方文档 https msdn microsoft com en
  • 在 Spring Boot Actuator 健康检查 API 中启用日志记录

    我正在使用 Spring boot Actuator APIproject https imobilenumbertracker com 拥有一个健康检查端点 并通过以下方式启用它 management endpoints web base
  • Dispatcher-servlet 无法映射到 websocket 请求

    我正在开发一个以Spring为主要框架的Java web应用程序 特别使用Spring core Spring mvc Spring security Spring data Spring websocket 像这样在 Spring 上下文
  • 逃离的正确方法是什么?使用 Oracle 12c MATCH_RECOGNIZE 时 JDBCPreparedStatement 中的字符?

    以下查询在 Oracle 12c 中是正确的 SELECT FROM dual MATCH RECOGNIZE MEASURES a dummy AS dummy PATTERN a DEFINE a AS 1 1 但它不能通过 JDBC
  • 解析输入,除了 System.in.read() 之外不使用任何东西

    我很难找到具体的细节System in read 有效 也许有人可以帮助我 似乎扫描仪会更好 但我不允许使用它 我被分配了一个任务 我应该以 Boolean Operator Boolean 的形式读取控制台用户输入 例如T F 或 T T
  • JVM:是否可以操作帧堆栈?

    假设我需要执行N同一线程中的任务 这些任务有时可能需要来自外部存储的一些值 我事先不知道哪个任务可能需要这样的值以及何时 获取速度要快得多M价值观是一次性的而不是相同的M值在M查询外部存储 注意我不能指望任务本身进行合作 它们只不过是 ja
  • 如何在Java中正确删除数组[重复]

    这个问题在这里已经有答案了 我刚接触 Java 4 天 从我搜索过的教程来看 讲师们花费了大量精力来解释如何分配二维数组 例如 如下所示 Foo fooArray new Foo 2 3 但我还没有找到任何解释如何删除它们的信息 从内存的情
  • 哪个集合更适合存储多维数组中的数据?

    我有一个multi dimensional array of string 我愿意将其转换为某种集合类型 以便我可以根据自己的意愿添加 删除和插入元素 在数组中 我无法删除特定位置的元素 我需要这样的集合 我可以在其中删除特定位置的数据 也
  • Java的-XX:+UseMembar参数是什么

    我在各种地方 论坛等 看到这个参数 并且常见的答案是它有助于高并发服务器 尽管如此 我还是找不到 sun 的官方文档来解释它的作用 另外 它是Java 6中添加的还是Java 5中存在的 顺便说一句 许多热点虚拟机参数的好地方是这一页 ht
  • Android - 9 补丁

    我正在尝试使用 9 块图片创建一个新的微调器背景 我尝试了很多方法来获得完美的图像 但都失败了 s Here is my 9 patch 当我用Draw 9 patch模拟时 内容看起来不错 但是带有箭头的部分没有显示 或者当它显示时 这部
  • Android AutoCompleteTextView 带芯片

    我不确定我是否使用了正确的词语来描述此 UI 功能 但我已附上我希望在我的应用程序中实现的目标的快照 它由 Go SMS 使用 用户在编辑文本中键入联系人 在用户从完成下拉列表中选择联系人后 该联系人将被插入到编辑文本中 如附图所示 编辑文
  • 启动Java项目时发生类冲突:ClassMetadataReadingVisitor将接口org.springframework.asm.ClassVisitor作为超类

    我正在使用最新的Spring框架版本 3 2 2 RELEASE 开发一个Java Web项目 但是现在项目启动时遇到了问题 详细错误是 java lang IncompleteClassChangeError 类 org springfr
  • 在哪里存储 Java 的 .properties 文件?

    The Java教程 http download oracle com javase tutorial essential environment properties htmlon using Properties 讨论如何使用 Prop
  • Android 和 Java 中绘制椭圆的区别

    在Java中由于某种原因Ellipse2D Double使用参数 height width x y 当我创建一个RectF在Android中参数是 left top right bottom 所以我对适应差异有点困惑 如果在 Java 中创

随机推荐

  • 【GIN】上下文 bind的几种方法

    1 Bind var req vo RegisterRequest ctx Bind req It writes a 400 error and sets Content Type header text plain in the resp
  • VM虚拟机中的web服务内网穿透的设置,虚拟机连接主机的mysql(主机win10 虚拟机win10)

    前言 由于我的主机里环境弄得乱七八糟 无法正常使用阿帕奇 我又不想重置电脑 所以就想在虚拟机里配置环境 结果我的虚拟机无法安装mysql 于是就用虚拟机访问主机的mysql 我在虚拟机里部署的Flask项目 然后WEB服务器用的是阿帕奇2
  • 对于全连接层的理解 全连接层的推导

    全连接层的推导 全连接层的每一个结点都与上一层的所有结点相连 用来把前边提取到的特征综合起来 由于其全相连的特性 一般全连接层的参数也是最多的 全连接层的前向计算 下图中连线最密集的2个地方就是全连接层 这很明显的可以看出全连接层的参数的确
  • 等响度曲线_什么是“响度”

    转自 https blog csdn net weixin 36225384 article details 112220422 原文 https www tonmeister ca wordpress 2014 06 07 bo tech
  • 正则表达式 匹配美元等多种货币符号的超简单方法

    p Sc 带小数点也不怕 Symbol Meaning p a character with the xx property Sc Currency symbol 方法二 暴力匹配 正则表达式 xA2 xA5 u058F u060B u09
  • QT开发之QString转换之路

    编程中少不了字符串的使用 QT提供了QString变量类型 字符串链表可直接使用QStringList进行变量定义和声明 那如果使用了其他表示字符串的变量应该怎么相互转化呢 这里就列举几个常用的几个类型之间的转化 错误之处 还望指出批评 1
  • 蓝桥杯2023模拟赛 滑行题目编号2414

    问题描述 小蓝准备在一个空旷的场地里面滑行 这个场地的高度不一 小蓝用一个 n 行 m 列的矩阵来表示场地 矩阵中的数值表示场地的高度 如果小蓝在某个位置 而他上 下 左 右中有一个位置的高度 严格 低于当前的高度 小蓝就可以滑过去 滑动距
  • 当你在浏览器中输入了网址访问时产生了哪些技术步骤

    当你在浏览器中输入了网址访问时产生了哪些技术步骤 前段时间在知乎上了看一些网络方面的知识 刚好小编自己也是从事这一块的相关工作由对网络方面有一定的了解 今天我们来讲讲 当你在浏览器中输入本站域名并回车后 这背后到底发生来什么事情 因平台原因
  • 如何让IE8及以下版本浏览器支持HTML5新的定义元素?

    如何让IE8及以下版本浏览器支持HTML5新的定义元素 1 我们都知道HTML5在HTML4的基础上 增加了很多新的特性和元素 其中也包括定义元素 比如 header section footer aside nav 但是这些元素在低版本的
  • 记一次个别网站不能访问的问题

    这是天猫的网站 之前我突然电脑不能访问这些网站 我试了很多种办法 都是失败 1 修改用户名 2 修改本地策略 3 后来又把浏览器 包括ie全部设置清除 4 还去选了下自动获取dns 最后我用cmd gt net int ip reset g
  • RuntimeError: CUDA error: CUBLAS_STATUS_EXECUTION_FAILED when calling `cublasSgemm( handle, opa, opb

    今天跑一个项目时遇到了如下问题 RuntimeError CUDA error CUBLAS STATUS EXECUTION FAILED when calling cublasSgemm handle opa opb m n k alp
  • 【GUI】LVGL8内存泄漏分析

    LVGL版本 V8 0 2 平台 ESP32S3 在调试过程中 发现有两个界面 在重复退出再进入时内存会不断增加的吃内存现象 然后做了分析和研究 1 样式style吃内存 在主页面 进入simple页面 再退出到主页面 再次进入simple
  • eNSP搭建USG6000V防火墙教程-web

    eNSP搭建USG6000V防火墙教程 web 1 先注册设备 很重要 一定要先注册设备 2 创建USG6000V 3 启动防火墙和连接客户机 3 开启一系列的功能和配置ip 4 避坑指南 1 先注册设备 很重要 一定要先注册设备 2 创建
  • vscode使用json后在浏览器报404not found

    user id 1 show 玲珑骰子安红豆 入骨相思知不知 name 王维 id 2 show 五花马 千金裘 name 李白 id 3 show 仰天大笑出门去 我辈岂是蓬蒿人 name 李白 list 王维 李白 如上是我写的json
  • c语言编程请增补函数fun

    题目 填空题 请增补函数fun 该函数的功能是 把从主函数中输入的字符串str2接在字符串str2的背面 例似 str2 How do str2 you do 结论输出 How do you do 试题程序 include include
  • 第十二届蓝桥杯国赛-H:和与乘积-python

    一 问题描述 二 问题分析 对于输入的一个数列 求这个数列的满足以下条件的区间个数 该区间的元素和与元素积相等 思路就是计算每一个区间的元素和与元素积 如果相等就计数加一 获取每个区间采用前缀和跟前缀积的方法 详见代码 注 这种方法也只能通
  • Sass语法学习

    1 编译监控 自动监控把sass编译成css文件 命令行 sass watch sass basic scss css basic css 在监控的sass后面 可以为 sass 生成 css 样式指定生成的格式 默认是nested型 st
  • 手机端网页:可拖拽悬浮按钮

    div style width 60px height 60px img src im div
  • cesium for unreal文档中的更新

    以前调试过cesium for unreal 再调试时一惊 发现api变了 静下心来思考流程 1 样本条要放在actor里 2 包含样本条的actor坐标放在原点 3 样本条坐标和法向量都要从经纬高到ue空间转换 变的只是api 所以深入了
  • 服务端架构:Mybatis-Plus的优缺点

    前段时间帮朋友处理java后端架构问题 看到了mybatis plus 其实早几年就知道这个东西 但一直没用没学 这两天许久未见的web服务看了看 聊聊个人感受 如有不适 请见谅 文章目录 优点 缺点 1 对数据访问层DAO的上层入侵太强