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

本文介绍在MyBatis中使用两种不同的方法实现主键的自动生成,一种适用于支持自增功能的数据库如MySQL,另一种适用于不支持自增功能的数据库如Oracle,并给出具体的XML配置示例及Service层实现。

环境: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。

属性名描述
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方法即可。

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值