今天在使用數據庫的時候,遇到一個場景,即在插入數據完成后需要返回此數據對應的自增主鍵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被賦值到原對象當中,而不是返回值!
