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的面經,如果覺得作者寫的不錯,歡迎關注分享。