mybatis之BaseTypeHandler用法解讀
BaseTypeHandler用法
BaseTypeHandler 是個抽象類,需要子類去實現(xiàn)其定義的 4 個抽象方法,而它本身實現(xiàn)了 typeHandler 接口的 4 個方法。
可以對數(shù)據(jù)保存與查詢時做出相應(yīng)處理,類似操作數(shù)據(jù)庫之間的一個攔截器
舉栗子:把集合類型當(dāng)string存起來,讀取的時候映射為list集合
首先自定義handler 繼承BaseTypeHandler重寫他里邊的四個方法
public abstract void setNonNullParameter(PreparedStatement var1, int var2, T var3, JdbcType var4) throws SQLException; public abstract T getNullableResult(ResultSet var1, String var2) throws SQLException; public abstract T getNullableResult(ResultSet var1, int var2) throws SQLException; public abstract T getNullableResult(CallableStatement var1, int var2) throws SQLException;
代碼如下
public class ListToStringHandler extends BaseTypeHandler<List> { @Override public void setNonNullParameter(PreparedStatement preparedStatement, int i, List list, JdbcType jdbcType) throws SQLException { preparedStatement.setString(i, JSON.toJSONString(list)); } @Override public List getNullableResult(ResultSet resultSet, String s) throws SQLException { return JSONArray.parseArray(resultSet.getString(s)); } @Override public List getNullableResult(ResultSet resultSet, int i) throws SQLException { return JSONArray.parseArray(resultSet.getString(i)); } @Override public List getNullableResult(CallableStatement callableStatement, int i) throws SQLException { return JSONArray.parseArray(callableStatement.getString(i)); } }
映射操作
mybaits-plus 方式
bean上添加注解
@TableName(autoResultMap = true)
映射字段上添加如下注解,指定自定義的handler
@TableField(jdbcType = JdbcType.VARCHAR, typeHandler = ListToStringHandler.class)
mybaits的方式
<resultMap> 標(biāo)簽內(nèi) 映射字段的handler 指定自定義的handler即可,保存的時候也要指定。
測試
這只是其一種簡單的用法,其他的比如加密解密也適用。
通過BaseTypeHandler從mysql數(shù)據(jù)庫存取json字符串
在mysql的使用過程中,我們經(jīng)常會將一些json串存入mysql當(dāng)中,如下json串
{ ? ? "params":[ ? ? ? ? { ? ? ? ? ? ? "name":"zl", ? ? ? ? ? ? "age":18, ? ? ? ? ? ? "createTime":"2020-06-19 09:28:38", ? ? ? ? ? ? "modifyTime":"2020-06-19 09:29:07" ? ? ? ? } ? ? ], ? ? "paramsTypes":[ ? ? ? ? "com.zl.platform.student" ? ? ] }
對于這種數(shù)據(jù)在mybatis的存取過程需要一些特殊的處理,我們可以通過繼承mybatis的org.apache.ibatis.type.BaseTypeHandler來實現(xiàn)。
首先我們需要完成一個工具類
import com.alibaba.fastjson.JSON; import org.apache.ibatis.type.BaseTypeHandler; import org.apache.ibatis.type.JdbcType; import java.sql.CallableStatement; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; /** ?* @Author: zl ?*/ public class JsonTypeHandler<T> extends BaseTypeHandler<T> { ? ? private Class<T> type; ? ? public JsonTypeHandler(Class<T> type) { ? ? ? ? if (type == null) { ? ? ? ? ? ? throw new IllegalArgumentException("Type argument cannot be null"); ? ? ? ? } ? ? ? ? this.type = type; ? ? } ? ? @Override ? ? public void setNonNullParameter(PreparedStatement ps, int i, Object parameter, ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? JdbcType jdbcType) throws SQLException { ? ? ? ? ps.setString(i, JSON.toJSONString(parameter)); ? ? } ? ? @Override ? ? public T getNullableResult(ResultSet rs, String columnName) ? ? ? ? ? ? throws SQLException { ? ? ? ? return JSON.parseObject(rs.getString(columnName), type); ? ? } ? ? @Override ? ? public T getNullableResult(ResultSet rs, int columnIndex) throws SQLException { ? ? ? ? return JSON.parseObject(rs.getString(columnIndex), type); ? ? } ? ? @Override ? ? public T getNullableResult(CallableStatement cs, int columnIndex) ? ? ? ? ? ? throws SQLException { ? ? ? ? return JSON.parseObject(cs.getString(columnIndex), type); ? ? } }
然后在mybatis中對需要使用json格式的字段引用這個方法
? ? <resultMap id="BaseResultMap" type="com.zl.platform.entity.demo.DubboControllerInfo"> ? ? ? ? <id column="id" property="id" /> ? ? ? ? <result column="department" property="department" /> ? ? ? ? <result column="case_name" property="caseName"/> ? ? ? ? <result column="author" property="author" /> ? ? ? ? <result column="service_name" property="serviceName" /> ? ? ? ? <result column="method_name" property="methodName" /> ? ? ? ? <result column="dubbo_params" property="dubboParams" typeHandler="com.zl.platform.utils.JsonTypeHandler"/> ? ? ? ? <result column="create_time" property="createTime" /> ? ? ? ? <result column="update_time" property="updateTime" /> ? ? </resultMap> ? ?? ? ? <insert id="insertDubboInfo" ?parameterType="com.zl.platform.entity.demo.DubboControllerInfo"> ? ? ? insert into dubbo_controller_info (department, author, service_name, ? ? ? method_name, dubbo_params,create_time, update_time) ? ? ? VALUES (#{department},#{author},#{serviceName},#{methodName},#{dubboParams,typeHandler=com.zl.platform.utils.JsonTypeHandler}, ? ? ? ?#{createTime},#{updateTime}) ? ? </insert> ? ? <select id="selectAll" resultMap="BaseResultMap"> ? ? ? ? select * from dubbo_controller_info ? ? </select>
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
- mybatis-plus之自動映射字段(typeHandler)的注意點及說明
- MyBatisPlus?TypeHandler自定義字段類型轉(zhuǎn)換Handler
- mybatis TypeHandler注入spring的依賴方式
- MybatisPlus如何自定義TypeHandler映射JSON類型為List
- Mybatis自定義TypeHandler解決特殊類型轉(zhuǎn)換問題詳解
- MyBatis自定義typeHandler的完整實例
- Mybatis實現(xiàn)自定義類型轉(zhuǎn)換器TypeHandler的方法
- Mybatis實現(xiàn)自定義的typehandler三步曲
- 微服務(wù)mybatis typehandler使用詳解(就這一篇夠了)
相關(guān)文章
IDEA下使用Spring Boot熱加載的實現(xiàn)
本文主要介紹了IDEA下使用Spring Boot熱加載的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06SpringBoot 接口開發(fā)教程(httpclient客戶端)
這篇文章主要介紹了SpringBoot 接口開發(fā)教程(httpclient客戶端),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-03-03SpringBoot集成logback打印彩色日志的代碼實現(xiàn)
Logback是由log4j創(chuàng)始人設(shè)計的另一個開源日志組件,默認(rèn)情況下,Spring?Boot會用Logback來記錄日志,并用INFO級別輸出到控制臺,本文給大家介紹了SpringBoot集成logback打印彩色日志,需要的朋友可以參考下2024-03-03