mybatis-plus自带QueryWrapper自定义sql实现复杂查询实例详解

目录
  • 常用写法
  • 自定义sql
  • 补充: 查询条件中使用函数apply
  • 补充: 末尾sql追加last
  • 补充:排序
  • 补充:Mybatis-Plus QueryWrapper +sql自定义查询
  • 总结

常用写法

xxxDO=实体类, 相当于:

select name, id from xxx group by name where delete_flag = 0 and status = 0

    LambdaQueryWrapper<xxxDO> queryWrapper = Wrappers.lambdaQuery();
    queryWrapper.select(xxxDO::getName, DO::getId);
    queryWrapper.eq(xxxDO::getDeleteFlag, 0);
    queryWrapper.eq(xxxDO::getStatus, 0);
    queryWrapper.groupBy(xxxDO::getName);
    List<xxxDO> list = getBaseMapper().selectList(queryWrapper);

自定义sql

xxxDO=实体类,相当于:

select sex, ifnull(count(id), 0) AS num, CASE WHEN sex = 1 THEN '男' WHEN sex = 0 THEN '女' ELSE '未知' END AS sexStr from xxx group by sex where status = 0

    LambdaQueryWrapper<xxxDO> queryWrapper = new QueryWrapper<xxxDO>()
            .select("sex, ifnull(count(id), 0) AS num, CASE WHEN sex = 1 THEN '男' WHEN sex = 0 THEN '女' ELSE '未知' END AS sexStr").lambda();
    queryWrapper.eq(xxxDO::getStatus, 0);
    queryWrapper.groupBy(xxxDO::getSex);
    List<Map<String, Object>> mapList = getBaseMapper().selectMaps(queryWrapper);
    Map<String, String> registerNumMap = new HashMap<>(mapList.size());
    for (Map<String, Object> map : mapList) {
        String key = String.valueOf(map.get("sexStr"));
        String num = String.valueOf(map.get("num"));
        registerNumMap.put(key, num);
    }

返回结果是一个list, 里面的map key是查询的属性名, value是参数值。伪代码示意:

list[0]

map[0] (sex=1)

map[1] (num=5)

map[2] (sexStr=男)

list[1]

map[0] (sex=1)

map[1] (num=5)

map[2] (sexStr=男)

偶然而发, 记录一下

补充: 查询条件中使用函数apply

    queryWrapper.apply("INET_ATON(qsip) <= INET_ATON({0})", ipQuery);
    queryWrapper.apply("INET_ATON(zzip) >= INET_ATON({0})", ipQuery);

补充: 末尾sql追加last

        queryWrapper.last(" order by id asc");
        queryWrapper.last("limit 1");

补充:排序

        // last也可以追加limit 这里用page接口

        IPage<Entity> buildPage = new Page<>(0, 200);
        // ServiceImpl的page调用的是baseMapper的selectPage, getBaseMapper().selectPage()
        IPage<Entity> page = page(buildPage, queryWrapper);

sql打印

补充:Mybatis-Plus QueryWrapper +sql自定义查询

一: 需要自定义的QueryWrapper查询工具类,定义查询规则

public static final String SQL_RULES_COLUMN = "SQL_RULES_COLUMN";

private static final String BEGIN = "_begin";  // 字段范围查询开始标识
private static final String END = "_end";  // 字段范围查询结束标识
private static final String STAR = "*";  // 字段模糊查询标识
private static final String COMMA = ",";
private static final String NOT_EQUAL = "!";

二: 正常的QueryWrapper查询,在mapper文件中使用 @Param(Constants.WRAPPER)

List<Emdj> listAll(IPage<Emdj> page, @Param(Constants.WRAPPER) QueryWrapper<Emdj> queryWrapper);

xml文件中使用ew.customSqlSegment,<where>标签可以不加

   <select id="listAll" resultType="net.zazn.modules.discipline.entity.Emdj">
       select id,lffh,xm,jsh,szrq,emlx,spzt,gjmj,flag,jlzt
       from emdj
       <where>${ew.customSqlSegment}</where>
   </select>

总结

