1.处理批量查询:[]treeId

  • and tree_id in:注意这里后面没有括号,也没有值。因为接下来的 <foreach> 标签会负责生成 ('A', 'B', 'C') 这一坨东西拼在后面。

  • collection="array"

    • 这是数据源。因为你的 Java 接口参数是 String[] treeIds(数组),MyBatis 默认把数组参数命名为 array
    • 注:如果是 List,这里通常写 list
  • item="treeId"

    • 给当前循环到的元素起个别名,叫 treeId
  • #{treeId}

    • 这是循环体。取出当前元素的值,并使用预编译(PreparedStatement, 即 ? 占位符)的方式填进去。
  • 遍历 List/Array 时:index0, 1, 2… (序号)。

  • 遍历 Map 时:indexMap 的 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>