Mybatis的幾種傳參方式,你瞭解嗎?

愛撒謊的男孩發表於2020-09-23

持續原創輸出,點選上方藍字關注我

目錄

  • 前言
  • 單個引數
  • 多個引數
    • 使用索引【不推薦】
    • 使用@Param
    • 使用Map
    • POJO【推薦】
  • List傳參
  • 陣列傳參
  • 總結

前言

  • 前幾天恰好面試一個應屆生,問了一個很簡單的問題:你瞭解過Mybatis中有幾種傳參方式嗎?
  • 沒想到其他問題回答的很好,唯獨這個問題一知半解,勉強回答了其中兩種方式。
  • 於是這篇文章就來說一說Mybatis傳參的幾種常見方式,給正在面試或者準備面試的朋友鞏固一下。

單個引數

  • 單個引數的傳參比較簡單,可以是任意形式的,比如#{a}#{b}或者#{param1}但是為了開發規範,儘量使用和入參時一樣
  • Mapper如下:
UserInfo selectByUserId(String userId);
  • XML如下:
<select id="selectByUserId" resultType="cn.cb.demo.domain.UserInfo">
        select * from user_info where user_id=#{userId} and status=1
  </select>

多個引數

  • 多個引數的情況下有很多種傳參的方式,下面一一介紹。

使用索引【不推薦】

  • 多個引數可以使用類似於索引的方式傳值,比如#{param1}對應第一個引數,#{param2}對應第二個引數.......
  • Mapper方法如下:
UserInfo selectByUserIdAndStatus(String userId,Integer status);
  • XML如下:
<select id="selectByUserIdAndStatus" resultType="cn.cb.demo.domain.UserInfo">
        select * from user_info where user_id=#{param1} and status=#{param2}
    </select>
  • 注意:由於開發規範,此種方式不推薦開發中使用。

使用@Param

  • @Param這個註解用於指定key,一旦指定了key,在SQL中即可對應的key入參。
  • Mapper方法如下:
UserInfo selectByUserIdAndStatus(@Param("userId") String userId,@Param("status") Integer status);
  • XML如下:
<select id="selectByUserIdAndStatus" resultType="cn.cb.demo.domain.UserInfo">
        select * from user_info where user_id=#{userId} and status=#{status}
    </select>

使用Map

  • Mybatis底層就是將入參轉換成Map,入參傳Map當然也行,此時#{key}中的key就對應Map中的key
  • Mapper中的方法如下:
UserInfo selectByUserIdAndStatusMap(Map<String,Object> map);
  • XML如下:
<select id="selectByUserIdAndStatusMap" resultType="cn.cb.demo.domain.UserInfo">
        select * from user_info where user_id=#{userId} and status=#{status}
    </select>
  • 測試如下:
@Test
    void contextLoads() {
        Map<String,Object> map=new HashMap<>();
        map.put("userId","1222");
        map.put("status",1);
        UserInfo userInfo = userMapper.selectByUserIdAndStatusMap(map);
        System.out.println(userInfo);
    }

POJO【推薦】

  • 多個引數可以使用實體類封裝,此時對應的key就是屬性名稱,注意一定要有get方法。
  • Mapper方法如下:
UserInfo selectByEntity(UserInfoReq userInfoReq);
  • XML如下:
<select id="selectByEntity" resultType="cn.cb.demo.domain.UserInfo">
        select * from user_info where user_id=#{userId} and status=#{status}
    </select>
  • 實體類如下:
@Data
public class UserInfoReq {
    private String userId;
    private Integer status;
}

List傳參

  • List傳參也是比較常見的,通常是SQL中的in
  • Mapper方法如下:
List<UserInfo> selectList( List<String> userIds);
  • XML如下:
<select id="selectList" resultMap="userResultMap">
        select * from user_info where status=1
        and user_id in
        <foreach collection="list" item="item" open="(" separator="," close=")" >
            #{item}
        </foreach>
    </select>

陣列傳參

  • 這種方式類似List傳參,依舊使用foreach語法。
  • Mapper方法如下:
List<UserInfo> selectList( String[] userIds);
  • XML如下:
<select id="selectList" resultMap="userResultMap">
        select * from user_info where status=1
        and user_id in
        <foreach collection="array" item="item" open="(" separator="," close=")" >
            #{item}
        </foreach>
    </select>

總結

  • 以上幾種傳參的方式在面試或者工作中都會用到,不瞭解的朋友可以收藏下。
  • Mybatis專題文章寫到這裡也算是到了尾聲,後期準備再寫寫Mybatis的面經,如果覺得作者寫的不錯,歡迎關注分享。

相關文章