QueryWrapper常用案例
记录于 2023.09.18 个人博客现转录CSDNQueryWrapper 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 ServiceImplXxDao, IndexEntity implements XxService { Override public ListIndexEntity getList(MapString, Object params) { LambdaQueryWrapperIndexEntity 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(MapString, Object params) { LambdaQueryWrapperCUserEntity 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); // 分页 IPageCUserEntity page this.page(new QueryCUserEntity().getPage(params), qw); return new PageUtils(page); }原代码特点使用 .select() 自定义查询字段含别名、日期格式化用 apply 拼接日期范围分页查询优点只查需要字段性能好分页正常工作缺点手写字段字符串容易写错别名混乱id as 、xxx as ssSQL 注入风险日期格式化硬编码适合场景需要自定义返回字段、报表查询3.为读xml文件的sql添加ipage页面Dao 接口Mapper public interface XxDao extends BaseMapperXxEntity { IPageMapString, Object relationInfoPage(IPage? page, Param(id) String id); }ServiceOverride public IPageMapString, Object relationInfoPage(MapString, Object params) { IPageMapString, Object page new QueryMapString, Object().getPage(params); String id params.get(xId) null ? : params.get(xId).toString(); return xxDao.relationInfoPage(page, id); }XMLOracle 驼峰映射resultMap typecom.z.xxEntity idxxMap result propertyxId columnDIX_ID/ result propertysceneName columnSCENE_NAME/ result propertysceneState columnSCENE_STATE/ /resultMap select idrelationInfoPage resultMapxxMap 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 分页 / 列表最简洁版带/不带分页LambdaQueryWrapperResouseEntity lambdaQueryWrapper new LambdaQueryWrapper(); lambdaQueryWrapper.eq(ResouseEntity::getTaskId, taskId); IPageResouseEntity iPage ponCutoverOnuInfoService.page(new QueryResouseEntity().getPage(params), lambdaQueryWrapper); // ListResouseEntity list ponCutoverOnuInfoService.list(lambdaQueryWrapper); log.info(查询业务设计结束 JSON.toJSONString(iPage)); return R.ok().put(data, iPage);原代码特点纯 Lambda不写字段名简洁、干净分页 / 列表二选一优点最规范、最安全不易写错字段代码最简洁无 SQL 注入企业最推荐写法缺点复杂函数Oracle 的 to_date无法直接用必须搭配 apply适合场景90% 的日常单表查询增删改查
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2493176.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!