mybatis迭代map并执行多个select语句

时间:2017-02-13 22:47:54

标签: java mybatis

我想传入一张地图并使用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>

1 个答案:

答案 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 替换为数据库方言使用的等效结构。