一. 常用解决方案

1.常规的在xml直接写sql语句
2.但是mybatis-plus为我们提供的动态sql生成,下面以此为例

在这里插入图片描述


二. 动态拼接sql

背景: 用户可以输入以下内容. 不输入即为全查询.因此字段均可以为空值.
在这里插入图片描述
其中检索字段可以通过id或商品名称查询 (重点讲该检索字段的sql拼接)

正例(可一劳永逸):


        // nested 是 正常嵌套但不带 and
        // apply可以写sql语句  
        // nested 配合 apply 即可避免where直接拼接 连接语句
        // 例: where ((1=1) and sku_id = skuInfoFindRangeVo.getKey()) or sku_name = skuInfoFindRangeVo.getKey();
        QueryWrapper<SkuInfoEntity> wrapper = new QueryWrapper<>();
        wrapper.nested(w -> w.apply("1=1").eq(StringUtils.isNotBlank(skuInfoFindRangeVo.getKey()),
                                "sku_id", skuInfoFindRangeVo.getKey()).or()
                        .eq(StringUtils.isNotBlank(skuInfoFindRangeVo.getKey()),
                                "sku_name", skuInfoFindRangeVo.getKey()))

反例1:

        // 例: where and (1=1 and sku_id = skuInfoFindRangeVo.getKey()) or sku_name = skuInfoFindRangeVo.getKey();
        QueryWrapper<SkuInfoEntity> wrapper = new QueryWrapper<>();
        wrapper.and(w -> w.apply("1=1").eq(StringUtils.isNotBlank(skuInfoFindRangeVo.getKey()),
                                "sku_id", skuInfoFindRangeVo.getKey()).or()
                        .eq(StringUtils.isNotBlank(skuInfoFindRangeVo.getKey()),
                                "sku_name", skuInfoFindRangeVo.getKey()))

反例1:直接拼接了连接语句.

提示应该大部分实际开发中,都要求写mapper吧.....

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