-
Notifications
You must be signed in to change notification settings - Fork 516
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
lealone + mybatis plus LocalDateTime字段插入数据报错 #179
Comments
周边生态也很重要. |
lealone 支持三种日期时间类型,是严格遵循 jdbc 规范的 mybatis plus 我不熟,不清楚它为什么全映射成 java.util.Date,哪怕是 DATE 类型,也是 java.sql.Date 啊。 |
错误提示是你在客户端传给 TIMESTAMP 字段的值是一个无法解析的字符串,是不是在客户端设置字段参数值时错了。 |
如果表字段是 TIMESTAMP 类型,然后用 java.time.LocalDateTime.now().toString() 变成字符串写入 TIMESTAMP 类型的字段是可以解析的,这个我刚试了,java.time.LocalDateTime.now().toString() 会返回 “2023-05-15T22:15:52.086” 这种格式, |
我知道原因,肯定是 mybatis plus 在得到 PreparedStatement 后用 setObject(1, java.time.LocalDateTime.now()) 这种方式执行了,lealone 没有把 LocalDateTime 自动转成 java.sql.Timestamp,而是变成一个字节数组了,所以就错了。 java.time.LocalDateTime 是比较新的日期时间类。 |
lealone 目前不支持 java.time.LocalDateTime 这类 JSR 310 日期时间API |
mybatis plus 我不知道是否可以给具体的数据库方言配置不同的参数,毕竟不是所有数据库都要支持各种 jdk 新的类的, |
那我先研究一下mybatis 看怎么解决 |
mybatis-3.5.11\src\main\java\org\apache\ibatis\type |
下午试了一下自定义LocalDateTimeTypeHandler可以跑通. import org.apache.ibatis.type.JdbcType;
import org.apache.ibatis.type.LocalDateTimeTypeHandler;
import org.apache.ibatis.type.MappedTypes;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.time.LocalDateTime;
import java.util.Optional;
@MappedTypes(LocalDateTime.class) //需要通过配置类或者配置文件注册该TypeHandler
public class CustomLocalDateTimeTypeHandler extends LocalDateTimeTypeHandler {
@Override
public void setNonNullParameter(PreparedStatement ps, int i, LocalDateTime parameter, JdbcType jdbcType) throws SQLException {
if ("Lealone".equals(ps.getConnection().getMetaData().getDatabaseProductName())) {
ps.setString(i, Optional.ofNullable(parameter).map(LocalDateTime::toString).orElse(null));
} else {
ps.setObject(i, parameter);
}
}
} mybatis 以前应该是支持的, 后面代码被人改了: |
它可能想省事直接让数据库的 jdbc 驱动在 setObject 里自己去转换,mysql、postgresql 新一点的 jdbc 驱动在 setObject 方法内部就对 java.time 包中的各种类做了转换,还是挺繁琐的。 |
我看了一下 h2 数据库的新版本,它也支持 java.time 的类了,技术难度不大,就是很繁琐,这是它的其中一个工具类 JSR310Utils lealone 的后续小版本再看看要不要支持 java.time,目前大多数应用还是用 java.sql 中的日期时间 api 多一些。 |
mybatis plus已添加对Lealone数据库的支持 这个问题根源在mybatis, 还是希望可以支持jsr310
|
测试项目 https://github.com/zhoujin7/lealone-boot
执行:
https://github.com/zhoujin7/lealone-boot/blob/main/src/test/java/com/example/lealoneboot/LealoneBootApplicationTests.java
需要先将依赖库mvn install到本地 https://github.com/zhoujin7/mybatis-plus (对mybatis-plus添加了对lealone的支持)
实体类User
private LocalDateTime createdAt;
如果用java.util.Date类型就不会报错.
报错信息:
The text was updated successfully, but these errors were encountered: