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的配置文件

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

<?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如下

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

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被赋值到原对象当中,而不是返回值!


原网址: 访问
创建于: 2020-10-18 21:53:50
目录: default
标签: 无

请先后发表评论
  • 最新评论
  • 总共0条评论