mybatis-plus之自動(dòng)映射字段(typeHandler)的注意點(diǎn)及說(shuō)明
有時(shí)間數(shù)據(jù)庫(kù)存的字段是是一個(gè)文檔型數(shù)據(jù)(例如: 直接在某個(gè)字段存了個(gè)json數(shù)據(jù), 或者存了個(gè)list的數(shù)據(jù)), 存取的時(shí)候手動(dòng)做一次轉(zhuǎn)型太麻煩了, 而且手動(dòng)轉(zhuǎn)型后數(shù)據(jù)庫(kù)存儲(chǔ)的內(nèi)容會(huì)經(jīng)過(guò)轉(zhuǎn)義
所以為了更加優(yōu)雅的和數(shù)據(jù)庫(kù)交互, 我們可以使用mybatis-plus 的 typeHandler 進(jìn)行自動(dòng)的類型映射
使用方式
實(shí)體類注解
在實(shí)體類的字段上加上注解 @TableField
@TableField(value = "數(shù)據(jù)庫(kù)字段名", typeHandler = ListToStringHandler.class)
注意:如果想要查詢的時(shí)候自動(dòng)將數(shù)據(jù)庫(kù)字段映射成java對(duì)象需要在實(shí)體類上加上注解
@TableName(autoResultMap = true)
xml配置
<result column="數(shù)據(jù)庫(kù)字段名" property="java實(shí)體字段名"/>
typeHandler="com.xxx.common.type.handler.base.ListToStringHandler 這里填寫自己typehandler的實(shí)現(xiàn)類"/>
此時(shí)數(shù)據(jù)庫(kù)的增刪改操作應(yīng)該都可以正確的將數(shù)據(jù)轉(zhuǎn)型存儲(chǔ)了
但是查詢可能會(huì)出問(wèn)題, 現(xiàn)象就是查詢的時(shí)候這個(gè)字段一直是空的(把字段改成String并且typeHandler去掉卻可以拿到數(shù)據(jù))
解決typeHandler查詢無(wú)數(shù)據(jù)顯示問(wèn)題
檢查下項(xiàng)目配置application.properties是否包含自己定義的轉(zhuǎn)換器路徑
mybatis-plus.type-handlers-package=自己的包路徑
如下:
mybatis-plus.type-handlers-package=com.xxx.type.handler
提供2個(gè)基類的轉(zhuǎn)換器
這兩個(gè)是抽象類, 需要哪種類型直接繼承并且注冊(cè)一下數(shù)據(jù)類型即可
List 抽象類
public abstract class BaseMybatisList2JsonHandler<T> extends BaseTypeHandler<List<T>> {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, List<T> parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, JSON.toJSONString(parameter));
}
@Override
public List<T> getNullableResult(ResultSet rs, String columnName)
throws SQLException {
String data = rs.getString(columnName);
return StringUtils.isBlank(data) ? null : JSON.parseArray(data, (Class<T>) getRawType());
}
@Override
public List<T> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String data = rs.getString(columnIndex);
return StringUtils.isBlank(data) ? null : JSON.parseArray(data, (Class<T>) getRawType());
}
@Override
public List<T> getNullableResult(CallableStatement cs, int columnIndex)
throws SQLException {
String data = cs.getString(columnIndex);
return StringUtils.isBlank(data) ? null : JSON.parseArray(data, (Class<T>) getRawType());
}
@Override
public List<T> getResult(ResultSet rs, String columnName) throws SQLException {
return super.getResult(rs, columnName);
}
@Override
public List<T> getResult(ResultSet rs, int columnIndex) throws SQLException {
return super.getResult(rs, columnIndex);
}
@Override
public List<T> getResult(CallableStatement cs, int columnIndex) throws SQLException {
return super.getResult(cs, columnIndex);
}
}
map 抽象類
public abstract class BaseMybatisMap2JsonHandler<T> extends BaseTypeHandler<HashMap<String, T>> {
protected abstract TypeReference getType();
// typeReference = new InstructionBoHashMap();
@Override
public void setNonNullParameter(PreparedStatement ps, int i, HashMap<String, T> parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i, JSON.toJSONString(parameter));
}
@Override
public HashMap<String, T> getNullableResult(ResultSet rs, String columnName)
throws SQLException {
String data = rs.getString(columnName);
return StringUtils.isBlank(data) ? null : (HashMap<String, T>)JSON.parseObject(data, getType());
}
@Override
public HashMap<String, T> getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
String data = rs.getString(columnIndex);
return StringUtils.isBlank(data) ? null : (HashMap<String, T>)JSON.parseObject(data, getType());
}
@Override
public HashMap<String, T> getNullableResult(CallableStatement cs, int columnIndex)
throws SQLException {
String data = cs.getString(columnIndex);
return StringUtils.isBlank(data) ? null : (HashMap<String, T>)JSON.parseObject(data, getType());
}
@Override
public HashMap<String, T> getResult(ResultSet rs, String columnName) throws SQLException {
return super.getResult(rs, columnName);
}
@Override
public HashMap<String, T> getResult(ResultSet rs, int columnIndex) throws SQLException {
return super.getResult(rs, columnIndex);
}
@Override
public HashMap<String, T> getResult(CallableStatement cs, int columnIndex) throws SQLException {
return super.getResult(cs, columnIndex);
}
}
使用方式
我這里用List<ClockingBo>舉例
ClockingBo: 是我自己業(yè)務(wù)數(shù)據(jù)的格式(就正常的實(shí)體就好了)
@Slf4j
@MappedTypes({List.class})
@MappedJdbcTypes(JdbcType.VARCHAR)
public class ClockingBoJsonHandler extends BaseMybatisList2JsonHandler<ClockingBo> {
}
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot創(chuàng)建自定義starter詳解
這篇文章主要介紹了SpringBoot創(chuàng)建自定義starter詳解,Starter是Spring Boot中的一個(gè)非常重要的概念,Starter相當(dāng)于模塊,它能將模塊所需的依賴整合起來(lái)并對(duì)模塊內(nèi)的Bean根據(jù)環(huán)境(條件)進(jìn)行自動(dòng)配置,需要的朋友可以參考下2024-01-01
實(shí)例解析Java設(shè)計(jì)模式編程中的適配器模式使用
適配器模式的主要作用是在新接口和老接口之間進(jìn)行適配,通過(guò)將一個(gè)類的接口轉(zhuǎn)換成客戶期望的另一個(gè)接口,讓原本不兼容的接口可以合作無(wú)間,本文以實(shí)例解析Java設(shè)計(jì)模式編程中的適配器模式使用,需要的朋友可以參考下2016-05-05
spring中前端明明傳了值后端卻接收不到問(wèn)題解決辦法
在學(xué)習(xí)Spring的時(shí)候遇到了一個(gè)問(wèn)題,后臺(tái)一直接收不到前臺(tái)傳遞過(guò)來(lái)的參數(shù),耽誤了好長(zhǎng)時(shí)間終于找到了原因,這篇文章主要給大家介紹了關(guān)于spring中前端明明傳了值后端卻接收不到問(wèn)題的解決辦法,需要的朋友可以參考下2024-05-05
Swagger異常定位紀(jì)實(shí)Swagger設(shè)計(jì)問(wèn)題分析
這篇文章主要為大家介紹了Swagger異常定位紀(jì)實(shí)Swagger設(shè)計(jì)的問(wèn)題分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-02-02
Spring?Data?JPA框架的核心概念與Repository接口詳解
Spring?Data?JPA是Spring基于JPA規(guī)范的基礎(chǔ)上封裝的?套?JPA?應(yīng)?框架,可使開發(fā)者?極簡(jiǎn)的代碼即可實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的訪問(wèn)和操作,本篇我們來(lái)了解Spring?Data?JPA框架的核心概念與Repository接口2022-04-04
SpringBoot多controller添加URL前綴的實(shí)現(xiàn)方法
這篇文章主要介紹了SpringBoot多controller添加URL前綴的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-02-02
Java中使用Jedis操作Redis的實(shí)現(xiàn)代碼
本篇文章主要介紹了Java中使用Jedis操作Redis的實(shí)現(xiàn)代碼。詳細(xì)的介紹了Redis的安裝和在java中的操作,具有一定的參考價(jià)值,有興趣的可以了解一下2017-05-05
解決IDEA 2020.1版本 maven Test命令出現(xiàn)導(dǎo)包錯(cuò)誤的問(wèn)題
這篇文章主要介紹了IDEA 2020.1版本 maven Test命令出現(xiàn)導(dǎo)包錯(cuò)誤的問(wèn)題及解決方法,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-08
Java中ArrayList和LinkedList有什么區(qū)別舉例詳解
這篇文章主要介紹了Java中ArrayList和LinkedList區(qū)別的相關(guān)資料,包括數(shù)據(jù)結(jié)構(gòu)特性、核心操作性能、內(nèi)存與GC影響、擴(kuò)容機(jī)制、線程安全與并發(fā)方案,以及工程實(shí)踐場(chǎng)景,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-02-02

