前言
在實(shí)際開(kāi)發(fā)中會(huì)遇到這種情況,就是一條數(shù)據(jù)需要判斷是新增還是更新,正常的開(kāi)發(fā)思路是先去查詢這條數(shù)據(jù)的Id是否已經(jīng)存在于數(shù)據(jù)庫(kù)私恬,存在就是update,否則為insert重虑,mybatis也是基于這樣的思想實(shí)現(xiàn)的践付,下面就舉個(gè)例子看一下秦士。
具體實(shí)現(xiàn)
比如缺厉,前臺(tái)將一條教師的信息保存到教師的實(shí)體bean中,然后需要將這條信息保存到數(shù)據(jù)庫(kù)中隧土,這時(shí)需要判斷一下教師信息是要update還是insert提针。
教師信息實(shí)體bean如下:
public class Teacher {
private int teacherId;//教師Id
private String teacherName;//教師名
private int count;//mybatis判斷Id是否存在
public int getTeacherId() {
return teacherId;
}
public void setTeacherId(int teacherId) {
this.teacherId = teacherId;
}
public String getTeacherName() {
return teacherName;
}
public void setTeacherName(String teacherName) {
this.teacherName = teacherName;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}
可以看到在實(shí)體bean中除了正常的教師信息外多了一count,它就是mybatis用來(lái)判斷teacherId是否存在曹傀,如果存在就會(huì)將存在的個(gè)數(shù)保存到count中辐脖,當(dāng)然一般Id都是主鍵,所有count也就一般都是1皆愉。下邊看一下mybatis的映射文件嗜价。
<insert id="AddTeacher" parameterType="com.mycompany.entity.Teacher">
<selectKey keyProperty="count" resultType="int" order="BEFORE">
select count(*) from Teacher where teacher_id = #{teacherId}
</selectKey>
<if test="count > 0">
update event
<set>
<if test="teacherName!= null" >
teacher_name= #{teacherName},
</if>
</set>
<where>
teacher_id = #{teacherId}
</where>
</if>
<if test="count==0">
insert into teacher(teacher_id,teacher_name) values (#{teacherId},#{teacherName})
</if>
</insert>
可以看到mybatis的實(shí)現(xiàn)思路也是先查詢Id是否存在,在根據(jù)count判斷是insert還是update幕庐。
說(shuō)明
1.實(shí)現(xiàn)原理是selectKey做第一次查詢久锥,然后根據(jù)結(jié)果進(jìn)行判斷,所以這里的order="BEFORE"是必須的异剥,也是因BEFORE瑟由,所以沒(méi)法通過(guò)<bind>標(biāo)簽來(lái)臨時(shí)存儲(chǔ)中間的值,只能在入?yún)⒅性黾訉傩詠?lái)存放冤寿。
2.就上面這個(gè)例子而言歹苦,就要求實(shí)體類中包含count屬性(可以是別的名字)青伤。否則selectKey的結(jié)果沒(méi)法保存,如果入?yún)⑹莻€(gè)Map類型殴瘦,就沒(méi)有這個(gè)限制狠角。
3.這種方式只是利用了selectKey會(huì)多執(zhí)行一次查詢來(lái)實(shí)現(xiàn)的,但是如果你同時(shí)還需要通過(guò)selectKey獲取序列或者自增的id蚪腋,就會(huì)麻煩很多(oracle麻煩擎厢,其他支持自增的還是很容易),例如我在上一篇中利用selectKey 獲取主鍵Id辣吃。
4.建議單獨(dú)查看學(xué)習(xí)一下selectKey的用法动遭。