1.处理批量查询:[]treeId
-
and tree_id in:注意这里后面没有括号,也没有值。因为接下来的<foreach>标签会负责生成('A', 'B', 'C')这一坨东西拼在后面。 -
collection="array":- 这是数据源。因为你的 Java 接口参数是
String[] treeIds(数组),MyBatis 默认把数组参数命名为array。 - 注:如果是
List,这里通常写list。
- 这是数据源。因为你的 Java 接口参数是
-
item="treeId":- 给当前循环到的元素起个别名,叫
treeId。
- 给当前循环到的元素起个别名,叫
-
#{treeId}:- 这是循环体。取出当前元素的值,并使用预编译(PreparedStatement, 即
?占位符)的方式填进去。
- 这是循环体。取出当前元素的值,并使用预编译(PreparedStatement, 即
-
遍历 List/Array 时:
index是 0, 1, 2… (序号)。 -
遍历 Map 时:
index是 Map 的 Key。 -
这里没用到 item
<select id="queryRuleLocks" resultMap="dataMap">
select tree_id, rule_value
from rule_tree_node where rule_key = 'rule_lock' and tree_id in
<foreach item="treeId" index="index" collection="array" open="(" separator="," close=")">
#{treeId}
</foreach>
</select>SELECT tree_id, rule_value
FROM rule_tree_node
WHERE rule_key = 'rule_lock'
AND tree_id IN ('tree_101', 'tree_102', 'tree_103');2.输入对象为 PO(映射数据库表) 对象
parameterType 的作用就是把这两者锁死: 它告诉 XML 里的 SQL 语句:“放心吧,传进来的参数一定是 cn.bugstack... 这个包下的 RaffleActivityAccountDay 类的一个实例。”
<select id="queryActivityAccountDayPartakeCount" parameterType="cn.bugstack.infrastructure.persistent.po.RaffleActivityAccountDay" resultType="java.lang.Integer">
select day_count - day_count_surplus
from raffle_activity_account_day where user_id = #{userId} and activity_id = #{activityId} and day = #{day}
</select>