事情情景
在做一個插入操作的時候,總是報一個主鍵重復或者字段不能為空的錯誤:
原因
在A.mapper中的insert語句中,使用了useGeneratedKeys,keyProperty屬性,那這兩個屬性是干什么用的呢?
useGeneratedKeys=true表示使用數據庫自動增長的主鍵
keyProperty設置自增主鍵返回字段(用戶在插入數據之后獲取相應主鍵)
作用
知道了這兩個屬性是做什么的,那起到什么作用了呢?
作用: 完成不需要輸入主鍵也能插入數據了,而且只適用於insert語句
解決方法
知道了是什么原因造成了這個問題,那么接下來就好解決了。
首先先檢查了數據庫中這個id字段有沒有設置為自增長和非空
然后又去與A.mapper相關聯的另一個B.mapper中查看相應的插入語句有沒有設置這兩個屬性,果然沒寫,寫上之后完美解決問題。
<insert id="insertSelective" parameterType="com.***.UserPasswordDO" keyProperty="id" useGeneratedKeys="true">
規則
1、我們使用keyProperty屬性指定id為主鍵字段,同時使用useGeneratedKeys屬性告訴MyBatis這個主鍵是否使用數據庫的內置規則生成。
2、在數據庫中設置id的自增規則
拓展
在使用keyProperty的時候,發現竟然還有個類似的屬性:keyColumn,那么他是干什么用的呢?
keyColumn用於指定數據庫table中的主鍵
也就是說這是三個屬性同時使用時,則可以使用數據庫中自增長的主鍵,並且可以將主鍵的值返回給keyProperty中寫好的字段
總結:
useGeneratedKeys 設置為"true"表明要 MyBatis 獲取由數據庫自動生成的主鍵;
keyProperty="id"指定把獲取到的主鍵值注入到 Student(實體類) 的 id 屬性。
keyColumn是數據庫中主鍵名,如果數據庫主鍵名和實體類字段名都規范,可以不用keyColumn