记录于 2023.09.18 个人博客,现转录CSDN

QueryWrapper = MyBatis-Plus 提供的「SQL 条件自动拼接工具」
不用手写 SQL 语句,用 Java 链式代码,自动帮你拼出 where、order by、like、in、between 等查询条件。

1.多条数据查询

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import java.util.Map;

@Service("xxService")
public class XxServiceImpl extends ServiceImpl<XxDao, IndexEntity> implements XxService {

    @Override
    public List<IndexEntity> getList(Map<String, Object> params) {
        LambdaQueryWrapper<IndexEntity> qw = new LambdaQueryWrapper<>();

        // 日期 = ?
        qw.apply(StringUtils.isNotBlank((String) params.get("statisDate")),
                "to_date(STATIS_DATE, 'yyyy-mm-dd') = {0}",
                params.get("statisDate"));

        // 类型 = ?
        qw.eq(params.containsKey("Type") && params.get("Type") != null,
                IndexEntity::getType, params.get("Type"));

        // 时间范围(防注入)
        qw.apply(params.containsKey("insertTimeStart") && params.containsKey("insertTimeEnd"),
                "INSERT_TIME BETWEEN to_date({0}, 'yyyy-mm-dd') AND to_date({1}, 'yyyy-mm-dd')",
                params.get("insertTimeStart"),
                params.get("insertTimeEnd"));

        // 模糊查询
        qw.like(params.containsKey("province") && params.get("province") != null,
                IndexEntity::getProvince, params.get("province"));

        // 非空 + 排序
        qw.isNotNull(IndexEntity::getIndexId)
          .orderByAsc(IndexEntity::getCreateTime);

        return list(qw);
    }
}

原代码特点

混合使用 普通 QueryWrapper + lambda ()
直接用 字符串拼接 SQL(日期、between)
条件多:等于、日期、范围、模糊、非空、排序
从 Map 取参数,判空方式不统一

优点

能实现功能
逻辑清晰,能看懂

缺点(非常关键)

严重 SQL 注入风险(直接拼参数)
混用普通字段 + Lambda,极不规范
容易空指针(params.get () 没判空)
代码丑、难维护
Oracle 函数写死,移植性差

适合场景

临时需求、快速开发、内部小系统

2.select指定字段

  @Override
public PageUtils queryPage(Map<String, Object> params) {
    LambdaQueryWrapper<CUserEntity> qw = new LambdaQueryWrapper<>();

    // 只查询需要的字段(实体类引用,不会写错)
    qw.select(
            CUserEntity::getId,
            CUserEntity::getXxx,
            CUserEntity::getSs,
            CUserEntity::getStatisDate
    );

    // 日期范围(安全写法)
    qw.apply(StringUtils.isNotBlank((String) params.get("statisDateStart")),
            "STATIS_DATE BETWEEN to_date({0}, 'yyyy-MM-dd hh24:mi:ss') AND to_date({1}, 'yyyy-MM-dd hh24:mi:ss')",
            params.get("statisDateStart"),
            params.get("statisDateEnd"));

    // 排序
    qw.orderByAsc(CUserEntity::getStatisDate);

    // 分页
    IPage<CUserEntity> page = this.page(new Query<CUserEntity>().getPage(params), qw);
    return new PageUtils(page);
}

原代码特点

使用 .select() 自定义查询字段(含别名、日期格式化)
用 apply 拼接日期范围
分页查询

优点

只查需要字段,性能好
分页正常工作

缺点

手写字段字符串,容易写错
别名混乱(id as 、xxx as ss)
SQL 注入风险
日期格式化硬编码

适合场景

需要自定义返回字段、报表查询

3.为读xml文件的sql添加ipage页面

Dao 接口

@Mapper
public interface XxDao extends BaseMapper<XxEntity> {
    IPage<Map<String, Object>> relationInfoPage(IPage<?> page, @Param("id") String id);
}

Service

@Override
public IPage<Map<String, Object>> relationInfoPage(Map<String, Object> params) {
    IPage<Map<String, Object>> page = new Query<Map<String, Object>>().getPage(params);
    String id = params.get("xId") == null ? "" : params.get("xId").toString();
    return xxDao.relationInfoPage(page, id);
}

XML(Oracle 驼峰映射)

<resultMap type="com.z.xxEntity" id="xxMap">
    <result property="xId" column="DIX_ID"/>
    <result property="sceneName" column="SCENE_NAME"/>
    <result property="sceneState" column="SCENE_STATE"/>
</resultMap>

<select id="relationInfoPage" resultMap="xxMap">
    select *
    from xxx
    where DIX_ID = #{id}
    order by CREATE_TIME asc
</select>

原代码特点

不使用 QueryWrapper
自己写 XML SQL
给 自定义 XML 方法加分页
用 resultMap 解决 Oracle 大写字段转驼峰

优点

最灵活,复杂 SQL 只能这么写
性能可控(联表、分组、子查询)
resultMap 解决 Oracle 大小写问题 非常正确
分页能正常工作

缺点

代码量多
要写 XML,不够爽
不能用 Lambda,字段硬编码

适合场景

复杂多表查询
统计查询
集团 / 企业规范要求

4. LambdaQueryWrapper 分页 / 列表(最简洁版)

带/不带分页

        LambdaQueryWrapper<ResouseEntity> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(ResouseEntity::getTaskId, taskId);
        IPage<ResouseEntity> iPage = ponCutoverOnuInfoService.page(new Query<ResouseEntity>().getPage(params), lambdaQueryWrapper);
//        List<ResouseEntity> list = ponCutoverOnuInfoService.list(lambdaQueryWrapper);
        log.info("查询业务设计结束:" + JSON.toJSONString(iPage));
        return R.ok().put("data", iPage);

原代码特点

纯 Lambda,不写字段名
简洁、干净
分页 / 列表二选一

优点

最规范、最安全
不易写错字段
代码最简洁
无 SQL 注入
企业最推荐写法

缺点

复杂函数(Oracle 的 to_date)无法直接用,必须搭配 apply

适合场景

90% 的日常单表查询(增删改查)

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