当前位置: 首页 > wzjs >正文

申请网站建设费东莞市人才服务中心官网

申请网站建设费,东莞市人才服务中心官网,php网站开发实例电子版,短网址在线生成短网址如何在MyBatis-Plus中优雅实现复杂查询:结合JSON_CONTAINS与动态条件构建 在现代企业级开发中,复杂的查询需求是不可避免的。尤其是在涉及多表关联、模糊匹配以及JSON字段查询时,如何高效地实现这些功能并保持代码的可读性和扩展性&#xff…

如何在MyBatis-Plus中优雅实现复杂查询:结合JSON_CONTAINS与动态条件构建

在现代企业级开发中,复杂的查询需求是不可避免的。尤其是在涉及多表关联、模糊匹配以及JSON字段查询时,如何高效地实现这些功能并保持代码的可读性和扩展性,是一个值得深入探讨的话题。本文将通过一个实际案例,展示如何使用 MyBatis-Plus 结合 JSON_CONTAINS 和动态条件构建来实现复杂查询,并提供完整的代码解析和优化建议。


问题背景

假设我们正在开发一个项目管理系统,其中包含以下需求:

  1. 根据项目名称(projectName)进行模糊匹配查询。
  2. 查询结果需要匹配 project_member 字段中的 JSON 数据,判断是否包含特定用户 ID。
  3. 查询逻辑需要支持动态条件拼接,确保查询性能和灵活性。

为了满足这些需求,我们需要结合 MyBatis-Plus 的动态条件构建器(Wrapper)以及 MySQL 的 JSON_CONTAINS 函数,来实现一个高效的解决方案。


代码解析

以下是实现上述需求的核心代码:

if (StringUtils.isNotBlank(bo.getProjectName())) {// 查询用户列表List<SysUser> sysUserList = iSysUserService.selectSimpleLikeNickName(bo.getProjectName());List<String> memberIds = sysUserList.stream().map(SysUser::getUserId).collect(Collectors.toList());// 构建查询条件lqw.and(wrapper -> {// 添加 like 条件wrapper.like(ItProjectManage::getProjectName, bo.getProjectName());// 添加 JSON_CONTAINS 条件if (ObjectUtil.isNotEmpty(memberIds)) {wrapper.or(orWrapper -> {for (String memberId : memberIds) {orWrapper.or(w -> w.apply("JSON_CONTAINS(project_member, CONCAT('\"', {0}, '\"'))", memberId));}});}});
}

这段代码看似简单,但包含了多个关键点,下面我们逐一分析。


1. 用户列表查询
List<SysUser> sysUserList = iSysUserService.selectSimpleLikeNickName(bo.getProjectName());

首先,通过 selectSimpleLikeNickName 方法,根据项目名称模糊匹配查询出相关的用户列表。这一步的目的是获取所有可能与该项目相关的用户 ID 列表。

  • 注意点
    • selectSimpleLikeNickName 是一个自定义方法,通常会在服务层实现。
    • 查询结果会返回一个 SysUser 对象列表,后续通过流式操作提取 userId

2. 动态条件构建
lqw.and(wrapper -> {wrapper.like(ItProjectManage::getProjectName, bo.getProjectName());...
});

在这部分代码中,我们使用了 MyBatis-Plus 的 Wrapper 动态条件构建器,逐步拼接查询条件。

  • like 条件

    wrapper.like(ItProjectManage::getProjectName, bo.getProjectName());
    

    这里实现了对 projectName 字段的模糊匹配查询。

  • or 条件与 JSON_CONTAINS

    wrapper.or(orWrapper -> {for (String memberId : memberIds) {orWrapper.or(w -> w.apply("JSON_CONTAINS(project_member, CONCAT('\"', {0}, '\"'))", memberId));}
    });
    
    • 使用 JSON_CONTAINS 函数判断 project_member 字段是否包含某个用户 ID。
    • apply 方法允许我们直接嵌入原生 SQL 表达式,灵活性非常高。
    • 通过 orWrapper.or 循环拼接多个 JSON_CONTAINS 条件,确保所有匹配的用户 ID 都被包含在查询中。

3. JSON字段的处理

MySQL 提供了强大的 JSON 函数支持,例如 JSON_CONTAINS,可以用来判断 JSON 字段中是否包含特定值。

  • 示例数据
    假设 project_member 字段存储的是一个 JSON 数组:

    ["user1", "user2", "user3"]
    
  • SQL表达式

    JSON_CONTAINS(project_member, CONCAT('\"', 'user1', '\"'))
    

    这条语句会检查 project_member 是否包含 "user1"

通过这种方式,我们可以轻松实现基于 JSON 字段的精确匹配查询。


4. 动态条件的优势

MyBatis-Plus 的 Wrapper 提供了非常灵活的动态条件拼接能力,能够根据业务需求动态生成 SQL 查询语句。相比手动拼接 SQL,这种方式不仅更加安全(防止 SQL 注入),而且代码更具可读性和维护性。


完整代码与优化建议

以下是完整的代码实现:

if (StringUtils.isNotBlank(bo.getProjectName())) {// 查询用户列表List<SysUser> sysUserList = iSysUserService.selectSimpleLikeNickName(bo.getProjectName());List<String> memberIds = sysUserList.stream().map(SysUser::getUserId).collect(Collectors.toList());// 构建查询条件lqw.and(wrapper -> {wrapper.like(ItProjectManage::getProjectName, bo.getProjectName());if (ObjectUtil.isNotEmpty(memberIds)) {wrapper.or(orWrapper -> {for (String memberId : memberIds) {orWrapper.or(w -> w.apply("JSON_CONTAINS(project_member, CONCAT('\"', {0}, '\"'))", memberId));}});}});
}

优化建议

  1. 索引优化:为 project_member 字段创建适当的索引,提升 JSON_CONTAINS 的查询性能。
  2. 批量处理:如果 memberIds 列表较大,可以考虑批量查询或分页处理,避免单次查询过重。
  3. 日志记录:在生产环境中,建议记录生成的 SQL 语句,便于调试和优化。

总结

本文通过一个实际案例,展示了如何利用 MyBatis-Plus 的动态条件构建器和 MySQL 的 JSON_CONTAINS 函数,实现复杂的查询需求。这种方案不仅具有良好的扩展性和灵活性,还能有效提升开发效率。

如果你在项目中遇到类似的复杂查询需求,不妨尝试这种方法!同时也欢迎在评论区分享你的经验和见解。让我们一起探索更高效的开发方式!



文章转载自:

http://ZzR9QK0I.bfycr.cn
http://J1fCnvO1.bfycr.cn
http://BFuznUy7.bfycr.cn
http://mZhEcEzo.bfycr.cn
http://IpCaoFLz.bfycr.cn
http://spKJiqU7.bfycr.cn
http://xwldmmzh.bfycr.cn
http://qPwV2aYb.bfycr.cn
http://kxcO2PZF.bfycr.cn
http://dHhwhltW.bfycr.cn
http://5QT2HXOa.bfycr.cn
http://veEsbAM9.bfycr.cn
http://6p4ZGaiF.bfycr.cn
http://ZPw7M7y5.bfycr.cn
http://C8RzoVxV.bfycr.cn
http://NBT1EpU9.bfycr.cn
http://v8yHMCKD.bfycr.cn
http://bOyfNc3W.bfycr.cn
http://abiFhwXL.bfycr.cn
http://GnTYrCKS.bfycr.cn
http://slwq4xKp.bfycr.cn
http://blkWsTsY.bfycr.cn
http://MB4CUKcT.bfycr.cn
http://s7cc3rpY.bfycr.cn
http://gRuBVqMQ.bfycr.cn
http://9MWUAocf.bfycr.cn
http://QKhGcPcC.bfycr.cn
http://YTpkrCX1.bfycr.cn
http://udxlI3mu.bfycr.cn
http://25hcI6rO.bfycr.cn
http://www.dtcms.com/wzjs/703346.html

相关文章:

  • 5成都网站建设wordpress加标注插件
  • 做网站实训报告总结宝安画册设计公司
  • 网站建设 源码做网站全自动cpa引流
  • 用ps怎么做网站步骤单页面网站开发
  • 专门做网站搜索优化的公司如何做百度免费推广
  • 邯郸企业网站建设价格WordPress建立个人相册
  • 建设网站最重要的是什么前端开发工程师招聘
  • 如何在学校网站上做链接教育app定制开发
  • 纯js做网站网站做伪静态
  • 建设银行网站会员用户名格式鞍山做网站或
  • 如皋网站制作一起做网店17普宁
  • 网站建设wesnowsatwordpress一栏主题
  • 查域名的网站网站建设seo虾哥网络
  • 国外网站开发公司常州企业网站建设公司
  • 淄博好的建网站公司中关村在线对比
  • 网站建设开发设计营销公司厦门深圳宝安网站建设报价
  • 国外psd网页模板网站资阳的网站建设
  • 在那个网站做定制旅游怎么找到仿牌外贸出口公司的网站
  • asp语言的网站建设集团网站建设方案
  • 外汇直播室都是网站做的马云做黄页网站时候
  • 厦门网站建设的公司哪家好网站平台设计费用多少
  • 昆明二级站seo整站优化排名广告设计培训班学费一般多少钱
  • php做网站登陆验证国内做新闻比较好的网站有哪些
  • 佛山网站制作咨询做网站需要一些什么东西
  • 我是这样做网站的米课网络设计培训学校
  • 个人网站asp南京做网站的公司
  • 万脑网站建设软文写手
  • 商城网站建设机构wordpress上传到哪个目录
  • 合肥企业建站系统企业门户网站属于什么层
  • 网站建设公司需要具备猎头