关于 Mybatis 在 insert 之后 timestamp 依旧为 null 的问题,求解谢谢!

2018-04-08 09:48:38 +08:00
 AllOfMe

最近刚接触 MyBatis,遇到 id 不能自增的问题已经有 selectedKey 来解决了,但是像 create_time 这种 timestamp 默认值为 CURRENT_TIMESTAMP 的,在 insert 之后依旧为 null,请问各位有啥好办法吗?谢谢

5791 次点击
所在节点    Java
26 条回复
SbloodyS
2018-04-08 10:00:55 +08:00
判断一下插入的值是否为空即可
AllOfMe
2018-04-08 10:03:39 +08:00
@SbloodyS 我是想用 MySQL 的 timestamp 来自增,没有用 new Date()这样的方式来赋值,因为我担心 Java 服务器的主机和数据库主机的时间不一致。如果是使用 TimeStamp 的 CURRENT_TIMESTAMP,insert 之后能否让 MyBatis 自动赋值上去呢
SbloodyS
2018-04-08 10:15:50 +08:00
那可以每次插入的时候不给这个字段赋值,并且 Mysql 该字段 NOT NULL,直接使用 Mysql 自动赋值就好啦
daimazha
2018-04-08 10:16:27 +08:00
insert 的时候 没有包含这列的时候 才会用默认值也就是 CURRENT_TIMESTAMP。 你应该是包含了这个字段,但是值为 null。你可以写死 这列的值为 NOW()
AllOfMe
2018-04-08 10:21:12 +08:00
@daimazha
@SbloodyS

额,,可能我表达的不太对。。我说的 timestamp 依旧为 null,是对 Java 的对象来说的,比如:
```
User user = new User();
user.setUsername("10");
user.setPassword("232")
userMapper.insert(user);
user.getId(); // 使用 SelectedKey 的赋值,是在这里 Java 环境是有值的
user.getCreateTime(); // 但是在这里,是为 null。数据库里查询刚刚插入的记录,createTime 也是有值的,只不过我想在 insert 之后,能对这个 user 实例获取一下 createTime 做点别的事情,不想再这个 id 去查询一遍

```
dovme
2018-04-08 10:33:51 +08:00
你这个获取的方式有问题吧,你不从数据库查你插入的 user? user.getCreateTime()这个 user 是你自己 new 出来的啊.
dovme
2018-04-08 10:38:25 +08:00
User user = new User();
user.setUsername("10");
user.setPassword("232")
userMapper.insert(user);
user.getId(); // 此处的 user 还是你刚才 new 出来的 user,不是你从数据库查出来的..
user.getCreateTime();
-------------------------------------------
// 这样试试??
User user = new User();
user.setUsername("10");
user.setPassword("232");
userMapper.insert(user);
//从数据库查询刚插入的 user
User user1 = xxxService.selectByPrimaryKey(xx);
user1.getId();
user1.getCreateTime();
zjp
2018-04-08 10:39:42 +08:00
我刚刚也以为楼主说 current_timestamp 没有生效…
还是在代码里指定时间戳来的容易。如果说 Java 和 MySQL 的时间不一致,还可能会出其他的问题,绕不过去的
AllOfMe
2018-04-08 10:42:18 +08:00
@dovme 我以为和 hibernate 一样,在插入之后 hibernate 就能赋值 timestamp 了。我担心如果是几千万的表,这样查询不知道有没有性能问题。 还是如果是本身这个表结构没有主键 id 的话,我又应该如何获取 createTime 呢?
AllOfMe
2018-04-08 10:43:12 +08:00
我贴一下我的 mapper xml 文件,大家看一下
<insert id="insert" parameterType="com.min.User" >
<selectKey resultType="java.lang.Integer" keyProperty="id" order="AFTER" >
SELECT LAST_INSERT_ID()
</selectKey>
insert into user (username, password, create_time
)
values (#{username,jdbcType=VARCHAR}, #{password,jdbcType=VARCHAR}, #{createTime,jdbcType=TIMESTAMP}
)
</insert>
dovme
2018-04-08 10:50:52 +08:00
@AllOfMe 你的 mapper.xml 全部手写的??? MyBatis Generator 可以自动生成的
Shynoob
2018-04-08 10:52:59 +08:00
楼主的问题是否是 insert 方法返回的插入对象的 creat_time 为空?
pelloz
2018-04-08 10:57:41 +08:00
很简单,你直接将 XML 里面的 create_time 和#{createTime,jdbcType=TIMESTAMP}删掉就好了
AllOfMe
2018-04-08 11:12:17 +08:00
@dovme 我是用 generator 来生成,手写可能会疯。。
AllOfMe
2018-04-08 11:12:31 +08:00
@Shynoob 对的
anheiyouxia
2018-04-08 11:21:54 +08:00
@dovme 你可能对 MyBatis 有什么误解

User user = new User();
user.setUsername("10");
user.setPassword("232")
userMapper.insert(user);
user.getId();

这里的 user.getId()是可行的,只要 insert 定义好了 SelectKey,mybatis 会自动把自增的 IDset 到传进去的 User 对象中
jackqian
2018-04-08 11:25:36 +08:00
@dovme 居然能自动生成,我都是手写。
AllOfMe
2018-04-08 11:30:03 +08:00
lrh3321
2018-04-08 11:46:24 +08:00
膜拜下你们这些收些 XML 的大佬,我都是用注解的。
night98
2018-04-08 12:06:58 +08:00
insert 语句中不要带 createtime,不然就把 java 中的 null 插入进数据库的 createtime 里了,这个是基础常识吧?

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/444973

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX