mybatis遍历map并执行多个select语句

mybatis iterate through map and execute multiple select statements

我想传入一个map,用mybatis遍历map并执行多个select语句,将结果收集到一个map中。这可能吗?下面执行一个 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>

所写的类似内容将不起作用,% 必须是绑定参数的一部分。我会做这样的事情:

<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 ?

我很确定这行不通。

Selects 之间的分隔符必须是;。如果您的数据库允许多个命令语句。

如果您只使用输入映射中的键,那么最好只传递 keySet()

最终,我会写一个 select 来 return 一个 Map: key => count:

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 替换为您的 DB 方言使用的等效结构。