我想传入一张地图并使用mybatis迭代地图并执行多个select语句并在地图中收集结果。这可能吗?下面将AND作为一个查询。
<select id="populate" parameterType="Map" resultType="hashmap">
<foreach collection="dataMap" index="key" item="value" open=""
separator=" and " close="">
select count(*) as countS from tabl where
id LIKE #{key,jdbcType=VARCHAR} || '%'
</foreach>
</select>
答案 0 :(得分:1)
编写的内容不起作用,%必须是绑定参数的一部分。我会做这样的事情:
<bind name="currentKey" value = 'key + "%"' />
id LIKE #{currentKey,jdbcType=VARCHAR}
编辑:关于LIKE,我已经给出了最常见的答案,我发现其他帖子说明您的方法有效,甚至可能更好的安全性(注入),因为%不是绑定参数的一部分。
%被视为字符串的一部分还是运算符?
它会产生相同的效果吗?结果相同?性能相同? (如果可以从LIKE中获得表现)。
如果参数映射中有2个键,则生成的SQL将为:
SELECT COUNT(*) AS countS FROM tabl WHERE id LIKE ?
AND
SELECT COUNT(*) AS countS FROM tabl WHERE id LIKE ?
我很确定这不起作用。
选择之间的分隔符必须为;
。如果您的数据库允许多个命令语句。
如果您只使用输入Map中的键,那么最好只传递keySet()
最后,我会编写一个返回单个Map的选择:key =&gt;数:
SELECT
<foreach collection="dataMap.keySet()" value="key", separator=", ">
<bind name="currentKey" value = 'key + "%"' />
SUM(CASE WHEN id LIKE #{currentKey,jdbcType=VARCHAR} THEN 1 ELSE 0 END) AS count_${key}
</foreach>
FROM tabl
当然,将 CASE WHEN 替换为数据库方言使用的等效结构。