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被賦值到原對象當中,而不是返回值!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM