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

JAVA后端开发——MyBatis 结合 MySQL JSON 类型查询详解

1、代码示例

xml <if test="compatibleDevice != null and compatibleDevice != ''"> AND JSON_CONTAINS(compatible_devices, CAST(CONCAT('"', #{compatibleDevice}, '"') AS JSON)) </if>

该代码片段的功能是:当传入一个有效的设备型号(compatibleDevice)时,动态地生成一条 SQL 查询语句,用于在数据库的 JSON 数组字段中查找是否存在该设备型号。

<if> 标签:

  • 作用: 这是 MyBatis 中最常用的条件判断标签。它会对其 test 属性中的表达式进行求值,如果表达式结果为 true,则将其包裹的 SQL 片段拼接到最终的 SQL 语句中。

  • 在本例中: test="compatibleDevice != null and compatibleDevice != ''" 这句表达式确保了只有当调用者传入的 compatibleDevice 参数既不是 null 也不是空字符串时,才会执行后续的 JSON 查询逻辑。这可以防止无效参数导致 SQL 语法错误,并提高查询效率。

#{compatibleDevice}:

  • 作用: 这是 MyBatis 的参数占位符。MyBatis 在执行 SQL 时,会使用 PreparedStatement(预编译语句),并将 #{...} 替换为 ? 占位符,然后安全地将参数值设置进去。

  • 优点: 这种方式可以有效防止 SQL 注入攻击,是 MyBatis 推荐的标准用法。

2、核心知识点分解

从 MySQL 5.7 版本开始,原生支持 JSON 数据类型,并提供了一系列函数来高效地操作 JSON 数据。

  • JSON 数据类型:

    • 背景: 在某些业务场景下,一个字段可能需要存储一组不固定数量或结构的数据,例如一篇文章的多个标签、一个商品的多种规格、或本例中一个驱动支持的多种设备。将这些数据存储为 JSON 数组或对象可以提供极大的灵活性,避免了创建额外的关联表。

    • compatible_devices 字段: 从代码中可以推断,数据库中的 compatible_devices 字段很可能是一个 JSON 数组,用于存储所有兼容的设备型号,例如:["iPhone 15", "Galaxy S24", "Pixel 8"]。

  • JSON_CONTAINS(target, candidate[, path]) 函数:

    • 作用: 这是用于查询 JSON 文档的核心函数。它判断 target (目标 JSON 文档) 中是否包含 candidate (候选值)。

    • 参数:

      • target: 被查询的 JSON 字段名,即 compatible_devices。

      • candidate: 要查找的值。关键点在于,这个值本身也必须是一个合法的 JSON 文档。

    • 在本例中: 它的作用是在 compatible_devices 数组中查找是否存在我们传入的设备型号。

  • CONCAT(string1, string2, ...) 函数:

    • 作用: 一个标准的字符串拼接函数。

    • 在本例中: CONCAT('"', #{compatibleDevice}, '"') 的目的是为传入的参数字符串两边加上双引号

      • 为什么必须加双引号? 因为 JSON_CONTAINS 在数组中查找的是值(Value)。在一个 JSON 数组中,字符串类型的值必须被双引号包裹。如果 compatibleDevice 的值是 iPhone 15,直接查询是找不到的。我们必须查询 "iPhone 15" 这个 JSON 字符串。CONCAT 正是完成了从 iPhone 15 到 "iPhone 15" 的转换。

  • CAST(... AS JSON) 函数:

    • 作用: 一个类型转换函数,用于将一个值显式地转换为指定的类型。

    • 在本例中: CAST(... AS JSON) 的作用是告诉 MySQL:“请将由 CONCAT 函数拼接成的字符串 "iPhone 15" 作为 JOSN 来解析”。

      • 为什么需要 CAST? JSON_CONTAINS 的第二个参数(candidate)必须是一个有效的 JSON 文档。单独的字符串 "iPhone 15" 对 MySQL 来说只是一个普通字符串。通过 CAST(... AS JSON),我们将其“提升”为一个合法的 JSON (一个 JSON String),这样 JSON_CONTAINS 才能正确地进行匹配。

3、总结

  • 优势: 该方案充分利用了数据库的原生能力,使得在半结构化数据中进行查询变得简洁高效,避免了在应用层进行 LIKE '%...%' 模糊查询的低效和不精确。

  • 适用场景: 适用于“一对多”关系中,“多”的一方数据结构简单、数量可控且主要用于查询和展示的场景,可以简化数据库设计。

  • 性能考量: 在大数据量的情况下,对 JSON 字段的查询可能比传统索引查询要慢。MySQL 8.0+ 支持对 JSON 数组创建多值索引(Multi-Valued Index),可以极大地提升 JSON_CONTAINS 等函数的查询性能,是生产环境中推荐的优化方案。

http://www.xdnf.cn/news/1425061.html

相关文章:

  • 【STM32】贪吃蛇 [阶段 3] 增强模块结构(架构优化)
  • curl 介绍及使用教程
  • python爬虫之selenium库进阶(小白五分钟从入门到精通)
  • 基本渗透概念
  • Raft 协议在 Nacos 中的实现
  • 从零开始实现Shell | Linux进程调度实战
  • Product Hunt 每日热榜 | 2025-09-01
  • 基于YOLOv11的脑卒中目标检测及其完整数据集——推动智能医疗发展的新机遇!
  • 齿轮里的 “双胞胎”:分度圆与节圆
  • [React]监听Form中某个字段的变化
  • 微算法科技(NASDAQ:MLGO)张量网络与机器学习融合,MPS分类器助力顶夸克信号识别
  • deepseek doubao chatgpt 优缺点分析
  • 并发--并发中的线程状态及不同状态下线程所在队列
  • React学习教程,从入门到精通, React 入门指南:创建 React 应用程序的语法知识点(7)
  • OpenCV-CUDA 图像处理
  • 数据库常见故障类型
  • 知识产品和标准化
  • 在 Qt 中加载 .qm 翻译文件
  • 跳跃游戏(二):DFS 求解最少跳跃次数与最优路径
  • 专项智能练习(Word)
  • JavaSE:抽象类和接口
  • 计算机视觉(五):blur
  • 原子操作(Atomic Operation) 是指不可被中断的操作——要么完整执行,要么完全不执行
  • 贵州在假期及夏天结束后保持旅游活力的策略分析
  • AI如何重塑电力工程设计?揭秘良策金宝AI的六大“超能力”
  • SQLSERVER关键字:N
  • VBA数据库解决方案第二十二讲:根据工作表数据生成数据库中数据表
  • 算法练习——189.轮转数组
  • 【逆序对 博弈】P10737 [SEERC 2020] Reverse Game|普及+
  • 【开题答辩全过程】以 基于JSP的养生网站设计与实现为例,包含答辩的问题和答案