Mybatis如何通過出入Map參數作為條件進行查詢

通過出入Map參數作為條件進行查詢

映射文件中查詢語句部分:

<!--通過map進行條件查詢-->
<select id="selectByMap" resultType="com.heiketu.testpackage.pojo.Product">
    select * from Products where prod_price = #{prodPrice} and prod_desc = #{prodDesc}
</select>

接口文件中對應的查詢方法:

//輸入參數為Map的條件查詢
Product selectByMap(Map<String,Object> map);

測試代碼:

//...前面有創建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語句#{}占位符中的值需要一一對應

在mybatis中,任何傳入的參數都會被對應封裝成Map集合,然後會以map的key=value形式取值。

對傳入的參數是List集合,mybatis會對list集合進行特殊處理,其取值方式通過list[下標]或collection[下標]的方式入參取值。

對於數組,Mybatis同樣會做特殊處理,它會對數組采用array[下標]的方式入參取值。

<!--如果是List集合(或set集合)就如下入參取值-->
<select id="selectByMap" resultType="com.heiketu.testpackage.pojo.Product">
    select * from Products where prod_price = #{list[0]} and prod_desc = #{collection[1]}
</select>
<!--如果是數組就如下入參取值-->
<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參數

使用場景

mybaits傳遞Map查詢數據,choose裡面的判斷根據自己的map參數類型自行使用,這裡傳的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一定要跟數據表字段保持一致。如果這裡的${K}寫成瞭#{K}則生成的sql語句如下所示:

程序不會報錯,條件無效。${}和#{}的區別相信大傢都瞭解,簡單概括就是一個是替換占位符,一個是當做參數傳入

傳參

    @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

查詢結果

總結:這樣的好處是參數的個數不固定、參數的類型不固定,適用的場景較多。缺點也很明顯map傳參可讀性差,參數難以控制等。以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。

推薦閱讀: