首頁 > 軟體

SpringBoot使用MyBatis時的幾種傳參規範範例

2022-02-20 13:00:51

使用Mybatis作為持久層框架時,對於資料庫的增刪改查等操作都需要引數的傳遞,這裡學習記錄一下MyBatis中可用的引數傳遞方式。

1. 單個簡單引數傳遞

使用 MyBatis 傳遞單個引數時比較簡單,形式如#{a},#{b},#{param1}等都可以在 MyBatis 中獲取到唯一引數,但是引數名儘量和入參名一致,這樣更符合開發規範。

Mapper 檔案定義

UserInfo selectById(String userId);

xml 檔案定義

  • 單個引數時,標籤中可不定義引數型別
<select id="selectByUserId" resultType="com.shone.entity.UserInfo">
    select user_id, user_name from user_info where user_id=#{userId}
</select>

2. 匿名引數順序傳遞

匿名引數傳遞時使用的是 MyBatis 中索引傳遞的方式,對於傳遞的多個引數,在sql語句標籤中使用#{param1}#{param2}等索引依次代表傳入的引數值。

Mapper 檔案

  • 使用匿名引數傳遞時,介面中定義的方法引數無需使用註解
UserInfo selectByNameAndAge(String userName, Integer age);

xml 檔案

  • xml中讀取引數時可以使用使用arg0, arg1, param1, param2等形式
  • 引數有多個型別且匿名,因此不需要指定入參型別
  • Mapper中沒有使用註解,因此直接使用引數名時會報錯引數名找不到
<select id="selectByNameAndAge" resultType="com.shone.entity.UserInfo">
    select user_id, user_name from user_info where user_name=#{param1} and user_gender=#{param2}
</select>
  • 匿名引數傳遞方法可讀性差,對後期維護不友好,不符合開發規範。

3. 使用@Param註解傳遞

@Param註解用於指定key,指定了key之後,在sql標籤中可以使用key來索引對應的引數值。

Mapper 檔案

  • 介面中定義時使用 @Param註解指定引數對應的key
UserInfo selectByNameAndAge(@Param("userName") String userName, @Param("age") Integer age);

xml 檔案

  • 不需要指定傳入引數型別
  • 使用註解指定的key就可以獲取到對應入參值
<select id="selectByNameAndAge" resultType="com.shone.entity.UserInfo">
    select user_id, user_name from user_info where user_name=#{userName} and user_gender=#{age}
</select>

@Param註解傳參使用時清晰簡潔明瞭,符合開發規範,在引數較少時建議使用該方式。

4. 使用Map傳遞引數

MyBatis框架底層就是將入參轉換成Map型別進行傳遞的,因此我們也可以使用Map進行引數的傳遞,傳入的引數在sql標籤中可以根據Map中的key值直接獲取。

使用時,需要將傳入的引數放入到map中

  map.put("userName","tom");
  map.put("gender",1);

Mapper 檔案

UserInfo selectByNameAndAge(Map<String, Object> map);

xml 檔案

  • 入參型別指定為Map
<select id="selectByNameAndAge" resultType="com.shone.entity.UserInfo" paramterType="map">
    select user_id, user_name from user_info where user_name=#{userName} and user_gender=#{age}
</select>

使用Map傳遞引數符合MyBatis底層的設計,效能也沒有問題,但是在開發中由於將所有值封裝成為map,無法直觀看到map中可能含有的引數,在後期維護上不太友好。

5. 使用JavaBean(POJO)傳遞

除了Map方式,還可以使用JavaBean的方式來傳遞多個引數,此時在sql標籤中直接使用bean物件的屬性來索引引數值,注意bean物件中 需要有相應引數的get方法,否則無法正常獲取。

使用javabean作為引數,需要先定義JavaBean

@Data
public class UserInfo {
  private String userName;
  private Integer age;
}

Mapper 檔案

UserInfo selectByEntity(UserInfo userInfo);

xml 檔案

  • 指定入參型別為相應的JavaBean全路徑限定類名
<select id="selectByNameAndAge" resultType="com.shone.entity.UserInfo" paramterType="com.shone.entity.UserInfo">
    select user_id, user_name from user_info where user_name=#{userName} and user_gender=#{age}
</select>

JavaBean的引數傳遞方式更符合專案開發的規範,實際使用時簡潔明瞭,在引數較多時建議使用這種方式,建立JavaBean來作為引數傳遞物件。

6. 使用List、Array、Set傳遞

List、Array、Set等方式的傳參通常用於sql標籤中的in操作,即用於MyBatis中的標籤。

使用list或array時,一般是做in操作,只有一個引數。

Mapper 檔案

UserInfo selectByIdList(List<String> userIdList);

xml 檔案

  • 不需要指定入參型別,或指定為List
  • 使用標籤處理sql中的in操作
  • 如果引數是list,則collection為list;如果引數型別是array,則collection是array
  • 如果是多個引數或者是物件的屬性值作為list,則傳參應為map/bean型別,collection應為物件屬性中的list
<select id="selectByIdList" resultMap="userResultMap">
    select * from user_info where status=1
    and user_id in
    <foreach collection="list" item="item" open="(" separator="," close=")">
        #{item}
    </foreach>
</select>

到此這篇關於SpringBoot使用MyBatis時的幾種傳參規範範例的文章就介紹到這了,更多相關SpringBoot MyBatis 傳參內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com