QueryWrapper常用案例
记录于 2023.09.18 个人博客,现转录CSDNQueryWrapper = MyBatis-Plus 提供的「SQL 条件自动拼接工具」不用手写 SQL 语句,用 Java 链式代码,自动帮你拼出 where、order by、like、in、between 等查询条件。
记录于 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% 的日常单表查询(增删改查)
更多推荐
所有评论(0)