分享

5.mybatisPlus自定义SQL_mybatisplus 自定义sql

 lichwoo 2023-07-01 发布于北京

今日内容

MP自带的条件构造器虽然很强大,有时候也避免不了写稍微复杂一点业务的sql,比如多表查询。

那么那么今天说说MP怎么自定义sql语句吧。另外,除了下文提到的通过queryWrapper实现筛选以外,调用查询时,如果你需要做分页,通过mybatisPlus提供的分页接口IPage,能够避免自己手写分页的sql语句,这么好用的东西,你还不入坑吗?

QueryWrapper\Wrapper联系

在这里插入图片描述

在这里插入图片描述

总结:QueryWrapper是Wrapper下面的类。 -->完全可以用到多态;令QueryWrapper实例指向Wrapper对象。 记住:多态,参数类型是Wrapper类型,调用者传递QueryWrapper类型。

因为官方文档里面写的参数类型都是父级类型,不要再说看不懂官方文档。

wapper介绍 :
Wrapper : 条件构造抽象类,最顶端父类,抽象类中提供4个方法
AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
AbstractLambdaWrapper : Lambda 语法使用 Wrapper统一处理解析 lambda 获取 column。
LambdaQueryWrapper : 看名称也能明白就是用于Lambda语法使用的查询Wrapper
LambdaUpdateWrapper : Lambda 更新封装Wrapper
QueryWrapper : Entity 对象封装操作类,不是用lambda语法
UpdateWrapper : Update 条件封装,用于Entity对象更新操作
————————————————
版权声明:本文为CSDN博主「简素@」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_43048586/article/details/90025128

使用 Wrapper 自定义SQL

需求来源:

在使用了mybatis-plus之后, 自定义SQL的同时也想使用Wrapper的便利应该怎么办? 在mybatis-plus版本3.0.7得到了完美解决 版本需要大于或等于3.0.7, 以下两种方案取其一即可

mybatisPlus的条件构造器进行简单的操作还行,但是我的复杂操作如多表查询,条件构造器就显得捉襟见肘了。

还有一个更重要的原因:我想用他的分页插件。 如果我使用mybatis写法就不能使用mybatisPlus的分页插件了。

自定义SQL-官方文档

在这里插入图片描述

${ew.sqlSegment} 是补充条件的—QueryWrapper的条件构造器的条件。

官方文档写的有点笼统,现在我们看看网友的详细写法:

Mybatis-plus中自定义的sql语句调用QueryWrapper实现查询

这个只是讲述了自定义sql,没有涉及自定义sql和分页一起的使用。

网址案例通过测试是成功的。

但这往往不够,实际我们会使用更多复杂的sql语句。会往自定义sql语句里面传递值,会需要分页。

自定义SQL/分页/条件构造器一起使用返回分页数据

[MyBatis-Plus 分页查询以及自定义sql分页(很好的文档)]

这是三大技术点整合,看见分页技术就知道结果一定是返回分页的数据的。

当然,如果是自定义SQL和条件构造器两个技术整合,我们返回的是集合。

记住:分页不过也是limit语句,也是sql语句罢了,不要想太神。

注意:这个条件构造器与两外两个技术整合一起使用的前提有点苛刻,要求返回数据model格式必须是和这个表的字段对应,然后在表明的后面帮我们添加一系列条件。–${ew.sqlSegment} 是补充条件的,他的位置决定你的条件构造器的条件加到哪里。

但是,可能有时候我们的sql语句过于复杂,在多表查询的时候需要你传递一个参数或几个参数。放心,条件构造器该用就用,判断好位置就行;这几个参数该传就传,和mybatis操作一样。

web核辐射真实案例

controller

在这里插入图片描述

 //初始化页面
    @GetMapping("/baoJingList")
    @ResponseBody
   // @RequiresPermissions("fushe:baojing:baojing")
    Map<String,Object> roleList(@RequestParam Map<String, Object> params){
        Long currrentPage =Long.parseLong(params.get("page")+"");
        Long size =Long.parseLong(params.get("limit")+"");
        String sheBeiAdd = params.get("SheBeiId")+"";
        Long deptId = Long.parseLong(params.get("deptId")+"");

        QueryWrapper<EaBaojing> queryWrapper =  new QueryWrapper<>();
        queryWrapper.orderByDesc("Id");//降序
        if( sheBeiAdd.length()!=0) { //如果username没有数据为"",则不加入条件
            queryWrapper.like("SheBeiId", params.get("SheBeiId") + "");//条件构造器
        }
        if( deptId!=-1) {
            //表格过滤
            List<Integer> depts =sysDeptMapper.deptListByDeptId(deptId.intValue());
            depts.add(deptId.intValue());
            queryWrapper.in("Memo", depts);//条件构造器
        }

        Page<EaBaojing> page = new Page( currrentPage, size);  // 查询第x页,每页返回x条
        //条件构造器+自定义sql+分页,三大技术给你整合好好的,mybatisplus厉害。
        IPage<EaBaojing> iPage =baojingMapper.selectListByWrapper(page,queryWrapper);


        Map<String,Object> map = new HashMap<>();
        map.put("total",iPage.getTotal());  //
        map.put("data",iPage.getRecords()); //返回的数据是selectListByWrapper
        return map;
    }

}

mapper.java

public interface EaBaojingMapper extends BaseMapper<EaBaojing> {

    //参数里面传递的是我们在调用这个方法的包装类型,Wrapper是抽象类,querywrapper继承了他。
    IPage<EaBaojing> selectListByWrapper(Page<EaBaojing> page, @Param(Constants.WRAPPER) Wrapper<EaBaojing> queryWrapper);

}

mapper.xml

    <select id="selectListByWrapper" resultType="com.hdeasy.fushe.entity.EaBaojing">
    SELECT * FROM (
       SELECT a.id, a.fushe,a.baojingtype,a.content,a.yujing,a.baojing,a.riqi,a.memo,b.shebeiname
               AS shebeiid FROM ea_baojing  a LEFT JOIN ea_shebei b ON a.shebeiid = b.address
          )c ${ew.customSqlSegment}
    </select>

${ew.customSqlSegment}的位置决定了条件构造器的条件在哪。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多