foreach
另外一个动态 SQL 通用的必要操作是迭代一个集合, 通常是构建在 IN 条件中的。 比如:
<select id="selectPostIn" resultType="domain.blog.Post"> SELECT * FROM POST P WHERE ID in <foreach item="item" index="index" collection="list" open="(" separator="," close=")"> #{item} </foreach> </select>
foreach 元素是非常强大的,它允许你指定一个集合,声明集合项和索引变量,它们可 以用在元素体内。它也允许你指定开放和关闭的字符串,在迭代之间放置分隔符。这个元素 是很智能的,它不会偶然地附加多余的分隔符。
注意 你可以传递一个 List 实例或者数组作为参数对象传给 MyBatis。当你这么做的时 候,MyBatis 会自动将它包装在一个 Map 中,用名称在作为键。List 实例将会以“list” 作为键,而数组实例将会以“array”作为键。
这个部分是对关于 XML 配置文件和 XML 映射文件的而讨论的。下一部分将详细讨论 Java API,所以你可以得到你已经创建的最有效的映射。
/**根据 角色用户 ids 查询角色和用户
* @param roleIds* @return
* @throws BaseException
*/
@SuppressWarnings("unchecked")
public List<Role> findRoleByIds(String roleIds)throws BaseException {
List<String> ids = java.util.Arrays.asList(roleIds.split(","));
Map<String, List<String>> map= new HashMap<String, List<String>>();
map.put("roleIds", ids);
return this.getSqlSession().selectList("findRoleByIds", map);
}
<!-- 根据部门Id获取部门经理角色 -->
<select id="findRoleByIds"
parameterType="map"
resultType="com.broadtext.commonsys.security.dao.Role">
select *
from(
select sr.ID as id, sr.ROLE_NAME as roleName from Sys_Role sr
union
select su.ID as id, su.true_name as roleName from Sys_User su
) r
where 1=1
<if test="roleIds != null and roleIds != ''">
and r.id in
<foreach collection="roleIds" open="(" close=")" separator="," item="roleId">
#{roleId}
</foreach>
</if>
</select>