數據庫修改語句包括 insert,update 和 delete三種,它們的實現非常接近,看一下insert標簽有哪些屬性:
delete標簽的屬性:
update標簽的屬性:
可以看到,三種標簽的屬性非常接近,delete和update基本一樣,insert相比其它兩種多了幾個標簽,下面會詳細介紹。
增刪改標簽屬性
增刪改語句的標簽的屬性中:
id和parameterType的意思不用說,作用于前面的select的id和parameterType屬性一樣。
flushCache后面介紹緩存會細說。
timeout與statementType和前面select中的作用也一樣。
useGeneratedKeys用來獲取主鍵,有時候主鍵是數據庫自增生成的,并不是新增時作為參數傳入的,這種情況如果想獲取需要使用這個屬性。keyProperty,唯一標記一個屬性,MyBatis 會通過 getGeneratedKeys 的返回值或者通過 insert 語句的 selectKey 子元素設置它的鍵值。如果希望得到多個生成的列,也可以是逗號分隔的屬性名稱列表。
keyColumn,通過生成的鍵值設置表中的列名,這個設置僅在某些數據庫(像 PostgreSQL)是必須的,當主鍵列不是表中的第一列的時候需要設置。如果希望使用多個生成的列,也可以設置為逗號分隔的屬性名稱列表。
上面基本介紹了增刪改所有的屬性,下面是詳細信息:
注意增刪改默認返回的都是影響的行數,因此回參類型默認都是int,通過上面的介紹可以大致了解,下面通過幾個例子來看如何使用。
示例1:簡單新增
先來看一個簡單的新增功能:
傳過來的是一個user對象,里面包含了id和name兩個屬性,分別插入到數據庫的id和name兩個字段中。上面的例子很簡單,來看一下接口:
入參類型是User,回參是新增的行數,因此是Integer。SQL語句的寫法基本上和數據庫中的寫法沒什么區別,因此只要把值替換為mybatis的參數即可。
示例2:新增獲取自增id
如前所述,插入語句的配置規則更加豐富,在插入語句里面有一些額外的屬性和子元素用來處理主鍵的生成,而且有多種生成方式。如果你的數據庫支持自動生成主鍵的字段(比如 MySQL 和 SQL Server設置id為自增長主鍵),那么你可以設置 useGeneratedKeys=”true”,然后再把 keyProperty 設置到目標屬性id上就 OK 了。例如:
id改為自增以后,新增語句就不用傳入id了。其它的地方不變,只需要在標簽里加上兩個屬性,就可以在新增完后,獲取id的值。接口的寫法也是一樣的:
在調用接口的時候可以這樣獲取id:
可以看到我們新建的user對象并沒有設置id的值,但是傳入并執行mybatis的insert方法后,user對象里面的id就被賦值了。調用方法:
執行結果:
通過這種方式就可以獲取數據庫自動生成的主鍵值。對于不支持自動生成類型的數據庫或可能不支持自動生成主鍵的 JDBC 驅動,MyBatis 有另外一種方法來生成主鍵。這里有一個簡單的示例,它可以生成一個隨機 ID(你最好不要這么做,但這里展示了 MyBatis 處理問題的靈活性及其所關心的廣度):
上面的新增語句中,insert標簽和下面的insert into語句并沒有什么不同,只不過標簽內部開始的位置加了一個selectKey標簽,這個標簽內有一個select語句,這個語句的執行順序為 order="BEFORE",就是在下面的insert之前執行。keyProperty="id"表示查詢的結果會賦值到id上面,結果類型為int。這一種簡單的通過mybatis生成id的方法,當然現實中我們完全可以利用uuid或者雪花算法等等先生成,再傳入進來。所以最好不要使用這種方式。下面是selectKey標簽屬性的介紹:
示例3:update
來看一個更新語句的簡單例子:
接口定義:
簡單的根據主鍵更新字段就像上面這樣。還有一種情況就是根據舊主鍵修改為新主鍵,這時候就要用專門的字段區分舊主鍵和新主鍵了。
示例4:delete
看一個刪除的例子:
接口定義:
無論刪除和更新一條還是多條,比較insert都要簡單一些。