mybatis标签selectkey无法返回主键值

selectkey标签无法返回主键值

 

selectkey标签属性解读

标签 属性
keyProperty selectKey 语句结果应该被设置的目标属性。
resultType 结果的类型。MyBatis 通常可以算出来,但是写上也没有问题。MyBatis 允许任何简单类型用作主键的类型,包括字符串。
order 这可以被设置为 BEFORE 或 AFTER。如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句。如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素-这和如 Oracle 数据库相似,可以在插入语句中嵌入序列调用。
 

这里是我的mapper接口

 
  1. @Mapper
  2. public interface BenefitRegisterMapper {
  3. int insert(@Param("pojo") BenefitRegister pojo);
  4. }
 

这里是我的mapper.xml文件的配置

 
  1. <insert id="insert">
  2. <selectKey keyProperty="id" order="AFTER" resultType="Long">
  3. SELECT LAST_INSERT_ID()
  4. </selectKey>
  5. INSERT INTO benefit_register
  6. <trim prefix="(" suffix=")" suffixOverrides=",">
  7. <if test="pojo.name != null">name,</if>
  8. <if test="pojo.detailId != null">detail_id,</if>
  9. <if test="pojo.detailName != null">detail_name,</if>
  10. <if test="pojo.type != null">type,</if>
  11. <if test="pojo.status != null">status,</if>
  12. <if test="pojo.startTime != null">start_time,</if>
  13. <if test="pojo.endTime != null">end_time,</if>
  14. <if test="pojo.creatorLdap != null">creator_ldap,</if>
  15. <if test="pojo.creatorName != null">creator_name,</if>
  16. <if test="pojo.createTime != null">create_time,</if>
  17. <if test="pojo.updateTime != null">update_time,</if>
  18. <if test="pojo.deleted != null">deleted,</if>
  19. </trim>
  20. VALUES
  21. <trim prefix="(" suffix=")" suffixOverrides=",">
  22. <if test="pojo.name != null">#{pojo.name},</if>
  23. <if test="pojo.detailId != null">#{pojo.detailId},</if>
  24. <if test="pojo.detailName != null">#{pojo.detailName},</if>
  25. <if test="pojo.type != null">#{pojo.type},</if>
  26. <if test="pojo.status != null">#{pojo.status},</if>
  27. <if test="pojo.startTime != null">#{pojo.startTime},</if>
  28. <if test="pojo.endTime != null">#{pojo.endTime},</if>
  29. <if test="pojo.creatorLdap != null">#{pojo.creatorLdap},</if>
  30. <if test="pojo.creatorName != null">#{pojo.creatorName},</if>
  31. <if test="pojo.createTime != null">#{pojo.createTime},</if>
  32. <if test="pojo.updateTime != null">#{pojo.updateTime},</if>
  33. <if test="pojo.deleted != null">#{pojo.deleted},</if>
  34. </trim>
  35. </insert>

然后就一直是自增主键的值返回不来,最后才发现是selectkey的keyproperty属性写错了,应该是配置的实体类别名pojo加.id才对,如果不起别名的话直接写id也对,最后我把selectKey标签写成如下便成功实现了功能

 
  1. <selectKey keyProperty="pojo.id" order="AFTER" resultType="Long">
  2. SELECT LAST_INSERT_ID()
  3. </selectKey>

果然还是要多遇上几次坑才行

PS:

<!-- 还有一点需要注意的是不同的数据库生产商生成主键的方式不一样,有些是预先生成 (pre-generate)主键的,如Oracle和PostgreSQL。 
有些是事后生成(post-generate)主键的,如MySQL和SQL Server 所以如果是Oracle数据库,则需要将selectKey写在insert之前 -->

# selectkey标签无法返回主键值

## selectkey标签属性解读
| 标签 | 属性 |
|:-: | :-:|
|keyProperty|selectKey 语句结果应该被设置的目标属性。|
|resultType|结果的类型。MyBatis 通常可以算出来,但是写上也没有问题。MyBatis 允许任何简单类型用作主键的类型,包括字符串。|
|order|这可以被设置为 BEFORE 或 AFTER。如果设置为 BEFORE,那么它会首先选择主键,设置 keyProperty 然后执行插入语句。如果设置为 AFTER,那么先执行插入语句,然后是 selectKey 元素-这和如 Oracle 数据库相似,可以在插入语句中嵌入序列调用。|

## 这里是我的mapper接口

```
@Mapper
public interface BenefitRegisterMapper {

int insert(@Param("pojo") BenefitRegister pojo);
}
```

## 这里是我的mapper.xml文件的配置
```
<insert id="insert">
<selectKey keyProperty="id" order="AFTER" resultType="Long">
SELECT LAST_INSERT_ID()
</selectKey>
INSERT INTO benefit_register
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="pojo.name != null">name,</if>
<if test="pojo.detailId != null">detail_id,</if>
<if test="pojo.detailName != null">detail_name,</if>
<if test="pojo.type != null">type,</if>
<if test="pojo.status != null">status,</if>
<if test="pojo.startTime != null">start_time,</if>
<if test="pojo.endTime != null">end_time,</if>
<if test="pojo.creatorLdap != null">creator_ldap,</if>
<if test="pojo.creatorName != null">creator_name,</if>
<if test="pojo.createTime != null">create_time,</if>
<if test="pojo.updateTime != null">update_time,</if>
<if test="pojo.deleted != null">deleted,</if>
</trim>
VALUES
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="pojo.name != null">#{pojo.name},</if>
<if test="pojo.detailId != null">#{pojo.detailId},</if>
<if test="pojo.detailName != null">#{pojo.detailName},</if>
<if test="pojo.type != null">#{pojo.type},</if>
<if test="pojo.status != null">#{pojo.status},</if>
<if test="pojo.startTime != null">#{pojo.startTime},</if>
<if test="pojo.endTime != null">#{pojo.endTime},</if>
<if test="pojo.creatorLdap != null">#{pojo.creatorLdap},</if>
<if test="pojo.creatorName != null">#{pojo.creatorName},</if>
<if test="pojo.createTime != null">#{pojo.createTime},</if>
<if test="pojo.updateTime != null">#{pojo.updateTime},</if>
<if test="pojo.deleted != null">#{pojo.deleted},</if>
</trim>
</insert>
```

然后就一直是自增主键的值返回不来,最后才发现是selectkey的keyproperty属性写错了,应该是配置的实体类别名pojo加.id才对,如果不起别名的话直接写id也对,最后我把selectKey标签写成如下便成功实现了功能
```
<selectKey keyProperty="pojo.id" order="AFTER" resultType="Long">
SELECT LAST_INSERT_ID()
</selectKey>
```
果然还是要多遇上几次坑才行

猜你喜欢

转载自www.cnblogs.com/myblogs-miller/p/9210053.html