前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >利用Spring Boot实现MySQL 8.0和MyBatis-Plus的JSON查询

利用Spring Boot实现MySQL 8.0和MyBatis-Plus的JSON查询

作者头像
关忆北.
发布2024-03-08 09:27:13
3930
发布2024-03-08 09:27:13
举报
文章被收录于专栏:关忆北.关忆北.

介绍

在现代的Web开发中,处理JSON数据已经变得无处不在,而在关系型数据库中高效地查询JSON结构变得愈发重要。MySQL 8.0结合MyBatis-Plus和Spring Boot,为管理和查询JSON数据提供了强大的工具。在本文中,我们将探讨两种使用MySQL 8.0和MyBatis-Plus在Spring Boot应用中查询JSON数据的方法。

方案一、使用LIKE操作符进行JSON搜索

MySQL中的LIKE操作符允许进行模式匹配,可以利用它在JSON结构中进行搜索。在与MyBatis-Plus结合使用时,您可以构建动态SQL查询,根据特定条件搜索JSON字段。

在现代Web应用程序中,处理和查询JSON数据变得愈发常见。MySQL 8.0提供了一系列功能强大的JSON函数,结合MyBatis-Plus和Spring Boot,我们可以轻松地实现对JSON数据的查询和操作。

一种常见的需求是根据JSON字段的内容进行搜索。在MySQL 8.0中,我们可以使用LIKE操作符实现模糊匹配,从而搜索JSON结构中的数据。例如,假设我们有一个包含用户信息的JSON字段,我们可以使用以下SQL语句查询具有特定用户名的记录:

建表语句:

代码语言:javascript
复制
CREATE TABLE users (
  id INT AUTO_INCREMENT PRIMARY KEY,
  user_info JSON comment '用户信息'
);

SELECT * FROM users WHERE user_info LIKE '%' 'John' '%';

在这个表中,我们有一个名为users的表,包含了以下列:

  • id:用户ID,自增主键。
  • user_info:存储用户信息的JSON字段。示例数据可能包括用户的姓名、年龄、地址等。

查询SQL:

代码语言:javascript
复制
SELECT * FROM users WHERE user_info LIKE '%' 'John' '%';

在MyBatis-Plus中,我们可以使用动态SQL构建类似的查询。首先,我们需要创建一个Mapper接口,并定义相应的方法:

代码语言:javascript
复制
public interface UserMapper extends BaseMapper<User> {
    List<User> findByUsername(@Param("username") String username);
}

接下来,在对应的XML文件中,我们可以编写动态SQL语句:

代码语言:javascript
复制
<select id="findByUsername" resultType="User">
  SELECT * FROM users
  WHERE user_info LIKE CONCAT('%', #{username}, '%')
</select>

通过这种方式,我们可以根据用户提供的用户名动态构建SQL查询,实现对JSON数据的搜索功能。

方案二、使用JSON_CONTAINS和JSON_EXTRACT进行查询

除了使用LIKE操作符外,MySQL 8.0还提供了JSON_CONTAINSJSON_EXTRACT等函数,用于更灵活地查询JSON数据。通过这些函数,我们可以检查JSON数组是否包含特定元素,或者提取JSON对象中的特定字段。

例如,假设我们有一个包含订单信息的JSON字段,其中包含了订单的状态信息。我们可以使用JSON_CONTAINSJSON_EXTRACT函数来查询具有特定状态的订单记录:

建表语句:

代码语言:javascript
复制
CREATE TABLE orders (
    id INT AUTO_INCREMENT PRIMARY KEY,
    order_info JSON
);
INSERT INTO `orders` VALUES (1,'{"price": 20.00, "status": "shipped"}');

在这个表中,我们有一个名为orders的表,包含了以下列:

  • id:订单ID,自增主键。
  • order_info:存储订单信息的JSON字段。示例数据可能包括订单号、商品信息、订单状态等。
代码语言:javascript
复制
select * from orders where JSON_CONTAINS(JSON_EXTRACT(order_info, '$[*].status'), CAST('"shipped"' AS JSON), '$')

在这个查询中,我们首先使用JSON_EXTRACT函数从order_info字段中提取所有订单的状态信息,然后使用JSON_CONTAINS函数检查是否存在状态为"shipped"的订单。

image.png
image.png

在MySQL中,使用CAST函数将字符串转换为JSON时,需要确保传递的字符串是合法的JSON格式。在这种情况下,'shipped’并不是一个有效的JSON值。

要修复这个问题,你可以将要转换的字符串包装在合法的JSON格式中。在这个例子中,您可以将’shipped’转换为JSON对象,例如:

代码语言:javascript
复制
select * from orders where JSON_CONTAINS(JSON_EXTRACT(order_info, '$[*].price'), CAST('20.0' AS JSON), '$');
image.png
image.png

通过将’20.0’包装在双引号中,使其成为一个有效的JSON字符串,您可以解决这个问题。

在MyBatis-Plus中,我们可以编写类似的查询方法,并利用注解将参数传递给SQL语句:

代码语言:javascript
复制
public interface OrderMapper extends BaseMapper<Order> {
    List<Order> findByStatus(@Param("status") String status);
}

然后,我们可以编写对应的XML文件,执行类似的动态SQL查询。

代码语言:javascript
复制
SELECT * FROM
JSON_CONTAINS(JSON_EXTRACT(order_info, '$[*].status'), CAST(#{param.status} AS JSON), '$')

结论: 通过结合MySQL 8.0的JSON功能和MyBatis-Plus的灵活性,我们可以在Spring Boot应用中轻松地实现对JSON数据的查询和操作。无论是使用LIKE操作符进行模糊搜索,还是利用JSON_CONTAINSJSON_EXTRACT函数进行更复杂的查询,都可以满足不同场景下的需求。

改进

根据MySQL的三大设计原则,每个字段应该是最小的单位。 在本文的两个案例中,字段中均包含了多个字段,因此可以将JSON字段拆分成独立的字段,使得数据库的设计符合设计范式,同样也减小开发成本。如一个JSON字段中包含了一个数组的值,则可以考虑将JSON中的数据拆分成一张表,使用主表id进行关联即可。

代码语言:javascript
复制
create table teacher
(
  id           INT AUTO_INCREMENT PRIMARY KEY,
  name varchar(20)
);

create table class_info(
  id INT AUTO_INCREMENT PRIMARY KEY,
  teacher_id int(10),
  class_name varchar(20)
)

后续内容文章持续更新中…

近期发布。

关于我

👋🏻你好,我是Debug.c。微信公众号:种棵代码技术树 的维护者,一个跨专业自学Java,对技术保持热爱的bug猿,同样也是在某二线城市打拼四年余的Java Coder。

🏆在掘金、CSDN、公众号我将分享我最近学习的内容、踩过的坑以及自己对技术的理解。

📞如果您对我感兴趣,请联系我。

若有收获,就点个赞吧,喜欢原图请私信我。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-03-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 介绍
    • 方案一、使用LIKE操作符进行JSON搜索
      • 方案二、使用JSON_CONTAINS和JSON_EXTRACT进行查询
      • 改进
      • 后续内容文章持续更新中…
      相关产品与服务
      云数据库 MySQL
      腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档