mybatis插入一条数据返回自增的主键值

版权声明: https://blog.csdn.net/smileyan9/article/details/88016380

1. 编写目的

介绍如何使用mysql数据库并且已经设计这个表的主键值为自增,使用mybatis插入一条数据时返回这个插入数据的主键值。

2. 特别提醒

不能够误以为调用dao层,返回值是主键值。这样编写代码,最后会发现如果插入一条数据成功的话,返回值永远是1。

因为返回值的意思是插入后对这张表影响的行数。

3. 具体代码

  • 保证数据库设计时主键值是自增的
  • 使用mybatis配置的xml文件中,需要指定自增是哪个字节。下面是项目中的源码,特别要注意useGeneratedKeys="true"是使用自增,keyProperty对应的java中实体类中主键的那个变量名,而不是数据库表中的属性名。
     <insert id="insertUser"  parameterType="cn.ailanglang.diary.entity.User"
            useGeneratedKeys="true" keyProperty="pkUserid">
      insert into user(password,uk_phone,gmt_create,gmt_modified)
      values(#{password},#{ukPhone},#{gmtCreate},#{gmtModified})
    </insert>
  • 在调用时,需要先插入数据,然后再调用实体类的getId方法返回主键值。
    推荐在service层完成,但是为了让测试效果更明显,我写在controller中,代码如下:

    @RequestMapping("/add")
    private Map<String,String> insertUser(String password,String phonenum) {
        Map<String,String > map = new HashMap<>(2);

        User user = new User();
        user.setGmtCreate(new Date());
        user.setGmtModified(new Date());
        user.setUkPhone(phonenum);
        user.setPassword(password);
        
        // 特别要注意这个地方
        Long id = userService.insertUser(user);
        System.out.println(id);
        map.put("insert的返回值 == ",id+"");
        map.put("user.getPkuserid == ",user.getPkUserid()+"");
        return map;
    }

4. 效果展示

在这里插入图片描述

5. 推荐

推荐写在service层中,避免一些可能导致的不必要的麻烦。

    @Autowired
    private UserDao userDao;
    @Override
    public Long insertUser(User user) {
        userDao.insertUser(user);
        return user.getPkUserid();
    }

6. 总结

小小的问题困扰我的时间真不少,特在此做笔记,也供他人了解,有问题欢迎交流。

Smileyan 2019年2月28日

猜你喜欢

转载自blog.csdn.net/smileyan9/article/details/88016380