使用MyBatis处理Java 8的java.time.LocalDateTime

这个概述提供了简要的信息。

在我的业务中使用MyBatis,但在升级到Java 8时,由于人们说使用了Date and Time API (JSR 310)后日期相关的操作更方便,所以我决定将DTO的字段修改为LocalDateTime,并在调查后得出了这个结论。

因为在MyBatis的官方文档中有写明,所以我能轻松地完成了。

表格 (MySQL)

CREATE TABLE `sample` (
  `id` int(10) NOT NULL AUTO_INCREMENT,
  `created` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

用于存储结果的DTO

import java.time.LocalDateTime;
import lombok.Data;

@Data
public class SampleDto {
    private int id;
    private LocalDateTime created;
}

我想将这个created与SQL的结果进行映射。

类型处理器

听起来好像是建议实现org.apache.ibatis.type.TypeHandler或者org.apache.ibatis.type.BaseTypeHandler来映射JDBC类。
这次我尝试实现了BaseTypeHandler。

@MappedTypes(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);
        if (timestamp == null) {
            return null;
        } else {
            return timestamp.toLocalDateTime();
        }
    }

    @Override
    public LocalDateTime getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        Timestamp timestamp = rs.getTimestamp(columnIndex);
        if (timestamp == null) {
            return null;
        } else {
            return timestamp.toLocalDateTime();
        }
    }

    @Override
    public LocalDateTime getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        Timestamp timestamp = cs.getTimestamp(columnIndex);
        if (timestamp == null) {
            return null;
        } else {
            return timestamp.toLocalDateTime();
        }
    }
}

我的Batis配置文件是mybatis-config.xml。

在mybatis-config.xml中添加设置以查找创建的TypeHandler。

<configuration>
  <typeHandlers>
    <typeHandler handler="sample.mybatis.handlers.LocalDateTimeTypeHandler"/>
  </typeHandlers>
</configuration>

或者.

<configuration>
  <typeHandlers>
    <package name="sample.mybatis.handlers"/>
  </typeHandlers>
</configuration>

将实现方法组合到同一个包中并进行包指定会更方便吧。

制图员

public interface SampleMapper {

    @Select("SELECT * FROM sample)
    List<SampleDto> selectAll();

    @Insert("insert into sample (created) values ( #{created} )")
    @SelectKey(before = false, keyProperty = "id", resultType = int.class, statement = { "select last_insert_id()" })
    int insert(SampleDto sampleDto);
}

只需像普通一样使用Mapper即可将搜索和注册与数据库进行映射。

广告
将在 10 秒后关闭
bannerAds