使用场景
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传参可读性差,参数难以控制等