当前位置:   article > 正文

使用mybatisplus接收mysql字段为json类型的数据_mybatisplus查询json字段用对象接收

mybatisplus查询json字段用对象接收

一.数据库设计

  1. CREATE TABLE `inv_learning_examination_questions` (
  2. `id` bigint(20) NOT NULL,
  3. `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '题目',
  4. `options` json NULL COMMENT '选项',
  5. `standard_answer` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '标准答案',
  6. `answer_analysis` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '答案解析',
  7. `open_range` tinyint(4) NULL DEFAULT NULL COMMENT '开放范围',
  8. `business_area` tinyint(4) NULL DEFAULT NULL COMMENT '业务领域',
  9. `difficulty_level` tinyint(4) NULL DEFAULT NULL COMMENT '难度等级',
  10. `topic_type` tinyint(4) NULL DEFAULT NULL COMMENT '选题类型',
  11. `views` int(11) NULL DEFAULT NULL COMMENT '浏览量',
  12. `collect` int(11) NULL DEFAULT NULL COMMENT '收藏量',
  13. `status` tinyint(4) NULL DEFAULT NULL COMMENT '发布状态',
  14. `release_time` datetime(0) NULL DEFAULT NULL COMMENT '发布时间'
  15. PRIMARY KEY (`id`) USING BTREE
  16. ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;

二.实体类(切记实体类@TableName一定要加上autoResultMap = true属性,否则查不出来该属性的值)

  1. package com.innovation.desk.domain;
  2. import com.baomidou.mybatisplus.annotation.TableField;
  3. import com.baomidou.mybatisplus.annotation.TableName;
  4. import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
  5. import com.fasterxml.jackson.annotation.JsonFormat;
  6. import com.innovation.common.base.BaseLLEntity;
  7. import com.innovation.common.utils.DateUtil;
  8. import com.innovation.desk.handler.OptionHandler;
  9. import lombok.Data;
  10. import lombok.EqualsAndHashCode;
  11. import io.swagger.annotations.ApiModel;
  12. import io.swagger.annotations.ApiModelProperty;
  13. import org.springframework.format.annotation.DateTimeFormat;
  14. import java.util.Date;
  15. import java.util.List;
  16. /**
  17. * LearningExaminationQuestions实体类
  18. *
  19. * @author admin
  20. * @since 2023/03/03
  21. */
  22. @Data
  23. @TableName(value = "inv_learning_examination_questions",autoResultMap = true)
  24. @EqualsAndHashCode(callSuper = true)
  25. @ApiModel(value = "LearningExaminationQuestions对象", description = "LearningExaminationQuestions对象")
  26. public class LearningExaminationQuestions extends BaseLLEntity {
  27. private static final long serialVersionUID = 1L;
  28. @ApiModelProperty(value = "题目")
  29. private String title;
  30. @TableField(typeHandler = OptionHandler.class)
  31. @ApiModelProperty(value = "选项")
  32. private List<Option> options;
  33. @TableField(typeHandler = FastjsonTypeHandler.class)
  34. @ApiModelProperty(value = "标准答案")
  35. private List<String> standardAnswer;
  36. @ApiModelProperty(value = "答案解析")
  37. private String answerAnalysis;
  38. @ApiModelProperty(value = "开放范围")
  39. private Integer openRange;
  40. @ApiModelProperty(value = "业务领域")
  41. private Integer businessArea;
  42. @ApiModelProperty(value = "难度等级")
  43. private Integer difficultyLevel;
  44. @ApiModelProperty(value = "选题类型")
  45. private Integer topicType;
  46. @ApiModelProperty(value = "浏览量")
  47. private Integer views;
  48. @ApiModelProperty(value = "收藏量")
  49. private Integer collect;
  50. @ApiModelProperty(value = "发布状态 0.待发布 1.已发布")
  51. private Integer status;
  52. @ApiModelProperty(value = "发布状态 0.待发布 1.已发布")
  53. @DateTimeFormat(pattern = DateUtil.PATTERN_DATETIME)
  54. @JsonFormat(pattern = DateUtil.PATTERN_DATETIME, timezone = "GMT+8")
  55. private Date releaseTime;
  56. }

1.如果接收参数是实体类或List<String>,可以直接使用mybatisplus自带的解析处理器即可,例如在属性上添加

@TableField(typeHandler = FastjsonTypeHandler.class)

此处FastjsonTypeHandler有多个类型可供选择:比如AbstractJsonTypeHandler,AbstractSqlParserHandler,FastjsonTypeHandler,GsonTypeHandler,JacksonTypeHandler,MybatisEnumTypeHandler

2.如果接收参数是个List<实体类>,这里需要注意:以上提供的解析器不能提供完全解析,这里你需要自定义解析器做定制化解析,以下是解析器的源码

原因:type属性被注入进来的只是List的字节码文件,通过parse方法只能将json转化为List<JsonObject>对象,而JsonObject不能强转为相应的实体类,所以在获取到解析后的对象遍历的时候会报类型转换错误异常,这时可以重写此handler的parse方法来实现自己的目的,以下是将json转化为List<Option>的处理器

  1. /**
  2. * 自定义CardContent转换处理类
  3. * @author Administrator
  4. */
  5. public class OptionHandler extends FastjsonTypeHandler {
  6. public OptionHandler(Class<?> type) {
  7. super(type);
  8. }
  9. @Override
  10. protected Object parse(String json) {
  11. return JSON.parseArray(json, Option.class);
  12. }
  13. @Override
  14. protected String toJson(Object obj) {
  15. return super.toJson(obj);
  16. }
  17. }

 添加完成后只需在实体类的对应属性上添加注解

@TableField(typeHandler = OptionHandler.class)即可实现解析

如果使用了xml文件可参考以下方式

  1. <result column="options" property="options" jdbcType="VARCHAR"
  2. typeHandler="com.innovation.desk.handler.OptionHandler"/>

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/393783
推荐阅读
相关标签
  

闽ICP备14008679号