• Mybatis使用generatedKey在插入数据时返回自增id始终为1,自增id实际返回到原对象当中的问题排查


    今天在使用数据库的时候,遇到一个场景,即在插入数据完成后需要返回此数据对应的自增主键id,但是在使用Mybatis中的generatedKey且确认各项配置均正确无误的情况下,每次插入成功后,返回的都是1,而不是最新的自增Id

    终于凭借着一次Debugg发现的问题,原来在使用Mabatis中的insert或者insertSelective方式插入时,如使用int insert(TestGenKey testGenKey)时,返回值int表示的是插入操作受影响的行数,而不是指的自增长id,那么返回的自增id到底去哪里了呢?通过下面的Debugg我们知道自增id返回到testGenKey的原对象中去了

    举例示范配置

    数据库示例表

     generator的配置文件

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE generatorConfiguration
            PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
            "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
    <generatorConfiguration>
    
        <!-- http://www.mybatis.org/generator/configreference/context.html -->
        <context id="product" targetRuntime="MyBatis3" defaultModelType="flat">
            <property name="autoDelimitKeywords" value="true"/>
            <property name="beginningDelimiter" value="`"/>
            <property name="endingDelimiter" value="`"/>
    
            <plugin type="tk.mybatis.mapper.generator.MapperPlugin">
                <property name="mappers" value="tk.mybatis.mapper.common.Mapper"/>
                <property name="caseSensitive" value="true"/>
            </plugin>
            <!-- 阻止生成自动注释 -->
            <commentGenerator>
                <property name="javaFileEncoding" value="UTF-8"/>
                <property name="suppressDate" value="true"/>
                <!-- 注释不能全干掉,不然每次xml文件都有重复内容 -->
                <property name="suppressAllComments" value="false"/>
            </commentGenerator>
    
            <!--数据库链接地址账号密码-->
            <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                            connectionURL="jdbc:youraddress"
                            userId="yourname"
                            password="yourpass">
            </jdbcConnection>
    
            <!--生成Model类存放位置-->
            <javaModelGenerator targetPackage="yourpackage.model" targetProject="src/main/java">
                <property name="enableSubPackages" value="true"/>
                <property name="trimStrings" value="true"/>
            </javaModelGenerator>
    
            <!--生成映射文件(xml)存放位置-->
            <sqlMapGenerator targetPackage="yourpackage.dao" targetProject="src/main/resources">
                <property name="enableSubPackages" value="true"/>
            </sqlMapGenerator>
    
            <!--生成Dao类存放位置-->
            <javaClientGenerator type="XMLMAPPER" targetPackage="yourpackage.dao" targetProject="src/main/java">
                <property name="enableSubPackages" value="true"/>
            </javaClientGenerator>
    
            <table tableName="test_gen_key" domainObjectName="TestGenKey" enableCountByExample="false"
                   enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false"
                   selectByExampleQueryId="false">
                <generatedKey column="product_id" sqlStatement="JDBC" identity="true"/>
            </table>
        </context>
    
    </generatorConfiguration>
    

      

    给需要获取自增长id的表配置generatedKey

    依据上述配置生成出来的PO Model如下

    package yourpackage.model;
    
    import javax.persistence.*;
    
    @Table(name = "test_gen_key")
    public class TestGenKey {
        @Id
        @Column(name = "product_id")
        @GeneratedValue(generator = "JDBC")
        private Integer productId;
    
        private String name;
    
        private String sex;
    
        /**
         * @return product_id
         */
        public Integer getProductId() {
            return productId;
        }
    
        /**
         * @param productId
         */
        public void setProductId(Integer productId) {
            this.productId = productId;
        }
    
        /**
         * @return name
         */
        public String getName() {
            return name;
        }
    
        /**
         * @param name
         */
        public void setName(String name) {
            this.name = name == null ? null : name.trim();
        }
    
        /**
         * @return sex
         */
        public String getSex() {
            return sex;
        }
    
        /**
         * @param sex
         */
        public void setSex(String sex) {
            this.sex = sex == null ? null : sex.trim();
        }
    }
    

      

    测试及Debugg

    编写测试方法测试插入

    插入成功后观察对应的变量对应的值

    总结:调用Insert后插入操作之后,所得到自增长Id被赋值到原对象当中,而不是返回值!

  • 相关阅读:
    hdu1418 欧拉公式
    hdu1215七夕节 筛选法求公因子和
    hdu1215 The area
    hdu1005Number Sequence
    hdu1021 数学题 并不是说难,而是数学题那种简单朴素的思想get不到
    Mongo第三个参数的用法
    js 显示刚刚上传的图片 (onchange事件)
    在linux中安装memcache服务器
    jQuery 倒计时
    PHP获取文章发布时间
  • 原文地址:https://www.cnblogs.com/lingyejun/p/9607605.html
Copyright © 2020-2023  润新知