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

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

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

通過注解使用TypeHandler

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

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

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

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

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

官方示例

類型處理器,用于 JavaType 與 JdbcType 之間的轉換,用于 PreparedStatement 設置參數(shù)值和從 ResultSet 或 CallableStatement 中取出一個值,本文講解 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)
? ? ?*
? ? ?* 以下兩種類型處理器,二選一 也可以同時存在
? ? ?*
? ? ?* 注意??!選擇對應的 JSON 處理器也必須存在對應 JSON 解析依賴包
? ? ?*/
? ? @TableField(typeHandler = JacksonTypeHandler.class)
? ? // @TableField(typeHandler = FastjsonTypeHandler.class)
? ? private OtherInfo otherInfo;
}

該注解對應了 XML 中寫法為

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

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

Kotlin案例

首先是kotlin實體類:

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

然后是對應TypeHandler的實現(xiàn),主要就是json序列化規(guī)則,因為我們再數(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中的使用:

<!-- 通用查詢映射結果 -->
? ? <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實現(xiàn)某個屬性在插入數(shù)據(jù)庫以及查詢時的自動轉換,本例中是要將Map類型的屬性轉化成CLOB,然后存入數(shù)據(jù)庫。由于是復雜的Map,mp自帶的json轉換器會丟失部分信息。

類型轉換器還可以通過注解配置 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;
? ? /**
? ? ?*指標描述
? ? ?*/
? ? @TableField("description")
? ? private String description;
? ? /**
? ? ?* 指標名
? ? ?*/
? ? @TableField("name")
? ? private String name;
? ? /**
? ? ?* 對應屬性名
? ? ?*/
? ? @TableField("property_name")
? ? private String propertyName;
? ? /**
? ? ?* 起始點類型
? ? ?*/
? ? @TableField("source_type")
? ? private String sourceType;
? ? /**
? ? ?* 屬性對應權值列表
? ? ?* key 屬性名 value指定條件下的權值
? ? ?*/
? ? @TableField(value = "weight_list",typeHandler = WeightListTypeHandler.class,jdbcType = JdbcType.CLOB)
? ? private Map<String, List<WeightItem>> weightList;
? ? /**
? ? ?* 運行狀態(tài)
? ? ?* 0 新建未運行
? ? ?* 1 運行中
? ? ?* 2 已運行 成功
? ? ?* 3 已運行 失敗
? ? ?*/
? ? @TableField("status")
? ? private Integer status;
? ? /**
? ? ?* 是否可用
? ? ?* 1 true
? ? ?* 0 false
? ? ?*/
? ? @TableField("enable")
? ? private Integer enable;
? ? @TableField("create_time")
? ? private LocalDateTime createTime;
}

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

相關文章

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

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

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

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

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

    淺談Java三目運算

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

    java實現(xiàn)捕魚達人游戲

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

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

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

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

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

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

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

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

    在剛開始學習Java的時候,就了解了Java基礎中的變量,雖然知道這個以后會經(jīng)常用到,但沒想到了基本語法這里,竟然又冒出來了成員變量和局部變量。變來變?nèi)ヌ菀鬃屓烁銜灹耍裉煳覀兙吞魭鰜硎崂硪幌拢?/div> 2016-07-07
  • SpringBoot使用@Value實現(xiàn)給靜態(tài)變量注入值

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

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

    maven 指定version不生效的問題

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

最新評論