MyBatis中TypeHandler的使用教程詳解
一.TypeHandler作用及其使用場景
在我們平常開發(fā)操作數(shù)據(jù)庫時,查詢、插入數(shù)據(jù)等操作行為,有時會報數(shù)據(jù)類型不匹配異常,就可以得知數(shù)據(jù)的類型是不唯一的必然是多種不同的數(shù)據(jù)類型。并且我們必須要明確的一點就是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ù)庫中,應該是已經(jīng)轉換成了數(shù)據(jù)庫的某種類型,必然跟java已經(jīng)沒有關系了。中間有一些我們看不見的操作做了數(shù)據(jù)處理。
假設此時的java類型與數(shù)據(jù)庫數(shù)據(jù)類型是一樣的,哪么其他語言中的日期數(shù)據(jù)插入數(shù)據(jù)庫時又該怎么解釋,例如C#操作數(shù)據(jù)庫存入時間類型,C#與java肯定沒有關系吧。所以每種語言與數(shù)據(jù)庫之間有種數(shù)據(jù)類型關系對應。
思考:
因為java與數(shù)據(jù)庫各自有數(shù)據(jù)類型,所以在將java數(shù)據(jù)存入數(shù)據(jù)庫前中間是否有其他操作,是我們看不見的,不然java數(shù)據(jù)怎么知道自己與哪個jdbc數(shù)據(jù)類型匹配?
答:mybatis框架為每種數(shù)據(jù)類型做了默認的關系對應,BaseTypeHandler的所有實現(xiàn)類,就是來做這些處理的。
例如:java中的date插入數(shù)據(jù)庫時是jdbc哪種類型,怎么就是這種類型? 中間具體有什么操作?
答:DateTypeHandler就是來解決date數(shù)據(jù)類型的處理。
二.TypeHandler使用
我們想要自定義去處理Java和JDBC的數(shù)據(jù)類型轉換時,需要實現(xiàn)TypeHandler接口,該接口源碼如下:
//此接口作用是用于指定jdbc與java的數(shù)據(jù)類型間對應關系處理。
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 實現(xiàn)Integer和字符串互轉
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
查詢
查詢的時候 你轉的那個字段就配置哪個字段
<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
到此這篇關于MyBatis中TypeHandler的使用教程詳解的文章就介紹到這了,更多相關MyBatis TypeHandler使用內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- MyBatis自定義TypeHandler實現(xiàn)字段加密解密
- MyBatis類型處理器TypeHandler的作用及說明
- MyBatis-Plus?中?typeHandler?的使用實例詳解
- SpringBoot中MyBatis使用自定義TypeHandler的實現(xiàn)
- 解決Mybatis-plus自定義TypeHandler查詢映射結果一直為null問題
- Mybatis中TypeHandler使用小結
- Mybatis的TypeHandler實現(xiàn)數(shù)據(jù)加解密詳解
- Mybatis中自定義TypeHandler處理枚舉的示例代碼
- MyBatisPlus自定義JsonTypeHandler實現(xiàn)自動轉化JSON問題
- MyBatis自定義TypeHandler如何解決字段映射問題
- MyBatis中TypeHandler基本用法與示例
相關文章
四步教你完美解決IDEA運行maven項目時報錯:java:?錯誤:?不支持發(fā)行版本?5
這篇文章主要介紹了四步教你完美解決IDEA運行maven項目時報錯:java:?錯誤:?不支持發(fā)行版本?5的相關資料,文中通過圖文將解決的辦法介紹的非常詳細,需要的朋友可以參考下2025-09-09
Java中通過ZipOutputStream類如何將多個文件打成zip
ZipOutputStream?是Java中用于創(chuàng)建ZIP文件的類,它是?java.util.zip?包中的一部分,通過使用?ZipOutputStream?,可以將多個文件壓縮到一個ZIP文件中,這篇文章主要介紹了Java中(ZipOutputStream)如何將多個文件打成zip,需要的朋友可以參考下2023-09-09
SpringBoot搭建Dubbo項目實現(xiàn)斐波那契第n項詳解
這篇文章主要講解了“SpringBoot+Dubbo怎么實現(xiàn)斐波那契第N項”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習吧2022-06-06

