• MyBatis的useGeneratedKeys使用(添加并返回自增主键)


    业务需求,用户表为主键自增,添加完用户之后,通过用户ID和角色表进行关联。

    问题:由于主键自增,所以在用户添加之前是不知道ID的,当然可以通过查询得到当前的ID,不过需要自己多一步操作。

    解决方案:使用useGeneratedKeys属性,以及keyProperty

    useGeneratedKeys

    (仅适用于 insert 和 update)这会令 MyBatis 使用 JDBC 的 getGeneratedKeys 方法来取出由数据库内部生成的主键(比如:像 MySQL 和 SQL Server 这样的关系型数据库管理系统的自动递增字段),默认值:false

    keyProperty

    仅适用于 insert 和 update)指定能够唯一识别对象的属性,MyBatis 会使用 getGeneratedKeys 的返回值或 insert 语句的 selectKey 子元素设置它的值,默认值:未设置(unset)。如果生成列不止一个,可以用逗号分隔多个属性名称。

    个人理解:下图比较详细

     可能引发问题:有时候使用批量添加操作,在service层将所有的数据通过for循环进行遍历,调用底层的单个添加操作的方法(xml中useGeneratedKeys属性为true),添加到第二条时,会提示主键已存在的异常(数据库设置的为主键自增)。

     原因:因为useGeneratedKeys属性为true所以将第一条添加的数据主键返回了,而第二条数据没有将id主键重新设置为null,直接使用第一条添加数据并返回的主键id,导致主键重复异常。

     解决方案:循环遍历添加时,将id设置为null即可。

    for (int i = 0; i < 3; i++) {
           user.setUserId(null);  //将用户id重新设置为null即可
           // 新增用户信息
           rows = userMapper.insertUser(user);
           // 新增用户岗位关联
           insertUserPost(user);  
    }
  • 相关阅读:
    PHP创建socket服务
    linux配置PS1
    几个常用的linux命令
    MongoDB的分片集群搭建
    django-admin 配置
    django使用mysql数据库
    Django知识
    docker 监控之 cadvisor
    shell 拾遗
    shell 基数数值方法
  • 原文地址:https://www.cnblogs.com/qcq0703/p/15193023.html
Copyright © 2020-2023  润新知