欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MyBatis-Plus如何通過注解使用TypeHandler

 更新時(shí)間:2022年01月13日 14:21:13   作者:幻想千秋  
這篇文章主要介紹了MyBatis-Plus如何通過注解使用TypeHandler,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

通過注解使用TypeHandler

在使用MyBatis時(shí),我們與數(shù)據(jù)表中字段映射的java中的bean的屬性字段,往往包含了自定義復(fù)雜類型,比如一個(gè)varchar保存的json字符串映射到的java字段是Person類型的時(shí)候,就需要用到 “字段類型處理器了”,也就是TypeHandler.

使用MyBatis的TypeHandler的時(shí)候,自定義實(shí)現(xiàn)起來還是比較麻煩,需要統(tǒng)一配置,自動識別java字段類型,然后匹配了才處理。

這樣在開發(fā)的時(shí)候并不好控制,而且不是很直觀。

在新版本的MyBatis-Plus中提供了一種新的配置 “字段處理器” 的方法,通過在javaBean中加入對應(yīng)的注解即可實(shí)現(xiàn)。

下面我們先看一下MyBatis-Plus官方文檔中的使用說明:

官方示例

類型處理器,用于 JavaType 與 JdbcType 之間的轉(zhuǎn)換,用于 PreparedStatement 設(shè)置參數(shù)值和從 ResultSet 或 CallableStatement 中取出一個(gè)值,本文講解 mybaits-plus 內(nèi)置常用類型處理器如何通過TableField注解快速注入到 mybatis 容器中。

示例工程:

?? mybatis-plus-sample-typehandlerJSON 字段類型 

@Data
@Accessors(chain = true)
@TableName(autoResultMap = true)
public class User {
? ? private Long id;
? ? ...
? ? /**
? ? ?* 注意??! 必須開啟映射注解
? ? ?*
? ? ?* @TableName(autoResultMap = true)
? ? ?*
? ? ?* 以下兩種類型處理器,二選一 也可以同時(shí)存在
? ? ?*
? ? ?* 注意??!選擇對應(yīng)的 JSON 處理器也必須存在對應(yīng) JSON 解析依賴包
? ? ?*/
? ? @TableField(typeHandler = JacksonTypeHandler.class)
? ? // @TableField(typeHandler = FastjsonTypeHandler.class)
? ? private OtherInfo otherInfo;
}

該注解對應(yīng)了 XML 中寫法為

<result column="other_info" jdbcType="VARCHAR" property="otherInfo" typeHandler="com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler" />

下面我們參照官方給出的案例,用kotlin實(shí)現(xiàn)一個(gè)具體的:

Kotlin案例

首先是kotlin實(shí)體類:

@TableName(autoResultMap = true)
data class Policy ?(
? ? ...
? ? /**
? ? ?* 策略內(nèi)容,json格式,規(guī)則參考文檔
? ? ?*/
? ? @TableField(typeHandler = PolicyBodyTypeHandler::class)
? ? var content: PolicyBody? = null,
? ? ...
)

然后是對應(yīng)TypeHandler的實(shí)現(xiàn),主要就是json序列化規(guī)則,因?yàn)槲覀冊贁?shù)據(jù)庫存的就是json字符串。

class PolicyBodyTypeHandler : BaseTypeHandler<PolicyBody>() {
? ? override fun getNullableResult(p0: ResultSet?, p1: String?): PolicyBody? {
? ? ? ? val result = p0?.getString(p1) ?: return null
? ? ? ? return JSON.parseObject(result, PolicyBody::class.java)
? ? }
? ? override fun getNullableResult(p0: ResultSet?, p1: Int): PolicyBody? {
? ? ? ? val result = p0?.getString(p1) ?: return null
? ? ? ? return JSON.parseObject(result, PolicyBody::class.java)
? ? }
? ? override fun getNullableResult(p0: CallableStatement?, p1: Int): PolicyBody? {
? ? ? ? val result = p0?.getString(p1) ?: return null
? ? ? ? return JSON.parseObject(result, PolicyBody::class.java)
? ? }
? ? override fun setNonNullParameter(statement: PreparedStatement?, index: Int, javaObj: PolicyBody?, jdbcType: JdbcType?) {
? ? ? ? statement?.setString(index, JSON.toJSONString(javaObj))
? ? }
}

