方法1:使用replace關鍵字java
replace是insert的加強版,能夠實現插入的數據和已存在的數據發生主鍵或者惟一鍵重複,則刪除已存在的數據,再實現插入,若是不重複,則直接插入數據。數據庫
結合Mybatis批量處理,用法以下:性能
<update id="updateSchoolTable" useGeneratedKeys="true" parameterType="java.util.List">
<!-- 存在則更新,不存在則插入 -->
replace into
schoolTable(Id,describeDataForm,childrenID,relevanceID,showType)
values
<foreach collection="list" item="schoolDataForm" separator=",">
(
#{schoolDataForm.Id},
#{schoolDataForm.describeDataForm},
#{schoolDataForm.childrenID},
#{schoolDataForm.relevanceID},
#{schoolDataForm.showType}
)
</foreach>
</update>
方法2:使用ON DUPLICATE KEY UPDATEorm
該方法可以在主鍵或者惟一鍵重複時,修改原記錄中某字段的數據。索引
結合Mybatis批量處理,用法以下:it
<update id="updateSchoolTable" useGeneratedKeys="true" parameterType="java.util.List">
insert into
schoolTable(Id,describeDataForm,childrenID,relevanceID,showType)
values
<foreach collection="list" item="schoolDataForm" separator=",">
(
#{schoolDataForm.Id},
#{schoolDataForm.describeDataForm},
#{schoolDataForm.childrenID},
#{schoolDataForm.relevanceID},
#{schoolDataForm.showType}
)
</foreach>
<!--存在便可修改下述字段的數據,注意values()中的內容是數據表中相應的字段名-->
ON DUPLICATE KEY UPDATE
describeDataForm=values(describeDataForm),
childrenID=values(childrenID),
relevanceID=values(relevanceID),
showType=values(showType)
</update>
性能區別:io
正如replace底層實現所示,若是主鍵重複會先刪除數據庫中原來的記錄,插入新紀錄。可是數據庫刪除操做須要維護主鍵索引,這無疑須要消耗性能。class
ON DUPLICATE KET QPDATE只是在主鍵重複時修改所需字段的值,因此不影響主鍵。維護成本天然相對於replace低。效率
注意:在數據量較小時,二者效率大體相同,都很快,可是出現大量數據(百萬級別)時,差別就顯示出來了。date
---------------------