1、mybatis中,selectKey不能多个使用,否则会报错。
Mapped Statements collection already contains XXXX insert!selectKey
2、selectKey是为了解决自增的ID,然后直接返回插入的结果的。 (我的个人理解)
在befor之前,可以封装一些数据进sql
那么问题来了:
有这么业务场景:
1、ID不自增,使用UUID
2、还要返回insert的结果
于是,开始是这样写的:
<insert id="insert">
<selectKey resultType="string" keyProperty="announceId" order="BEFORE">
<![CDATA[ SELECT UPPER(REPLACE(UUID(),'-','')) AS announceId]]>
</selectKey>
<selectKey keyProperty="announceId" order="AFTER" resultType="String">
select last_insert_id()
</selectKey>
<![CDATA[
INSERT INTO tbl_notify_announce (
announce_id ,
notify_id ,
send_userid ,
receive_userid ,
sendtime ,
subject ,
content ,
has_read ,
create_time ,
isdelete
) VALUES (
#{announceId} ,
#{announceId} ,
#{sendUserid} ,
#{receiveUserid} ,
#{sendtime} ,
#{subject} ,
#{content} ,
#{hasRead} ,
#{createTime} ,
#{isdelete}
)
]]>
</insert>
这样就挂了。 因为出现了两个seleKey
解决办法:
mybatis的xml,我的理解其实就是拼接封装进sql语句。 何必不直接把insert的值用mysql的函数解决?
这么多年过去了,其实mybatis玩来玩去,也没改变sql的东西,只是方便拼装罢了。
于是,可以改成这样:
<insert id="insert">
<selectKey keyProperty="announceId" order="AFTER" resultType="String">
select last_insert_id()
</selectKey>
<![CDATA[
INSERT INTO tbl_notify_announce (
announce_id ,
notify_id ,
send_userid ,
receive_userid ,
sendtime ,
subject ,
content ,
has_read ,
create_time ,
isdelete
) VALUES (
UPPER(REPLACE(UUID(),'-','')) ,
UPPER(REPLACE(UUID(),'-','')) ,
#{sendUserid} ,
#{receiveUserid} ,
#{sendtime} ,
#{subject} ,
#{content} ,
#{hasRead} ,
#{createTime} ,
#{isdelete}
)
]]>
</insert>