mybatis-plus之自動映射字段(typeHandler)的注意點及說明
有時間數(shù)據(jù)庫存的字段是是一個文檔型數(shù)據(jù)(例如: 直接在某個字段存了個json
數(shù)據(jù), 或者存了個list
的數(shù)據(jù)), 存取的時候手動做一次轉(zhuǎn)型太麻煩了, 而且手動轉(zhuǎn)型后數(shù)據(jù)庫存儲的內(nèi)容會經(jīng)過轉(zhuǎn)義
所以為了更加優(yōu)雅的和數(shù)據(jù)庫交互, 我們可以使用mybatis-plus
的 typeHandler
進行自動的類型映射
使用方式
實體類注解
在實體類的字段上加上注解 @TableField
@TableField(value = "數(shù)據(jù)庫字段名", typeHandler = ListToStringHandler.class)
注意:如果想要查詢的時候自動將數(shù)據(jù)庫字段映射成java對象需要在實體類上加上注解
@TableName(autoResultMap = true)
xml配置
<result column="數(shù)據(jù)庫字段名" property="java實體字段名"/> typeHandler="com.xxx.common.type.handler.base.ListToStringHandler 這里填寫自己typehandler的實現(xiàn)類"/>
此時數(shù)據(jù)庫的增刪改操作應該都可以正確的將數(shù)據(jù)轉(zhuǎn)型存儲了
但是查詢可能會出問題, 現(xiàn)象就是查詢的時候這個字段一直是空的(把字段改成String
并且typeHandler
去掉卻可以拿到數(shù)據(jù))
解決typeHandler查詢無數(shù)據(jù)顯示問題
檢查下項目配置application.properties
是否包含自己定義的轉(zhuǎn)換器路徑
mybatis-plus.type-handlers-package=自己的包路徑
如下:
mybatis-plus.type-handlers-package=com.xxx.type.handler
提供2個基類的轉(zhuǎn)換器
這兩個是抽象類, 需要哪種類型直接繼承并且注冊一下數(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è)務數(shù)據(jù)的格式(就正常的實體就好了)
@Slf4j @MappedTypes({List.class}) @MappedJdbcTypes(JdbcType.VARCHAR) public class ClockingBoJsonHandler extends BaseMybatisList2JsonHandler<ClockingBo> { }
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
淺談Java實現(xiàn)面向?qū)ο缶幊蘪ava oop
這篇文章主要介紹了淺談Java實現(xiàn)面向?qū)ο缶幊蘪ava oop,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-07-07java中@EnableAutoConfiguration注解使用
在Spring Boot框架中,@EnableAutoConfiguration是一種非常重要的注解,本文就來介紹一下java中@EnableAutoConfiguration注解使用,感興趣的可以了解一下2023-11-11Java創(chuàng)建數(shù)組、賦值的四種方式詳解(聲明+創(chuàng)建+初始化?)
數(shù)組是一種數(shù)據(jù)結(jié)構,用來存儲同一類型值的集合一旦創(chuàng)建了數(shù)組,就不能再改變它的長度,下面這篇文章主要給大家介紹了關于Java創(chuàng)建數(shù)組、賦值的四種方式(聲明+創(chuàng)建+初始化?)的相關資料,需要的朋友可以參考下2024-04-04