mybatis中Date和DateTime字段的插入

最近公司使用MyBatis3做数据持久层,在字段中有Date和DateTime类型,在插入数据时只要将实体的属性设置成Timestamp就会对应mysql的DateTime类型,Date会对应mysql的Date类型。
在MyBatis映射文件中要表明映射类型。

<result column="modified_date" jdbcType="TIMESTAMP" property="modified_date" javaType="java.sql.Timestamp" />
<result column="date" jdbcType="DATE" property="date" javaType="java.util.Date" />

在使用字段的时候也要标明类型#{modified_date,jdbcType=TIMESTAMP}、#{date,jdbcType=DATE}。

### MyBatis中处理DateTime类型的解决方案 在MyBatis框架中,对于`datetime`类型的字段,默认情况下可以通过内置的类型处理器完成基本的数据转换。然而,在某些场景下可能需要自定义逻辑来满足特定的需求。 #### 默认支持的方式 当使用`java.util.Date`作为Java对象中的属性时,MyBatis提供了默认的支持机制。通过注解可以指定日期格式以便于前端展示数据库存储之间的相互转化。例如: ```java @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss") // 页面写入数据库时格式化 @JSONField(format="yyyy-MM-dd HH:mm:ss") // 数据库导出页面时json格式化 private Date createTime; ``` 这种方式适用于大多数简单的应用场景[^1]。 #### 枚举类型的支持扩展 如果涉及到更复杂的业务逻辑或者特殊的时间单位(如时间戳),则可以考虑利用MyBatis对枚举类型的支持特性。虽然主要针对的是`EnumTypeHandler``EnumOrdinalTypeHandler`两种方式,但对于定制化的日期操作也可以借鉴其设计思路[^2]。 #### Java 8 时间API兼容性挑战及其解决办法 随着技术的发展,越来越多的应用开始采用Java 8引入的新时间API (`java.time.*`) 来替代传统的`java.util.Date`系列类。然而这带来了新的问题——即与旧版ORM工具链可能存在不匹配的情况。比如直接尝试保存`LocalDateTime`实例至MySQL `DATETIME`列可能会抛出“No TypeHandler found”的异常提示[^3]。 对此有几种可行策略可供选择: - **升级驱动版本**:确保所使用的JDBC驱动程序能够识别并正确解析现代时间表示形式; - **编写专属适配器**:按照官方文档指引构建个性化的`TypeHandler`实现类; 下面给出一个具体的例子演示如何创建用于`LocalDateTime <-> VARCHAR(ISO_LOCAL_DATE_TIME)`互转的功能模块: ```java public class LocalDateTimeTypeHandler extends BaseTypeHandler<LocalDateTime> { @Override public void setNonNullParameter(PreparedStatement ps, int i, LocalDateTime parameter, JdbcType jdbcType) throws SQLException { ps.setString(i, DateTimeFormatter.ISO_LOCAL_DATE_TIME.format(parameter)); } @Override public LocalDateTime getNullableResult(ResultSet rs, String columnName) throws SQLException { String value = rs.getString(columnName); return StringUtils.isEmpty(value) ? null : LocalDateTime.parse(value, DateTimeFormatter.ISO_LOCAL_DATE_TIME); } @Override public LocalDateTime getNullableResult(ResultSet rs, int columnIndex) throws SQLException { String value = rs.getString(columnIndex); return StringUtils.isEmpty(value) ? null : LocalDateTime.parse(value, DateTimeFormatter.ISO_LOCAL_DATE_TIME); } @Override public LocalDateTime getNullableResult(CallableStatement cs, int columnIndex) throws SQLException { String value = cs.getString(columnIndex); return StringUtils.isEmpty(value) ? null : LocalDateTime.parse(value, DateTimeFormatter.ISO_LOCAL_DATE_TIME); } } ``` 之后记得将其声明到全局配置文件里头去: ```xml <typeHandlers> <typeHandler handler="com.example.handlers.LocalDateTimeTypeHandler" javaType="java.time.LocalDateTime"/> </typeHandlers> ``` 这样就能顺利达成目标了[^4]。 另外需要注意的一点是在执行大批量DML语句期间可能出现并发冲突现象从而引发死锁状况的发生概率增加等问题也需要提前做好预防措施[^5]。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值