下面是xml中的使用:

<!-- 通用查詢映射結(jié)果 -->
? ? <resultMap id="BaseResultMap" type="com.inooy.write.ucenter.entity.Policy">
? ? ? ? <id column="id" property="id" />
? ? ? ? <result column="code" property="code" />
? ? ? ? <result column="name" property="name" />
? ? ? ? <result column="description" property="description" />
? ? ? ? <result column="content" property="content" typeHandler="com.inooy.write.ucenter.policy.PolicyBodyTypeHandler"/>
? ? ? ? <result column="deleted" property="deleted" />
? ? ? ? <result column="createTime" property="createTime" />
? ? ? ? <result column="updateTime" property="updateTime" />
? ? ? ? <result column="version" property="version" />
? ? </resultMap>

自定義TypeHandler使用

可通過自定義的TypeHandler實(shí)現(xiàn)某個(gè)屬性在插入數(shù)據(jù)庫以及查詢時(shí)的自動轉(zhuǎn)換,本例中是要將Map類型的屬性轉(zhuǎn)化成CLOB,然后存入數(shù)據(jù)庫。由于是復(fù)雜的Map,mp自帶的json轉(zhuǎn)換器會丟失部分信息。

類型轉(zhuǎn)換器還可以通過注解配置 java 類型和 jdbc 類型:

  • @MappedTypes:注解配置 java 類型
  • @MappedJdbcTypes:注解配置 jdbc 類型

定義:

@Slf4j
@MappedTypes({Object.class})
@MappedJdbcTypes(JdbcType.VARCHAR)
public class WeightListTypeHandler ?extends AbstractJsonTypeHandler<Object> {
? ? private static Gson gson = new Gson();
? ? private final Class<?> type;
? ? public WeightListTypeHandler(Class<?> type) {
? ? ? ? if (log.isTraceEnabled()) {
? ? ? ? ? ? log.trace("WeightListTypeHandler(" + type + ")");
? ? ? ? }
? ? ? ? Assert.notNull(type, "Type argument cannot be null");
? ? ? ? this.type = type;
? ? }
? ? @Override
? ? protected Object parse(String json) {
? ? ? ? Type type1 = new TypeToken<Map<String, List<WeightItem>>>(){}.getType();
? ? ? ? return gson.fromJson(json, type1);
? ? }
? ? @Override
? ? protected String toJson(Object obj) {
? ? ? ? return gson.toJson(obj);
? ? }
? ? public static void setGson(Gson gson) {
? ? ? ? Assert.notNull(gson, "Gson should not be null");
? ? ? ? WeightListTypeHandler.gson = gson;
? ? }
}

使用:

注意@TableName 注解 autoResultMap 屬性

