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>
果然还是要多遇上几次坑才行
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>
```
果然还是要多遇上几次坑才行