MyBatis中执行完insert插入语句后,返回的自增主键总是1?

mac2022-06-30  111

环境:MySQL5.7,MyBatis3.4.5

在MyBatis的映射文件中有两种写法:

一、

<insert id="insUser" parameterType="com.hnlib.model.User" useGeneratedKeys="true" keyColumn="id" keyProperty="id"> insert into User (name,password) values (#{name},#{password}) </insert> useGeneratedKeys: 是否自动生成主键,默认falsekeyProperty :返回的主键值赋给哪个JavaBean属性keyColumn: 数据库、表中的自增主键的字段名

二、

<insert id="insUser" parameterType="com.hnlib.model.User"> <selectKey resultType="int" keyProperty="id" order="AFTER"> SELECT LAST_INSERT_ID() </selectKey> insert into User (name,password) values (#{name},#{password}) </insert>

这种方法适合没有提供自增功能的数据库,例如Oracle。

属性名描述keyPropertyselectKey 语句结果应该被设置的目标属性。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。keyColumn匹配属性的返回结果集中的列名称。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。resultType结果的类型,MyBatis 通常可以推算出来。MyBatis 允许任何简单类型用作主键的类型,包括字符串。如果希望作用于多个生成的列,则可以使用一个包含期望属性的 Object 或一个 Map。order可为BEFORE 或 AFTER。如果是 BEFORE,那么它会先执行selectKey设置 keyProperty 然后执行插入语句。如果为AFTER则相反。statementType使用何种语句类型,默认PREPARED。 有STATEMENT,PREPARED 和 CALLABLE 语句的映射类型。

Service类中的写法(简写):

先来错误的示范:

public int insUser(User user){ return mapper.insUser(user); }

错误原因在于MyBatis的insert语句总是返回受影响的行数,因此插入成功的话一直都是返回1,我在这个地方一直卡着,也是醉了。

正确的做法是:

public int insUser(User user){ mapper.insUser(user); return user.getId(); }

MyBatis会将自增的属性直接映射到对象中,直接调用对象的get方法即可。

最新回复(0)