使用mybatisplus接收mysql字段為json類型的數(shù)據(jù)方式
一.數(shù)據(jù)庫設(shè)計
CREATE TABLE `inv_learning_examination_questions` ( `id` bigint(20) NOT NULL, `title` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '題目', `options` json NULL COMMENT '選項', `standard_answer` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '標(biāo)準(zhǔn)答案', `answer_analysis` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '答案解析', `open_range` tinyint(4) NULL DEFAULT NULL COMMENT '開放范圍', `business_area` tinyint(4) NULL DEFAULT NULL COMMENT '業(yè)務(wù)領(lǐng)域', `difficulty_level` tinyint(4) NULL DEFAULT NULL COMMENT '難度等級', `topic_type` tinyint(4) NULL DEFAULT NULL COMMENT '選題類型', `views` int(11) NULL DEFAULT NULL COMMENT '瀏覽量', `collect` int(11) NULL DEFAULT NULL COMMENT '收藏量', `status` tinyint(4) NULL DEFAULT NULL COMMENT '發(fā)布狀態(tài)', `release_time` datetime(0) NULL DEFAULT NULL COMMENT '發(fā)布時間' PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = Dynamic;
二.實體類
(切記實體類@TableName一定要加上autoResultMap = true屬性,否則查不出來該屬性的值)
package com.innovation.desk.domain;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.FastjsonTypeHandler;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.innovation.common.base.BaseLLEntity;
import com.innovation.common.utils.DateUtil;
import com.innovation.desk.handler.OptionHandler;
import lombok.Data;
import lombok.EqualsAndHashCode;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
import java.util.List;
/**
* LearningExaminationQuestions實體類
*
* @author admin
* @since 2023/03/03
*/
@Data
@TableName(value = "inv_learning_examination_questions",autoResultMap = true)
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "LearningExaminationQuestions對象", description = "LearningExaminationQuestions對象")
public class LearningExaminationQuestions extends BaseLLEntity {
private static final long serialVersionUID = 1L;
@ApiModelProperty(value = "題目")
private String title;
@TableField(typeHandler = OptionHandler.class)
@ApiModelProperty(value = "選項")
private List<Option> options;
@TableField(typeHandler = FastjsonTypeHandler.class)
@ApiModelProperty(value = "標(biāo)準(zhǔn)答案")
private List<String> standardAnswer;
@ApiModelProperty(value = "答案解析")
private String answerAnalysis;
@ApiModelProperty(value = "開放范圍")
private Integer openRange;
@ApiModelProperty(value = "業(yè)務(wù)領(lǐng)域")
private Integer businessArea;
@ApiModelProperty(value = "難度等級")
private Integer difficultyLevel;
@ApiModelProperty(value = "選題類型")
private Integer topicType;
@ApiModelProperty(value = "瀏覽量")
private Integer views;
@ApiModelProperty(value = "收藏量")
private Integer collect;
@ApiModelProperty(value = "發(fā)布狀態(tài) 0.待發(fā)布 1.已發(fā)布")
private Integer status;
@ApiModelProperty(value = "發(fā)布狀態(tài) 0.待發(fā)布 1.已發(fā)布")
@DateTimeFormat(pattern = DateUtil.PATTERN_DATETIME)
@JsonFormat(pattern = DateUtil.PATTERN_DATETIME, timezone = "GMT+8")
private Date releaseTime;
}1.如果接收參數(shù)是實體類或List<String>
可以直接使用mybatisplus自帶的解析處理器即可
例如在屬性上添加
@TableField(typeHandler = FastjsonTypeHandler.class)
此處FastjsonTypeHandler有多個類型可供選擇:
比如AbstractJsonTypeHandler,AbstractSqlParserHandler,FastjsonTypeHandler,GsonTypeHandler,JacksonTypeHandler,MybatisEnumTypeHandler
2.如果接收參數(shù)是個List<實體類>
這里需要注意:
以上提供的解析器不能提供完全解析
這里你需要自定義解析器做定制化解析
以下是解析器的源碼

原因:
type屬性被注入進(jìn)來的只是List的字節(jié)碼文件,通過parse方法只能將json轉(zhuǎn)化為List<JsonObject>對象,而JsonObject不能強轉(zhuǎn)為相應(yīng)的實體類,所以在獲取到解析后的對象遍歷的時候會報類型轉(zhuǎn)換錯誤異常,這時可以重寫此handler的parse方法來實現(xiàn)自己的目的,以下是將json轉(zhuǎn)化為List<Option>的處理器
/**
* 自定義CardContent轉(zhuǎn)換處理類
* @author Administrator
*/
public class OptionHandler extends FastjsonTypeHandler {
public OptionHandler(Class<?> type) {
super(type);
}
@Override
protected Object parse(String json) {
return JSON.parseArray(json, Option.class);
}
@Override
protected String toJson(Object obj) {
return super.toJson(obj);
}
}添加完成后只需在實體類的對應(yīng)屬性上添加注解
@TableField(typeHandler = OptionHandler.class)即可實現(xiàn)解析
如果使用了xml文件可參考以下方式
<result column="options" property="options" jdbcType="VARCHAR"
typeHandler="com.innovation.desk.handler.OptionHandler"/>總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
jmeter添加自定義擴(kuò)展函數(shù)之圖片base64編碼示例詳解
這篇文章主要介紹了jmeter添加自定義擴(kuò)展函數(shù)之圖片base64編碼,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-01-01
spring定時器@Scheduled異步調(diào)用方式
在Spring Boot中,@Schedule默認(rèn)使用單線程執(zhí)行定時任務(wù),多個定時器會按順序執(zhí)行,為實現(xiàn)異步執(zhí)行,可以通過自定義線程池或?qū)崿F(xiàn)SchedulingConfigurer接口,使用自定義線程池可以保證多個定時器并發(fā)執(zhí)行2024-11-11
Java concurrency之LockSupport_動力節(jié)點Java學(xué)院整理
這篇文章主要為大家詳細(xì)介紹了Java concurrency之LockSupport的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-06-06
IDEA mybatis-generator逆向工程生成代碼
這篇文章主要介紹了IDEA mybatis-generator逆向工程生成代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-06-06

