1. 程式人生 > 其它 >7. update標籤

7. update標籤

MyBatis update 標籤用於定義更新語句,執行更新操作。當 MyBatis 執行完一條更新語句後,會返回一個整數,表示受影響的資料庫記錄的行數。

下面我們通過一個示例演示 update 標籤的用法。

1. 在 WebsiteMapper.xml 中新增以下更新語句,程式碼如下。

<!--update 標籤-->
<update id="updateWebsite" parameterType="string">
update website set name = #{name}
</update>


2. 在 WebsiteMapper 介面中增加一個 updateWebsite() 方法,程式碼如下。

 
int updateWebsite(String name);

引數為 String 型別的字串;返回值為 int 型別,表示執行 sql 語句後受影響的記錄的行數。

3. 測試程式碼如下。

int i = websiteMapper.updateWebsite("C語言中文網");
System.out.println("共更新了 " + i + " 條記錄");

 

4.執行測試程式碼,控制檯輸出如下。

共更新了 9 條記錄

 

通過控制檯輸出可知,該更新語句執行後,共影響了 9 條資料庫記錄。

1.update 標籤常用屬性

update 標籤常用屬性如下表。

屬性名稱 描述 備註
id 它和 Mapper 的名稱空間組合起來使用,是唯一識別符號,供 MyBatis 呼叫  如果名稱空間+ id 不唯一,那麼 MyBatis 丟擲異常
parameterType 傳入 SQL 語句的引數型別的全限定名或別名,它是一個可選屬性。 支援基本資料型別和 JavaBean、Map 等複雜資料型別
flushCache 該屬性用於設定執行該操作後,是否會清空二級快取和本地快取,預設值為 true。 -
timeout 該屬性用於設定 SQL 執行的超時時間,如果超時,就拋異常。 -
statementType 執行 SQL 時使用的 statement 型別, 預設為 PREPARED,可選值:STATEMENT,PREPARED 和 CALLABLE。  -

注意:update 標籤中沒有 resultType 屬性,只有查詢操作才需要對返回結果型別進行相應的指定。

2.傳遞多個引數

在上面的示例中,我們在更新語句中只使用了一個 String 型別的引數,而在實際的開發過程中,大多數時候,我們的更新語句都需要使用多個引數,Mybatis 為我們提供以下 3 種方式,來實現給對映器傳遞多個引數:

  • 使用 Map 傳遞引數
  • 使用註解傳遞引數
  • 使用 JavaBean 傳遞引數

2.1 使用 Map 傳遞引數

我們可以將引數封裝到一個 Map 物件中,然後傳遞給 MyBatis 的對映器,示例如下。

1. 在 WebsiteMapper 介面中,定義一個 updateWebsiteByMap() 方法,並使用 Map 傳遞引數,程式碼如下。

int updateWebsiteByMap(Map<String, Object> params);

 

2. 在 WebsiteMapper.xml 使用 update 標籤定義一個 update 語句,並接收通過 Map 傳遞的引數,程式碼如下。

<!--更新語句接收 Map 傳遞的引數-->
<update id="updateWebsiteByMap" parameterType="map">
update website set name = #{name},url= #{url} where id = #{id}
</update>

 

3. 測試程式碼如下。

//使用 Map 向 update 標籤傳遞引數
Map<String, Object> params = new HashMap<>();
params.put("id", 1);
params.put("name", "程式設計幫");
params.put("url", "www.biancheng.net");
int i = websiteMapper.updateWebsiteByMap(params);
System.out.println("通過 Map 傳遞引數,共更新了 " + i + " 條記錄");

 

4. 執行測試程式碼,控制檯輸出如下。

通過 Map 傳遞引數,共更新了 1 條記錄

2.2 使用註解傳遞引數

我們還可以使用 MyBatis 提供的 @Param 註解給註解器傳遞引數,示例如下。

1. 在 WebsiteMapper 介面中,定義一個 updateWebsiteByParam() 方法,並使用 @Param 註解傳遞引數,方法如下。

int updateWebsiteByParam(@Param("name") String name, @Param("url") String url, @Param("id") Integer id);

 

2. 在 WebsiteMapper.xml 中使用 update 標籤定義一個 update 語句,並接收通過 @Param 註解傳遞的引數,配置如下。

<!--更新語句接收 @Param 註解傳遞的引數-->
<update id="updateWebsiteByParam">
update website set name = #{name},url= #{url} where id = #{id}
</update>

 

3. 測試程式碼如下。

 
// 使用@Param 註解傳遞引數到更新語句中
String name = "程式設計幫2";
String url = "www.biancheng.net";
Integer id = 2;
int i = websiteMapper.updateWebsiteByParam(name, url, id);
System.out.println("通過 @Param 註解傳遞引數,共更新了 " + i + " 條記錄");

4. 執行測試程式碼,控制檯輸出如下。

通過 @Param 註解傳遞引數,共更新了 1 條記錄

2.3 使用 JavaBean 傳遞引數

在引數過多的情況下,我們還可以將引數通過 setter 方法封裝到 JavaBean(實體類)物件中傳遞給對映器。

1. 在 WebsiteMapper 介面中,定義一個 updateWebsiteByJavaBean() 方法,並使用 JavaBean 傳遞引數,方法如下。

int updateWebsiteByJavaBean(Website website);

 

2. 在 WebsiteMapper.xml 中使用 update 標籤定義一個 update 語句,並接收通過 JavaBean 傳遞的引數,配置如下。

<!--更新語句接收 JavaBean 傳遞的引數-->
<update id="updateWebsiteByJavaBean" parameterType="net.biancheng.www.po.Website">
update website set name = #{name},url= #{url} where id = #{id}
</update>

 

3. 測試程式碼如下。

//使用 JavaBean 傳遞引數到更新語句中
Website website = new Website();
website.setName("程式設計幫3");
website.setUrl("www.biancheng.net");
website.setId(3);
int i = websiteMapper.updateWebsiteByJavaBean(website);
System.out.println("通過 JavaBean 傳遞引數,共更新了 " + i + " 條記錄");

 

4. 執行測試程式碼,控制檯輸出如下。

通過 JavaBean 傳遞引數,共更新了 1 條記錄

2.4 區別

以上 3 種方式的區別如下:

  • 使用 Map 傳遞引數會導致業務可讀性的喪失,繼而導致後續擴充套件和維護的困難,所以在實際應用中我們應該果斷廢棄該方式。
  • 使用 @Param 註解傳遞引數會受到引數個數的影響。當 n≤5 時,它是最佳的傳參方式,因為它更加直觀;當 n>5 時,多個引數將給呼叫帶來困難。
  • 當引數個數大於 5 個時,建議使用 JavaBean 方式。