V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
AllOfMe
V2EX  ›  Java

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

  •  
  •   AllOfMe · 2018-04-08 09:48:38 +08:00 · 5905 次点击
    这是一个创建于 2416 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    第 1 条附言  ·  2018-04-08 13:47:57 +08:00
    数据库的 createTime 是 not null 并且默认值为 CURRENT_TIMESTAMP,xml 文件的 insert 语句里面是有带 createTime 的, 而且我用 mapper.insert(user)之后,数据库也是有正常的非 null 值。现在问题是,插入是成功了,数据库也是正常的,但是 insert(user)这个 user 的 pojo 实例后,该 pojo 实例的 createTime 的值为 null,我希望 insert 之后能让 mybatis 自动给 pojo 的 createTime 赋值
    26 条回复    2018-04-09 06:25:39 +08:00
    SbloodyS
        1
    SbloodyS  
       2018-04-08 10:00:55 +08:00
    判断一下插入的值是否为空即可
    AllOfMe
        2
    AllOfMe  
    OP
       2018-04-08 10:03:39 +08:00
    @SbloodyS 我是想用 MySQL 的 timestamp 来自增,没有用 new Date()这样的方式来赋值,因为我担心 Java 服务器的主机和数据库主机的时间不一致。如果是使用 TimeStamp 的 CURRENT_TIMESTAMP,insert 之后能否让 MyBatis 自动赋值上去呢
    SbloodyS
        3
    SbloodyS  
       2018-04-08 10:15:50 +08:00
    那可以每次插入的时候不给这个字段赋值,并且 Mysql 该字段 NOT NULL,直接使用 Mysql 自动赋值就好啦
    daimazha
        4
    daimazha  
       2018-04-08 10:16:27 +08:00
    insert 的时候 没有包含这列的时候 才会用默认值也就是 CURRENT_TIMESTAMP。 你应该是包含了这个字段,但是值为 null。你可以写死 这列的值为 NOW()
    AllOfMe
        5
    AllOfMe  
    OP
       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
        6
    dovme  
       2018-04-08 10:33:51 +08:00
    你这个获取的方式有问题吧,你不从数据库查你插入的 user? user.getCreateTime()这个 user 是你自己 new 出来的啊.
    dovme
        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();
    zjp
        8
    zjp  
       2018-04-08 10:39:42 +08:00 via Android
    我刚刚也以为楼主说 current_timestamp 没有生效…
    还是在代码里指定时间戳来的容易。如果说 Java 和 MySQL 的时间不一致,还可能会出其他的问题,绕不过去的
    AllOfMe
        9
    AllOfMe  
    OP
       2018-04-08 10:42:18 +08:00
    @dovme 我以为和 hibernate 一样,在插入之后 hibernate 就能赋值 timestamp 了。我担心如果是几千万的表,这样查询不知道有没有性能问题。 还是如果是本身这个表结构没有主键 id 的话,我又应该如何获取 createTime 呢?
    AllOfMe
        10
    AllOfMe  
    OP
       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
        11
    dovme  
       2018-04-08 10:50:52 +08:00
    @AllOfMe 你的 mapper.xml 全部手写的??? MyBatis Generator 可以自动生成的
    Shynoob
        12
    Shynoob  
       2018-04-08 10:52:59 +08:00
    楼主的问题是否是 insert 方法返回的插入对象的 creat_time 为空?
    pelloz
        13
    pelloz  
       2018-04-08 10:57:41 +08:00
    很简单,你直接将 XML 里面的 create_time 和#{createTime,jdbcType=TIMESTAMP}删掉就好了
    AllOfMe
        14
    AllOfMe  
    OP
       2018-04-08 11:12:17 +08:00
    @dovme 我是用 generator 来生成,手写可能会疯。。
    AllOfMe
        15
    AllOfMe  
    OP
       2018-04-08 11:12:31 +08:00
    @Shynoob 对的
    anheiyouxia
        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 对象中
    jackqian
        17
    jackqian  
       2018-04-08 11:25:36 +08:00 via iPhone
    @dovme 居然能自动生成,我都是手写。
    AllOfMe
        18
    AllOfMe  
    OP
       2018-04-08 11:30:03 +08:00
    lrh3321
        19
    lrh3321  
       2018-04-08 11:46:24 +08:00
    膜拜下你们这些收些 XML 的大佬,我都是用注解的。
    night98
        20
    night98  
       2018-04-08 12:06:58 +08:00 via Android
    insert 语句中不要带 createtime,不然就把 java 中的 null 插入进数据库的 createtime 里了,这个是基础常识吧?
    AllOfMe
        21
    AllOfMe  
    OP
       2018-04-08 13:46:06 +08:00
    @night98 数据库的 createTime 是 not null 并且默认值为 CURRENT_TIMESTAMP,xml 文件的 insert 语句里面是有带 createTime 的, 而且我用 mapper.insert(user)之后,数据库也是有正常的非 null 值。现在问题是,插入是成功了,数据库也是正常的,但是 insert(user)这个 user 的 pojo 实例后,该 pojo 实例的 createTime 的值为空,我希望 insert 之后能让 mybatis 自动给 pojo 的 createTime 赋值
    night98
        22
    night98  
       2018-04-08 13:48:36 +08:00
    @AllOfMe #21 那就只能再查一次,我记得 mybatis 默认只支持 id 插入后 getid()
    AllOfMe
        23
    AllOfMe  
    OP
       2018-04-08 14:29:00 +08:00
    @night98 好的,谢谢
    choice4
        24
    choice4  
       2018-04-08 19:28:00 +08:00
    user = UserMapper.selectByPrimaryKey(user.getId())。。。不要打我
    flight2006
        25
    flight2006  
       2018-04-08 20:44:19 +08:00
    用 insertSelective 方法,insert 方法会用你的实体所有字段包括 null 的
    tedzhou1221
        26
    tedzhou1221  
       2018-04-09 06:25:39 +08:00 via Android
    说个题外话,好像 Mysql5.7 开始时间类字段不能为 null,以前版本的数据导过来可能会有问题
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5732 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 08:30 · PVG 16:30 · LAX 00:30 · JFK 03:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.