使用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)文章
Java?String類和StringBuffer類的區(qū)別介紹
這篇文章主要介紹了Java?String類和StringBuffer類的區(qū)別,?關(guān)于java的字符串處理我們一般使用String類和StringBuffer類有什么不同呢,下面我們一起來看看詳細(xì)介紹吧2022-03-03淺談Java由于不當(dāng)?shù)膱?zhí)行順序?qū)е碌乃梨i
為了保證線程的安全,我們引入了加鎖機制,但是如果不加限制的使用加鎖,就有可能會導(dǎo)致順序死鎖(Lock-Ordering Deadlock)。本文將會討論一下順序死鎖的問題。2021-06-06springboot使用小工具之Lombok、devtools、Spring Initailizr詳解
這篇文章主要介紹了springboot使用小工具之Lombok、devtools、Spring Initailizr詳解,Lombok可以代替手寫get、set、構(gòu)造方法等,需要idea裝插件lombok,本文通過示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下2022-10-10SpringBoot中集成企業(yè)微信機器人實現(xiàn)運維報警的示例
本文主要介紹了SpringBoot中集成企業(yè)微信機器人實現(xiàn)運維報警,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-05-05關(guān)于?Math.random()生成指定范圍內(nèi)的隨機數(shù)的公式推導(dǎo)問題
在 java 中,用于生成隨機數(shù)的 Math 方法 random()只能生成 0-1 之間的隨機數(shù),而對于生成指定區(qū)間,例如 a-b 之間的隨機數(shù),卻只能用相關(guān)計算公式,今天通過本文給大家介紹Math.random()生成隨機數(shù)的公式推導(dǎo)問題,感興趣的朋友一起看看吧2022-09-09java生成json實現(xiàn)隱藏掉關(guān)鍵屬性
這篇文章主要介紹了java生成json實現(xiàn)隱藏掉關(guān)鍵屬性,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03