[英]Overriding mybatis typehandler
我使用最新的 spring 引導和 spring mybatis 使用 mybatis 3.5.9
我有一個帶有 LocalDateTime 的 pojo,並且數據庫有一個時間戳。所以我希望 mybatis 能夠轉換它。但是,從 3.4.1 開始,mybatis LocalDateTimeTypeHandler 發生了變化,導致無法轉換為 TIMESTAMPZ 錯誤。
所以我抓住了以前與 LocalDateTime 一起使用的 mybatis LocalDateTimeTypeHandler 並將其添加到我的項目中。但是,無論我做什么,我都無法讓 mybatis 使用類型處理程序..
我目前有類型處理程序。
package my.mapper.typehandlers;
import java.sql.CallableStatement;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.time.LocalDateTime;
import org.apache.ibatis.type.BaseTypeHandler;
import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.MappedJdbcTypes;
import org.apache.ibatis.type.MappedTypes;
@MappedJdbcTypes(value=JdbcType.TIMESTAMP)
@MappedTypes(value = LocalDateTime.class)
public class LocalDateTimeTypeHandler extends BaseTypeHandler<LocalDateTime>{
@Override
public void setNonNullParameter(PreparedStatement ps, int i, LocalDateTime parameter, JdbcType jdbcType)
throws SQLException {
ps.setTimestamp(i, Timestamp.valueOf(parameter));
}
@Override
public LocalDateTime getNullableResult(ResultSet rs, String columnName) throws SQLException {
Timestamp timestamp = rs.getTimestamp(columnName);
return getLocalDateTime(timestamp);
}
@Override
public LocalDateTime getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
Timestamp timestamp = rs.getTimestamp(columnIndex);
return getLocalDateTime(timestamp);
}
@Override
public LocalDateTime getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
Timestamp timestamp = cs.getTimestamp(columnIndex);
return getLocalDateTime(timestamp);
}
private static LocalDateTime getLocalDateTime(Timestamp timestamp) {
if (timestamp != null) {
return timestamp.toLocalDateTime();
}
return null;
}
}
和結果
@Results(id = "statusResult", value = {
@Result(property = "id", column = "id", id = true),
@Result(property = "patientId", column = "patient_id"),
@Result(property = "enqueueDone", column = "enqueue_done"),
@Result(property = "enqueuedTime", column = "enqueued_time")
})
我已經嘗試在 @Result 中為 enqueued_time 顯式設置 typeHandler ,但框架仍然忽略它。
更新:我將 mybatis.type-handlers-package=my.mapper.typehandlers 添加到 application.properties。 我可以達到我的斷點,它看起來一切都很好..但是 mybatis 看起來它只是調用了另一個 LocalDateTimeTypeHandler 並且我得到了 TIMEZONEZ 錯誤
如何讓 mybatis 忽略 mybatis LocalDateTimeTypeHandler?
謝謝
好的,所以這是一個漫長的炎熱的一天..所以我得到了這個工作..
我需要做的就是在@Result 中設置 typeHandler=my.mapper.typehandlers.LocalDateTimeTypeHandler.class
@Results(id = "statusResult", value = {
@Result(property = "id", column = "id", id = true),
@Result(property = "patientId", column = "patient_id"),
@Result(property = "enqueueDone", column = "enqueue_done"),
@Result(property = "enqueuedTime", column = "enqueued_time" ,typeHandler=my.mapper.typehandlers.LocalDateTimeTypeHandler.class)
})
並在屬性文件中包含 mybatis.type-handlers-package=my.mapper.typehandlers ..
我刪除了
@MappedJdbcTypes(value=JdbcType.TIMESTAMP)
@MappedTypes(value = LocalDateTime.class)
來自我的 LocalDateTimeTypeHandler class 因為它們不需要..
現在一切正常。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.