到此这篇关于mybatis-plus自带QueryWrapper自定义sql实现复杂查询的文章就介绍到这了,更多相关mybatis-plus自定义sql实现复杂查询内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • mybatis-plus QueryWrapper自定义查询条件的实现

    mybatis-plus框架功能很强大,把很多功能都集成了,比如自动生成代码结构,mybatis crud封装,分页,动态数据源等等,附上官网链接https://mp.baomidou.com/,github上有代码例子,国内小伙伴推荐码云https://gitee.com/baomidou/mybatis-plus.  但是,其中还是有些小坑,文档也没有涉及的很全面,碰到问题,百度或者发issue,能力强的还是直接看源码好,一切答案都在源码中. 版本推荐用3.1.0,3.1.1及以上版本有bu

  • MyBatis-Plus自定义SQL的详细过程记录

    目录 前言 一.在src/main/resource目录下编写XML 1.1  目录结构 1.2   编写实体类对应的Mapper接口 1.3  编写UserMapper.xml 1.4  在配置文件中扫描我们的xml配置的位置. 1.5  测试 二.在src/main/java目录下编写XML 2.1  目录结构 2.2   编写实体类对应的Mapper接口 2.3   编写UserMapper.xml 2.4   编写配置文件 2.5   配置pom.xml(重要) 2.6  测试 三.cl

  • MyBatis-Plus 自定义sql语句的实现

    一.引言 Good Good Study,Day Day Up,童鞋点个关注,不迷路,么么哒--- MP自带的条件构造器虽然很强大,有时候也避免不了写稍微复杂一点业务的sql,那么那么今天说说MP怎么自定义sql语句吧. 二.配置 自定义的sql当然是写在XML文件中的啦,那么首先来定义xml文件的位置,在yml配置文件如下 mybatis-plus: # 如果是放在src/main/java目录下 classpath:/com/*/*/mapper/*Mapper.xml # 如果是放在res

  • mybatis-plus实现自定义SQL、多表查询与多表分页查询语句实例

    目录 前言 1.自定义SQL 2.多表查询 3.多表分页查询 4.多表分页条件查询 总结 前言 本文介绍了在mybatis-plus中如何实现:自定义SQL语句,多表查询语句,多表分页查询语句 在说怎么实现之前我们要先明白一个概念,就是mybatis-plus是在mybatis的基础上进行增强,并不做改变,所以mybatis的操作在mybatis-plus中也是一样可以使用的,咱们直接上代码 1.自定义SQL 在mapper中自定义一个方法即可 @Repository public interf

  • MyBatis-Plus 分页查询以及自定义sql分页的实现

    一.引言 分页查询每个人程序猿几乎都使用过,但是有部分同学不懂什么是物理分页和逻辑分页. 物理分页:相当于执行了limit分页语句,返回部分数据.物理分页只返回部分数据占用内存小,能够获取数据库最新的状态,实施性比较强,一般适用于数据量比较大,数据更新比较频繁的场景. 逻辑分页:一次性把全部的数据取出来,通过程序进行筛选数据.如果数据量大的情况下会消耗大量的内存,由于逻辑分页只需要读取数据库一次,不能获取数据库最新状态,实施性比较差,适用于数据量小,数据稳定的场合. 那么MP中的物理分页怎么实现

  • mybatis-plus自带QueryWrapper自定义sql实现复杂查询实例详解

    目录 常用写法 自定义sql 补充: 查询条件中使用函数apply 补充: 末尾sql追加last 补充:排序 补充:Mybatis-Plus QueryWrapper +sql自定义查询 总结 常用写法 xxxDO=实体类, 相当于: select name, id from xxx group by name where delete_flag = 0 and status = 0 LambdaQueryWrapper<xxxDO> queryWrapper = Wrappers.lamb

  • mybatis的动态SQL和模糊查询实例详解

    现在以一个例子来介绍mybatis的动态SQL和模糊查询:通过多条件查询用户记录,条件为姓名模糊匹配,并且年龄在某两个值之间. 新建表d_user: create table d_user( id int primary key auto_increment, name varchar(10), age int(3) ); insert into d_user(name,age) values('Tom',12); insert into d_user(name,age) values('Bob

  • MyBatis 动态SQL和缓存机制实例详解

    有的时候需要根据要查询的参数动态的拼接SQL语句 常用标签: - if:字符判断 - choose[when...otherwise]:分支选择 - trim[where,set]:字符串截取,其中where标签封装查询条件,set标签封装修改条件 - foreach: if案例 1)在EmployeeMapper接口文件添加一个方法 public Student getStudent(Student student); 2)如果要写下列的SQL语句,只要是不为空,就作为查询条件,如下所示,这样

  • mybatis防止SQL注入的方法实例详解

    SQL注入是一种很简单的攻击手段,但直到今天仍然十分常见.究其原因不外乎:No patch for stupid.为什么这么说,下面就以JAVA为例进行说明: 假设数据库中存在这样的表: table user( id varchar(20) PRIMARY KEY , name varchar(20) , age varchar(20) ); 然后使用JDBC操作表: private String getNameByUserId(String userId) { Connection conn

  • Android自定义View的实现方法实例详解

    一.自绘控件 下面我们准备来自定义一个计数器View,这个View可以响应用户的点击事件,并自动记录一共点击了多少次.新建一个CounterView继承自View,代码如下所示: 可以看到,首先我们在CounterView的构造函数中初始化了一些数据,并给这个View的本身注册了点击事件,这样当CounterView被点击的时候,onClick()方法就会得到调用.而onClick()方法中的逻辑就更加简单了,只是对mCount这个计数器加1,然后调用invalidate()方法.通过 Andr

  • Android 带清除功能的输入框控件实例详解

    Android 带清除功能的输入框控件实例详解 今天,看到一个很好的自定义输入框控件,于是记录一下. 效果很好: 一,自定义一个类,名为ClearEditText package com.example.clearedittext; import android.content.Context; import android.graphics.drawable.Drawable; import android.text.Editable; import android.text.TextWatc

  • Android 自定义imageview实现图片缩放实例详解

    Android 自定义imageview实现图片缩放实例详解 觉得这个自定义的imageview很好用 性能不错  所以拿出来分享给大家  因为不会做gif图  所以项目效果 就不好贴出来了  把代码贴出来 1.项目结构图 2.Compat.class package com.suo.image; import android.os.Build.VERSION; import android.os.Build.VERSION_CODES; import android.view.View; pu

  • yii2带搜索功能的下拉框实例详解

    简单的小功能,但是用起来还是蛮爽的.分享出来让更多的人有更快的开发效率,开开心心快乐编程. 如果你还没有使用过composer,你可就out了,看我的教程分享,composer简直就是必备神奇有木有.都说到这个点上了,我们赶紧使用composer进行安装吧. 先给大家展示下效果图: 下面给大家说下具体实现思路: composer require kartik-v/yii2-widget-select2 "@dev" #特别说明,因为这里安装的dev版本,也就是开发版本,不稳定版本,如果

  • js中自定义react数据验证组件实例详解

    我们在做前端表单提交时,经常会遇到要对表单中的数据进行校验的问题.如果用户提交的数据不合法,例如格式不正确.非数字类型.超过最大长度.是否必填项.最大值和最小值等等,我们需要在相应的地方给出提示信息.如果用户修正了数据,我们还要将提示信息隐藏起来. 有一些现成的插件可以让你非常方便地实现这一功能,如果你使用的是knockout框架,那么你可以借助于Knockout-Validation这一插件.使用起来很简单,例如我下面的这一段代码: ko.validation.locale('zh-CN');

  • Angular7中创建组件/自定义指令/管道的方法实例详解

    组件 使用命令创建组件 •创建组件的命令:ng generate component 组件名 •生成的组件组成: 组件名.html .组件名.ts.组件名.less.组件名.spec.ts •在组件的控制器 @Component({ selector: 'app-heroes', templateUrl: './heroes.component.html', styleUrls: ['./heroes.component.less'] }) 手动创建组件 1.创建一个组件ts文件 2.在组件中设

随机推荐