最近刚接触 MyBatis,遇到 id 不能自增的问题已经有 selectedKey 来解决了,但是像 create_time 这种 timestamp 默认值为 CURRENT_TIMESTAMP 的,在 insert 之后依旧为 null,请问各位有啥好办法吗?谢谢
1
SbloodyS 2018-04-08 10:00:55 +08:00
判断一下插入的值是否为空即可
|
2
AllOfMe OP @SbloodyS 我是想用 MySQL 的 timestamp 来自增,没有用 new Date()这样的方式来赋值,因为我担心 Java 服务器的主机和数据库主机的时间不一致。如果是使用 TimeStamp 的 CURRENT_TIMESTAMP,insert 之后能否让 MyBatis 自动赋值上去呢
|
3
SbloodyS 2018-04-08 10:15:50 +08:00
那可以每次插入的时候不给这个字段赋值,并且 Mysql 该字段 NOT NULL,直接使用 Mysql 自动赋值就好啦
|
4
daimazha 2018-04-08 10:16:27 +08:00
insert 的时候 没有包含这列的时候 才会用默认值也就是 CURRENT_TIMESTAMP。 你应该是包含了这个字段,但是值为 null。你可以写死 这列的值为 NOW()
|
5
AllOfMe OP @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 去查询一遍 ``` |
6
dovme 2018-04-08 10:33:51 +08:00
你这个获取的方式有问题吧,你不从数据库查你插入的 user? user.getCreateTime()这个 user 是你自己 new 出来的啊.
|
7
dovme 2018-04-08 10:38:25 +08:00 2
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(); |
8
zjp 2018-04-08 10:39:42 +08:00 via Android
我刚刚也以为楼主说 current_timestamp 没有生效…
还是在代码里指定时间戳来的容易。如果说 Java 和 MySQL 的时间不一致,还可能会出其他的问题,绕不过去的 |
9
AllOfMe OP @dovme 我以为和 hibernate 一样,在插入之后 hibernate 就能赋值 timestamp 了。我担心如果是几千万的表,这样查询不知道有没有性能问题。 还是如果是本身这个表结构没有主键 id 的话,我又应该如何获取 createTime 呢?
|
10
AllOfMe OP 我贴一下我的 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> |
12
Shynoob 2018-04-08 10:52:59 +08:00
楼主的问题是否是 insert 方法返回的插入对象的 creat_time 为空?
|
13
pelloz 2018-04-08 10:57:41 +08:00
很简单,你直接将 XML 里面的 create_time 和#{createTime,jdbcType=TIMESTAMP}删掉就好了
|
16
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 对象中 |
18
AllOfMe OP |
19
lrh3321 2018-04-08 11:46:24 +08:00
膜拜下你们这些收些 XML 的大佬,我都是用注解的。
|
20
night98 2018-04-08 12:06:58 +08:00 via Android
insert 语句中不要带 createtime,不然就把 java 中的 null 插入进数据库的 createtime 里了,这个是基础常识吧?
|
21
AllOfMe OP @night98 数据库的 createTime 是 not null 并且默认值为 CURRENT_TIMESTAMP,xml 文件的 insert 语句里面是有带 createTime 的, 而且我用 mapper.insert(user)之后,数据库也是有正常的非 null 值。现在问题是,插入是成功了,数据库也是正常的,但是 insert(user)这个 user 的 pojo 实例后,该 pojo 实例的 createTime 的值为空,我希望 insert 之后能让 mybatis 自动给 pojo 的 createTime 赋值
|
24
choice4 2018-04-08 19:28:00 +08:00
user = UserMapper.selectByPrimaryKey(user.getId())。。。不要打我
|
25
flight2006 2018-04-08 20:44:19 +08:00
用 insertSelective 方法,insert 方法会用你的实体所有字段包括 null 的
|
26
tedzhou1221 2018-04-09 06:25:39 +08:00 via Android
说个题外话,好像 Mysql5.7 开始时间类字段不能为 null,以前版本的数据导过来可能会有问题
|