MyBatis 不能与 joda DateTime 一起工作?

MyBatis cannot work with joda DateTime?

我正在使用 MyBatis 3.2,并希望将 Oracle DATE 数据类型映射到 Java org.joda.time.DateTime 数据类型。

这是我的配置:

<resultMap id="something" type="com.myself.SomeClass">
  <result property="creationDate" column="CREATION_DATE" javaType="org.joda.time.DateTime" />
</resultMap>

但我收到以下错误:

Caused by: org.apache.ibatis.builder.BuilderException
         : Error parsing SQL Mapper Configuration. 
Cause    : org.apache.ibatis.builder.BuilderException
         : Error parsing Mapper XML. 
Cause    : java.lang.IllegalStateException
         : No typehandler found for property creationDate

我的配置正确吗?还是我的Oracle数据类型是DATE而不是DATETIME造成的? MyBatis 是否支持 joda DateTime?

我认为 MyBatis 不支持 Joda DateTime。这可能是由于 mybatis 无法将 Joda DateTime 对象序列化为 JDBC sql 的正确格式造成的。所以,你必须使用 Java 类型 "Date".

我认为您需要使用 TypeResolver 将 JodaTime 处理为 Oracle DateTime。 我在 MySQL 的 MyBatis 上有过这方面的经验,你可能会使用这个指南,它可能会帮助你解决你的问题。

我使用这个 github 项目作为如何使用 TypeResolver 的指南:https://github.com/LukeL99/joda-time-mybatis

在我的一个映射器中,我有这段代码:

<result column="expiryDate" property="expiryDate" javaType="org.joda.time.DateTime" typeHandler="org.joda.time.mybatis.handlers.DateTimeTypeHandler"/>

org.joda.time.mybatis.handlers.DateTimeTypeHandler 是 class 来自我发布的 github 项目。

希望这对您有所帮助。

org.mybatis:mybatis-typehandlers-jsr310 java 8 DateTime 支持。
我已将需要的 classes 复制到我的项目并将它们移植到 JodaTime。
之后,您可以像往常一样在 select 语句和结果定义中使用类型处理程序。

@Select("select p.transaction_id from dly_mstr_curr_trd_prg p "
        + "where p.start_time < #{threshold, typeHandler=org.apache.ibatis.type.LocalDateTimeTypeHandler} "
        + "and failure_reason is null")
Collection<BigDecimal> selectStaleNotFailedTransactions(@Param("threshold") LocalDateTime threshold);

@Result(property = "transaction.transactionPostingDate", column = "TXN_PSTG_D", typeHandler=LocalDateTimeTypeHandler.class),

这里是移植的例子class:

/**
 * @author Tomas Rohovsky
 */
public class LocalDateTypeHandler extends BaseTypeHandler<LocalDate> {

    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, LocalDate parameter, JdbcType jdbcType)
            throws SQLException {
        ps.setDate(i, Date.valueOf(parameter.toString("yyyy-MM-dd HH:mm:ss")));
    }

    @Override
    public LocalDate getNullableResult(ResultSet rs, String columnName) throws SQLException {
        Date date = rs.getDate(columnName);
        return getLocalDate(date);
    }

    @Override
    public LocalDate getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        Date date = rs.getDate(columnIndex);
        return getLocalDate(date);
    }

    @Override
    public LocalDate getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        Date date = cs.getDate(columnIndex);
        return getLocalDate(date);
    }

    private static LocalDate getLocalDate(Date date) {
        return date == null ? null : LocalDate.parse(date.toLocalDate().toString());
    }
}