Mybatis如何通過出入Map參數(shù)作為條件進行查詢
通過出入Map參數(shù)作為條件進行查詢
映射文件中查詢語句部分:
<!--通過map進行條件查詢-->
<select id="selectByMap" resultType="com.heiketu.testpackage.pojo.Product">
? ? select * from Products where prod_price = #{prodPrice} and prod_desc = #{prodDesc}
</select>接口文件中對應(yīng)的查詢方法:
//輸入?yún)?shù)為Map的條件查詢 Product selectByMap(Map<String,Object> map);
測試代碼:
//...前面有創(chuàng)建sqlSessionFactory對象和SQLSession對象的代碼
Map<String,Object> map = new HashMap<>();
map.put("prodPrice","11.99");
map.put("prodDesc","18 inch teddy bear, comes with cap and jacket");
ProductsMapper mapper = sqlSession.getMapper(ProductsMapper.class);
Product product = mapper.selectByMap(map);
System.out.println(product);map中的key值與映射文件中的select語句#{}占位符中的值需要一一對應(yīng)
在mybatis中,任何傳入的參數(shù)都會被對應(yīng)封裝成Map集合,然后會以map的key=value形式取值。
對傳入的參數(shù)是List集合,mybatis會對list集合進行特殊處理,其取值方式通過list[下標]或collection[下標]的方式入?yún)⑷≈怠?/p>
對于數(shù)組,Mybatis同樣會做特殊處理,它會對數(shù)組采用array[下標]的方式入?yún)⑷≈怠?/p>
<!--如果是List集合(或set集合)就如下入?yún)⑷≈?->
<select id="selectByMap" resultType="com.heiketu.testpackage.pojo.Product">
? ? select * from Products where prod_price = #{list[0]} and prod_desc = #{collection[1]}
</select><!--如果是數(shù)組就如下入?yún)⑷≈?->
<select id="selectByMap" resultType="com.heiketu.testpackage.pojo.Product">
? ? select * from Products where prod_price = #{array[0]} and prod_desc = #{array[1]}
</select>Mybatis查詢傳遞Map參數(shù)
使用場景
mybaits傳遞Map查詢數(shù)據(jù),choose里面的判斷根據(jù)自己的map參數(shù)類型自行使用,這里傳的value是Object類型,這里用不到
<select id="getObjectByMap" parameterType="map" resultMap="BaseResultMap">
select
<include refid="Base_Column_List" />
from
s_app
<where>
<foreach collection="map" item="v" index="k" separator="and">
<if test="v != null and v != ''">
${k} = #{v}
</if>
<!--<choose>
<when test="v instanceof integer">
<if test="v != null">
${k} = #{v}
</if>
</when>
<when test="v instanceof list">
<if test="v != null and v.size() > 0">
${k} in
<foreach collection="list" item="v" separator="," open="(" close=")">
#{v}
</foreach>
</if>
</when>
<when test="v instanceof array">
<if test="v != null and v.length > 0">
${k} in
<foreach collection="array" item="v" separator="," open="(" close=")">
#{v}
</foreach>
</if>
</when>
<otherwise>
<if test="v != null and v != ''">
${k} = #{v}
</if>
</otherwise>
</choose>-->
</foreach>
</where>
</select>這里需要注意的一點是${K},首先map的key一定要跟數(shù)據(jù)表字段保持一致。如果這里的${K}寫成了#{K}則生成的sql語句如下所示:
![]()
程序不會報錯,條件無效。${}和#{}的區(qū)別相信大家都了解,簡單概括就是一個是替換占位符,一個是當做參數(shù)傳入
傳參
@PostMapping({"demo"})
public AjaxResult demo(String appNo, String name) {
Map map = Map.of("app_no", appNo, "cust_name", name);
SApp objectByMap = service.getObjectByMap(map);
return success(objectByMap);
}持久層
public interface SAppMapper extends BaseMapper<SApp> {
SApp getObjectByMap(@Param("map") Map<String, Object> map);
}生成sql

查詢結(jié)果

總結(jié):這樣的好處是參數(shù)的個數(shù)不固定、參數(shù)的類型不固定,適用的場景較多。缺點也很明顯map傳參可讀性差,參數(shù)難以控制等。以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
idea中增強for循環(huán)提示unexpected token問題
這篇文章主要介紹了idea中增強for循環(huán)提示unexpected token問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01
詳解SpringBoot構(gòu)建Docker鏡像的3種方式
這篇文章主要介紹了SpringBoot構(gòu)建Docker鏡像的3種方式,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-06-06