@Data
@NoArgsConstructor
@TableName(value = "mix_target",autoResultMap = true)
public class MixTarget extends Model<MixTarget> {
? ? @TableId(value = "id", type = IdType.AUTO)
? ? private Long id;
? ? /**
? ? ?*指標(biāo)描述
? ? ?*/
? ? @TableField("description")
? ? private String description;
? ? /**
? ? ?* 指標(biāo)名
? ? ?*/
? ? @TableField("name")
? ? private String name;
? ? /**
? ? ?* 對應(yīng)屬性名
? ? ?*/
? ? @TableField("property_name")
? ? private String propertyName;
? ? /**
? ? ?* 起始點(diǎn)類型
? ? ?*/
? ? @TableField("source_type")
? ? private String sourceType;
? ? /**
? ? ?* 屬性對應(yīng)權(quán)值列表
? ? ?* key 屬性名 value指定條件下的權(quán)值
? ? ?*/
? ? @TableField(value = "weight_list",typeHandler = WeightListTypeHandler.class,jdbcType = JdbcType.CLOB)
? ? private Map<String, List<WeightItem>> weightList;
? ? /**
? ? ?* 運(yùn)行狀態(tài)
? ? ?* 0 新建未運(yùn)行
? ? ?* 1 運(yùn)行中
? ? ?* 2 已運(yùn)行 成功
? ? ?* 3 已運(yùn)行 失敗
? ? ?*/
? ? @TableField("status")
? ? private Integer status;
? ? /**
? ? ?* 是否可用
? ? ?* 1 true
? ? ?* 0 false
? ? ?*/
? ? @TableField("enable")
? ? private Integer enable;
? ? @TableField("create_time")
? ? private LocalDateTime createTime;
}

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java多線程入門知識及示例程序

    java多線程入門知識及示例程序

    java多線程入門知識及示例程序,大家參考使用吧
    2013-12-12
  • 使用java代碼實(shí)現(xiàn)一個(gè)月內(nèi)不再提醒,通用到期的問題

    使用java代碼實(shí)現(xiàn)一個(gè)月內(nèi)不再提醒,通用到期的問題

    這篇文章主要介紹了使用java代碼實(shí)現(xiàn)一個(gè)月內(nèi)不再提醒,通用到期的問題,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-01-01
  • 淺談Java三目運(yùn)算

    淺談Java三目運(yùn)算

    本文給大家主要介紹的是java中三目運(yùn)算的詳細(xì)介紹,并附上2個(gè)示例,希望對大家理解三目運(yùn)算能夠有所幫助。
    2015-03-03
  • java實(shí)現(xiàn)捕魚達(dá)人游戲

    java實(shí)現(xiàn)捕魚達(dá)人游戲

    這篇文章主要介紹了java實(shí)現(xiàn)捕魚達(dá)人游戲,大部分功能都已實(shí)現(xiàn),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • Java集合之Set接口及其實(shí)現(xiàn)類精解

    Java集合之Set接口及其實(shí)現(xiàn)類精解

    set接口是繼承自Collection的子接口,特點(diǎn)是元素不重復(fù),存儲無序。在set接口的實(shí)現(xiàn)類中添加重復(fù)元素是不會成功的,判斷兩個(gè)元素是否重復(fù)根據(jù)元素類重寫的
    2021-09-09
  • Java開發(fā)環(huán)境配置教程(win7 64bit)

    Java開發(fā)環(huán)境配置教程(win7 64bit)

    這篇文章主要為大家詳細(xì)介紹了win7 64bit下Java開發(fā)環(huán)境的配置教程,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • spring+html5實(shí)現(xiàn)安全傳輸隨機(jī)數(shù)字密碼鍵盤

    spring+html5實(shí)現(xiàn)安全傳輸隨機(jī)數(shù)字密碼鍵盤

    這篇文章主要為大家詳細(xì)介紹了spring html5實(shí)現(xiàn)安全傳輸隨機(jī)數(shù)字密碼鍵盤,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • 淺析Java中局部變量與成員變量同名解決技巧

    淺析Java中局部變量與成員變量同名解決技巧

    在剛開始學(xué)習(xí)Java的時(shí)候,就了解了Java基礎(chǔ)中的變量,雖然知道這個(gè)以后會經(jīng)常用到,但沒想到了基本語法這里,竟然又冒出來了成員變量和局部變量。變來變?nèi)ヌ菀鬃屓烁銜灹?,今天我們就挑揀出來梳理一下?/div> 2016-07-07
  • SpringBoot使用@Value實(shí)現(xiàn)給靜態(tài)變量注入值

    SpringBoot使用@Value實(shí)現(xiàn)給靜態(tài)變量注入值

    這篇文章主要介紹了SpringBoot使用@Value實(shí)現(xiàn)給靜態(tài)變量注入值的方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • maven 指定version不生效的問題

    maven 指定version不生效的問題

    這篇文章主要介紹了maven 指定version不生效的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-01-01

最新評論