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