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 這里填寫(xiě)自己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)文章
淺談Java實(shí)現(xiàn)面向?qū)ο缶幊蘪ava oop
這篇文章主要介紹了淺談Java實(shí)現(xiàn)面向?qū)ο缶幊蘪ava oop,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-07-07java中@EnableAutoConfiguration注解使用
在Spring Boot框架中,@EnableAutoConfiguration是一種非常重要的注解,本文就來(lái)介紹一下java中@EnableAutoConfiguration注解使用,感興趣的可以了解一下2023-11-11利用MultipartFile實(shí)現(xiàn)文件上傳功能
這篇文章主要為大家詳細(xì)介紹了利用MultipartFile實(shí)現(xiàn)文件上傳功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11Spring?Framework六種常見(jiàn)設(shè)計(jì)模式
設(shè)計(jì)模式是軟件開(kāi)發(fā)的重要組成部分,本文借助spring來(lái)講解這個(gè)框架的設(shè)計(jì)模式,通過(guò)本文我們探討了spring如何利用這些模式來(lái)提供這些豐富的功能,對(duì)本文感興趣的朋友跟隨小編一起看看吧2023-06-06Java創(chuàng)建數(shù)組、賦值的四種方式詳解(聲明+創(chuàng)建+初始化?)
數(shù)組是一種數(shù)據(jù)結(jié)構(gòu),用來(lái)存儲(chǔ)同一類型值的集合一旦創(chuàng)建了數(shù)組,就不能再改變它的長(zhǎng)度,下面這篇文章主要給大家介紹了關(guān)于Java創(chuàng)建數(shù)組、賦值的四種方式(聲明+創(chuàng)建+初始化?)的相關(guān)資料,需要的朋友可以參考下2024-04-04