前言
mp 从出现就一直有争议 感觉一直 都存在两种声音
like:
很方便啊 通过函数自动拼接sql 不需要去xml 再去使用标签 之前一分钟写好的sql 现在一秒钟就能写好 简直不要太方便
dislike:
侵入service层 不好维护 可读性差 代码耦合 效率不行 sql优化比较难
之前也有前辈说少用mp 理由就是不好维护 但是这个东西真的是方便 只要不是强制不让用 就还是会去使用 存在集合里 最近也确实有一些体会 就从两个角度去看一下mp
优点
操作简洁
就从我们编码中最常用的增删改查去说
按照我们之前去使用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().eq(id,1).select(id));
这汇总写法 我们可以通过后面的select() 去指定我们需要查询的字段 算是解决上面那个问题吗 但是这个就完事了吗?这还有一个问题
我们在开发中经常会说一个叫魔法值的东西
//这个就是魔法值 if (变成派大星.equals(node.getname())){ system.out.println(魔法值);}
之所以不要多用魔法值就是为了后期维护 我们建议使用枚举 或者建一个常量类 通过static final修饰
上面那段代码是不是也有同样问题 id算不算魔法值呢 这种构造器产生的问题就是 不好维护
假设 我们的这node类是高度使用的 我们到处都在写
nodemapper.selectone(new querywrapper().eq(id,1).select(id));
刚开始没事 我们乐呵呵的 但是一旦我去修改id 的字段名怎么办
我修改成test(数据库同步修改) 现在这个实体类中没有这个字段 我们再去看我们的代码
没有什么反应 没有给我提示报错 我这个时候去运行怎么办 我要一个个去找这个错误吗 这明显很费时间
这个确实是一个问题 但是也是可以解决的
node node = nodemapper.selectone(new lambdaquerywrapper().eq(node::getid, 1).select(node::getid));
上面这种代码就可以去解决这个问题 我们在使用的时候可以多用这个东西
一旦修改字段就会立马报错
但是 这就万事大吉了吗 no no no 我们要是处理稍微复杂的语句怎么办?比如如我们字段求和 这个lambdaquerywrapper还是存在限制的
如果我们想实现这种 怎么去做呢
select sum(price_count) from bla_order_data limit 100
首先这种写法肯定是不太行的 编译不通过
除非去使用querywrapper
还有就是分页查询
// 条件查询lambdaquerywrapper querywrapper = new lambdaquerywrapper();querywrapper.eq(userinfo::getage, 20);// 分页对象page querypage = new page(page, limit);// 分页查询ipage ipage = userinfomapper.selectpage(querypage , querywrapper);// 数据总数long total = ipage.gettotal();// 集合数据list 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不要用
即将要出的小米6大家期待什么?是否难抢?
一种支持I/O的核外中断执行算法
AI信任与人才:可持续发展的智能+未来
利用新型MEMS开关提高测试能力和系统生产力
2020年Q1季度我国蜂窝物联网和IPTV规模稳扩大
Mybatis-Plus使用技巧与隐患分析
从中电数通智慧城市安全智脑看“人本”理念的重要性
Q1季度全球智能手表出货量同比增长12%,苹果以36.3%的市场份额居首
220v转110电路图
奔驰乌尼莫克,8个前进挡,6个倒退档,通过一切障碍物是没有问题,这款超级越野车直接碾压路虎
极海APM32F030x6冰箱压缩机应用方案满足冰箱压缩机系统的应用需求
ESP RainMaker 开发介绍
苹果或在未来新开辟ARM Mac Pro的产品线
关于电动汽车的电池充电技术
重安全保质量 萤石获颁中国质量检验协会三项大奖
看看这些你就懂了 它将是屏下指纹的领导者
国轩高科表示将为中国铁塔提供通讯基站用储能电池
什么是芯片?芯片与集成电路的联系与区别
关于车联网技术的分析和介绍
LED发光二极管并联使用的影响