MybatisPlus经典示例:使用Wrapper查询指定字段并添加字段函数处理、过滤字段查询、自定义sql、单独set某个字段...

🍬🍬🍬文章目录

查询

其他


本文基于MybatisPlus3.0.6,首先建议要好好看文档:MyBatis-Plus文档

大前提:CURD的执行接口需要有Wrapper传参,比如list(Wrapper<T> queryWrapper)、page(IPage<T> page、Wrapper<T> queryWrapper)、listObjs(Wrapper<T> queryWrapper)

以下代码我把LambdaQueryWrapper和QueryWrapper混用的,实际上用哪个都行。用Lambda的好处是降低代码的耦合性(不需要把字段名写死),但是不利于添加函数处理。(懂的不要奇怪,不懂的留言或者进群讨论)


查询

🍬 01. 只查询指定字段

select(字段1,字段2…)

public List<ClientBanner> getListById(String businessId) {
    LambdaQueryWrapper<ClientBanner> wrapper = new LambdaQueryWrapper();
    // 商家图片,未删除,可用状态
    wrapper.eq(ClientBanner::getBusinessId,businessId)
            .eq(ClientBanner::isDelState,false)
            .eq(ClientBanner::isUsable,true)
            .select(ClientBanner::isDelState,ClientBanner::getBusinessId); // 只查询指定字段
    List<ClientBanner> list = this.list(wrapper);
    return list;
}

控制台打印

: ==>  Preparing: SELECT del_state,business_id FROM client_banner WHERE business_id = ? AND del_state = ? AND usable = ? 
: ==> Parameters: 55456(String), false(Boolean), true(Boolean)
: <==      Total: 2

不用LambdaQueryWrapper的方式为: 02. 对查询字段进行函数处理

🍬 02. 对查询字段进行函数处理

使用QueryWrapper,传入数据库字段的时候加上"left(content,2) content" 这种函数处理 (别忘了起别名)

public IPage<ClientEncyArticles> listBySplitPage(SplitPageDTO dto) {
    QueryWrapper<ClientEncyArticles> wrapper = new QueryWrapper<ClientEncyArticles>();
    wrapper.eq("del_state",false)
            .orderByDesc("create_time")
            .select("id","author","left(content,2) content","cover_picture","create_time");
    IPage<ClientEncyArticles> page = this.page(new Page<>(dto.getPage(), dto.getPageSize()), wrapper);
    return page;
}

控制台打印

: ==>  Preparing: SELECT id,author,left(content,2),cover_picture,create_time FROM client_ency_articles WHERE del_state = ? ORDER BY create_time DESC LIMIT ?,? 
: ==> Parameters: false(Boolean), 0(Long), 10(Long)
: <==      Total: 10

🍬 03. 排除/过滤字段查询

文档提到:过滤查询字段(主键除外),入参不包含 class 的 调用前需要wrapper内的entity属性有值!指定字段查询和过滤字段查询这两类方法重复调用以最后一次为准 (指定查询和过滤查询不会同时存在)

  • 即过滤查询不能过滤主键
  • 使用过滤查询时需要传clsss参数或者用setEntity方法,目的就是把实体传过去。看下面代码

使用select(i->!i.()) (如果不加! 就是指定字段查询,这种指定字段查询不如 01. 只查询指定字段02. 对查询字段进行函数处理 简便)

  • .select(i->!i.getProperty().equals("delState"));
  • .select(i->!i.getColumn().equals("del_state"));
public IPage<ClientEncyArticles> listBySplitPage(SplitPageDTO dto) {
    ClientEncyArticles cc = new ClientEncyArticles();
    QueryWrapper<ClientEncyArticles> wrapper = new QueryWrapper<ClientEncyArticles>();
    wrapper.eq("del_state",false)
    		//.setEntity(new ClientEncyArticles()) //如果下边参数不写ClientEncyArticles.class,这里要加setEntity
            .orderByDesc("create_time")
            // .select(ClientEncyArticles.class,i->!i.getColumn().equals("del_state")); // 填的是数据库字段名
            .select(ClientEncyArticles.class,i->!i.getProperty().equals("delState")); // 填的是实体类字段名,个人认为用这个好一些
    IPage<ClientEncyArticles> page = this.page(new Page<>(dto.getPage(), dto.getPageSize()), wrapper);
    return page;
}

控制台打印

==>  Preparing: SELECT id,author,type,content,cover_picture,create_time FROM client_ency_articles WHERE del_state=? AND del_state = ? ORDER BY create_time DESC LIMIT ?,? 
==> Parameters: false(Boolean), false(Boolean), 0(Long), 10(Long)
<==      Total: 10

😁欢迎加入QQ群交流: [游戏-Web-开发技术栈 ☄️] ‘300567032’
点击下方图标一键加入!
游戏-Web-开发技术栈 ☄


其他

🍬自定义where后的所有内容,直接写sql

文档-last函数:无视优化规则直接拼接到sql的最后。
在这里插入图片描述
最终可以这样:按照本文上边的查询用法,相当于自定义了sql的select部分;剩下的直接用last函数开搞,整体相当于是手写SQL
(不知道mybatisplus具体的优化规则是什么样的,偶尔使用、自己注意下sql的效率应该没什么问题)

不过,如果真要这么用,可能还不如直接写SQL顺手


🍬单独set某个字段

update()函数 (文档链接)

源码

示例
在这里插入图片描述


😁欢迎加入QQ群交流: [游戏-Web-开发技术栈 ☄️] ‘300567032’
点击下方图标一键加入!
游戏-Web-开发技术栈 ☄


  • 28
    点赞
  • 118
    收藏
  • 打赏
    打赏
  • 21
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:技术黑板 设计师:CSDN官方博客 返回首页
评论 21

打赏作者

无数_mirage

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值