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

环境: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: 是否自动生成主键,默认false
  • keyProperty :返回的主键值赋给哪个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。

属性名 描述
keyProperty selectKey 语句结果应该被设置的目标属性。如果希望得到多个生成的列,也可以是逗号分隔的属性名称列表。
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方法即可。

你可能感兴趣的:(MyBatis)