使用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即可将搜索和注册与数据库进行映射。