簡體   English   中英

覆蓋 mybatis 類型處理程序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM