MyBatis中TypeHandler的使用教程詳解
一.TypeHandler作用及其使用場景
在我們平常開發(fā)操作數(shù)據(jù)庫時,查詢、插入數(shù)據(jù)等操作行為,有時會報數(shù)據(jù)類型不匹配異常,就可以得知數(shù)據(jù)的類型是不唯一的必然是多種不同的數(shù)據(jù)類型。并且我們必須要明確的一點(diǎn)就是java作為一門編程語言有自己的數(shù)據(jù)類型,數(shù)據(jù)庫也是有自己的數(shù)據(jù)類型的。
jdbc數(shù)據(jù)類型:org.apache.ibatis.type.JdbcType 此枚舉就是所有的數(shù)據(jù)庫支持類型
java數(shù)據(jù)類型:int、long、string、…
一定要分清,例如java重的date數(shù)據(jù)插入到數(shù)據(jù)庫中,應(yīng)該是已經(jīng)轉(zhuǎn)換成了數(shù)據(jù)庫的某種類型,必然跟java已經(jīng)沒有關(guān)系了。中間有一些我們看不見的操作做了數(shù)據(jù)處理。
假設(shè)此時的java類型與數(shù)據(jù)庫數(shù)據(jù)類型是一樣的,哪么其他語言中的日期數(shù)據(jù)插入數(shù)據(jù)庫時又該怎么解釋,例如C#操作數(shù)據(jù)庫存入時間類型,C#與java肯定沒有關(guān)系吧。所以每種語言與數(shù)據(jù)庫之間有種數(shù)據(jù)類型關(guān)系對應(yīng)。
思考:
因?yàn)閖ava與數(shù)據(jù)庫各自有數(shù)據(jù)類型,所以在將java數(shù)據(jù)存入數(shù)據(jù)庫前中間是否有其他操作,是我們看不見的,不然java數(shù)據(jù)怎么知道自己與哪個jdbc數(shù)據(jù)類型匹配?
答:mybatis框架為每種數(shù)據(jù)類型做了默認(rèn)的關(guān)系對應(yīng),BaseTypeHandler的所有實(shí)現(xiàn)類,就是來做這些處理的。
例如:java中的date插入數(shù)據(jù)庫時是jdbc哪種類型,怎么就是這種類型? 中間具體有什么操作?
答:DateTypeHandler就是來解決date數(shù)據(jù)類型的處理。
二.TypeHandler使用
我們想要自定義去處理Java和JDBC的數(shù)據(jù)類型轉(zhuǎn)換時,需要實(shí)現(xiàn)TypeHandler接口,該接口源碼如下:
//此接口作用是用于指定jdbc與java的數(shù)據(jù)類型間對應(yīng)關(guān)系處理。 public interface TypeHandler<T> { // 保存操作,數(shù)據(jù)入庫之前時數(shù)據(jù)處理 void setParameter(PreparedStatement ps, int i, T parameter, JdbcType jdbcType) throws SQLException; //下面三個則是,從數(shù)據(jù)庫加載數(shù)據(jù)后,vo對象封裝前的數(shù)據(jù)處理 T getResult(ResultSet rs, String columnName) throws SQLException; T getResult(ResultSet rs, int columnIndex) throws SQLException; T getResult(CallableStatement cs, int columnIndex) throws SQLException; }
JsonIntegerTypeHandler 實(shí)現(xiàn)Integer和字符串互轉(zhuǎn)
public class JsonIntegerTypeHandler extends BaseTypeHandler<Integer> { private static final ObjectMapper mapper = new ObjectMapper(); @Override public void setNonNullParameter(PreparedStatement ps, int i, Integer parameter, JdbcType jdbcType) throws SQLException { ps.setString(i, toJson(parameter)); } @Override public Integer getNullableResult(ResultSet rs, String columnName) throws SQLException { return this.toObject(rs.getString(columnName)); } @Override public Integer getNullableResult(ResultSet rs, int columnIndex) throws SQLException { return this.toObject(rs.getString(columnIndex)); } @Override public Integer getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { return this.toObject(cs.getString(columnIndex)); } private String toJson(Integer params) { try { String copyObject = IotDbUtils.copyObject(params); return copyObject; } catch (Exception e) { e.printStackTrace(); } return ""; } private Integer toObject(String content) { if (content != null && !content.isEmpty()) { try { System.out.println("1111111111111"+content); return (Integer) mapper.readValue(content, Integer.class); } catch (Exception e) { throw new RuntimeException(e); } } else { return null; } } }
Mapper.xml
查詢
查詢的時候 你轉(zhuǎn)的那個字段就配置哪個字段
<resultMap id="DmpDeviceReportResult" type="com.chinaunicom.iotdb.domain.DmpDeviceReportInformation" > <result column="Time" property="timestamp" /> <result column="type" jdbcType="INTEGER" property="type" typeHandler="com.chinaunicom.iotdb.handler.JsonIntegerTypeHandler"/> </resultMap> <select id="listDeviceReportInformation" resultMap="DmpDeviceReportResult"> select trace_id, imei, topic, information, interaction_time,type from dmp_device_report_information where imei = #{serialNumber} <if test="beginTime != null and endTime != null"> and interaction_time between #{beginTime} and #{endTime} </if> <if test="traceId != null and traceId != ''"> and trace_id = #{traceId} </if> limit #{pageSize} offset #{pageNum} </select>
新增
<insert id="add" parameterType="com.chinaunicom.iotdb.domain.DmpDeviceReportInformation"> INSERT INTO root.device.dmp_device_report_information <trim prefix="(" suffix=")" suffixOverrides=","> <if test="null != type "> type, </if> <if test="null != traceId and '' != traceId"> trace_id, </if> <if test="null != imei and '' != imei"> imei, </if> <if test="null != topic and '' != topic"> topic, </if> <if test="null != information and '' != information"> information, </if> <if test="null != interactionTime and '' != interactionTime "> interaction_time, </if> <if test="null != organizationId "> organization_id </if> </trim> <trim prefix="values (" suffix=")" suffixOverrides=","> <if test="null != type "> #{type,typeHandler=com.chinaunicom.iotdb.handler.JsonIntegerTypeHandler }, </if> <if test="null != traceId and '' != traceId"> #{traceId,typeHandler=com.chinaunicom.iotdb.handler.JsonIntegerTypeHandler }, </if> <if test="null != imei and '' != imei"> #{imei,typeHandler=com.chinaunicom.iotdb.handler.JsonIntegerTypeHandler }, </if> <if test="null != topic and '' != topic"> #{topic,typeHandler=com.chinaunicom.iotdb.handler.JsonIntegerTypeHandler }, </if> <if test="null != information and '' != information"> #{information,typeHandler=com.chinaunicom.iotdb.handler.JsonIntegerTypeHandler }, </if> <if test="null != interactionTime and '' != interactionTime "> #{interactionTime,typeHandler=com.chinaunicom.iotdb.handler.JsonIntegerTypeHandler }, </if> <if test="null != organizationId "> #{organizationId,typeHandler=com.chinaunicom.iotdb.handler.JsonIntegerTypeHandler }, </if> </trim> </insert>
mybatisPlus中使用
類注解 @TableName(autoResultMap = true)
參數(shù)注解 @TableField(typeHandler = JsonIntegerTypeHandler.class)
@Data @TableName(autoResultMap = true) public class DmpDeviceReportInformation implements Serializable { private static final long serialVersionUID = 1L; private Long id; /** * 消息類型1:消息上報 2:消息下發(fā) */ @TableField(typeHandler = JsonIntegerTypeHandler.class) private Integer type; }
注意: 如果使用自己的mapper查詢 要選擇mybaits的形式
要想全局生效的話
mybatis-plus: type-handlers-package: com.chinaunicom.iotdb.handler
到此這篇關(guān)于MyBatis中TypeHandler的使用教程詳解的文章就介紹到這了,更多相關(guān)MyBatis TypeHandler使用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- MyBatis?typeHandler接口的定義和使用
- MyBatis中的自定義TypeHandler詳解
- Mybatis中自定義TypeHandler處理枚舉的示例代碼
- Mybatis的TypeHandler實(shí)現(xiàn)數(shù)據(jù)加解密詳解
- Mybatis中TypeHandler使用小結(jié)
- SpringBoot中MyBatis使用自定義TypeHandler的實(shí)現(xiàn)
- Mybatis使用typeHandler加密的實(shí)現(xiàn)
- MyBatis-Plus?中?typeHandler?的使用實(shí)例詳解
- MyBatis類型處理器TypeHandler的作用及說明
- MyBatis自定義TypeHandler實(shí)現(xiàn)字段加密解密
相關(guān)文章
Spring?Boot?整合?Fisco?Bcos的案例分析(區(qū)塊鏈)
本篇文章介紹的?Spring?Boot?整合?Fisco?Bcos的案例,是在阿里云服務(wù)器上部署驗(yàn)證的。大家可根據(jù)自己的電腦環(huán)境,對比該案例進(jìn)行開發(fā)即可,具體案例代碼跟隨小編一起看看吧2022-01-01java應(yīng)用開發(fā)之Mybatis通過Mapper代理自定義接口的實(shí)現(xiàn)
這篇文章主要介紹了java應(yīng)用開發(fā)之Mybatis通過Mapper代理自定義接口的實(shí)現(xiàn)方式,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-09-09Java中Controller引起的Ambiguous?mapping問題及解決
這篇文章主要介紹了Java中Controller引起的Ambiguous?mapping問題及解決,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-10-10基于servlet的執(zhí)行原理與生命周期(全面解析)
下面小編就為大家分享一篇servlet的執(zhí)行原理與生命周期全面解析,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2017-12-12SpringSession 請求與響應(yīng)重寫的實(shí)現(xiàn)
這篇文章主要介紹了SpringSession 請求與響應(yīng)重寫的實(shí)現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2018-11-11java用arraycopy實(shí)現(xiàn)多擊事件
這篇文章主要介紹了java用arraycopy實(shí)現(xiàn)多擊事件的多種方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-11-11SpringSecurity頁面授權(quán)與登錄驗(yàn)證實(shí)現(xiàn)(內(nèi)存取值與數(shù)據(jù)庫取值)
Spring Security是一個能夠?yàn)榛赟pring的企業(yè)應(yīng)用系統(tǒng)提供聲明式的安全訪問控制解決方案的安全框架,本文主要介紹了SpringSecurity頁面授權(quán)與登錄驗(yàn)證實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-06-06