Mybatis中foreach的使用详解
作者:星空寻流年
一、foreach 属性使用
<foreach collection="list" index="index" item="mchntCd" open="(" close=")" separator=","> #{mchntCd} </foreach>
- item: 集合中元素迭代时的别名,该参数为必选,通过别名进行取值
- index:在list和数组中,index是元素的序号,在map中,index是元素的key,非必填
- open: foreach代码的开始符号,一般是(和close=")"合用。常用在in(),values()时。非必填
- separator:元素之间的分隔符,例如在in()的时候,separator=","会自动在元素中间用“,“隔开,避免手动输入逗号导致sql错误,如in(1,2,)这样。非必填
- close: foreach代码的关闭符号,一般是)和open="("合用。常用在in(),values()时。非必填
- collection: 要做foreach的对象,作为入参
- 传入是集合,也就是接口里面用的 List<String> nameList 那么 使用 collection = “list”
- 传入的是数组,接口里面 String[] namestrs ,那么 使用 collection = “array”
- 如果传入的是一个实体bean,实体bean里面有一个属性为 list<String> ids 那么collection = “ids ”,如果实体bean中对应ids是一个对象,ids 里面有一个属性为 List<Stirng> usernames,那么collection = “ids.usernames”
二、代码使用
1、实体类 list<String> mchntCds
mapper接口 ---》 list方式
int queryDiscDerateCount(List<String> mchntCds);
mapper映射xml:
<select id="queryDiscDerateCount" resultType="Integer"> select count(*) from t_mchnt_disc_config where mchnt_cd in <foreach collection="list" index="index" item="mchntCd" open="(" close=")" separator=","> #{mchntCd} </foreach> </select>
2、实体类 list<User> userlist,实体类中有 list 属性
实体类:
@Data public class MchntDiscDerateDto { private String mchntCd = ""; }
mapper接口
List<TMchntDerateInfoDto> getDiscDerateList(List<MchntDiscDerateDto> discDto);
mapper映射xml:
<select id="getDiscDerateList" parameterType="MchntDiscDerateDto" resultType="TMchntDerateInfoDto"> select t_mchnt_disc_derate_config where mchnt_cd in <foreach collection="list" index="index" item="user" open="(" close=")" separator=","> #{user.mchntCd} </foreach> </select>
3、数组 String[] params
用 array
mapper 接口
int queryDiscDerateCount(String[] mchntCds);
mapper映射xml:
<select id="queryDiscDerateCount" resultType="Integer"> select count(*) from t_mchnt_disc_derate_config where mchnt_cd in <foreach collection="array" index="index" item="mchntCd" open="(" close=")" separator=","> #{mchntCd} </foreach> </select>
4、传入的参数是实体类,并且实体中包含数组和集合
实体类:
@Data public class UserVo { private Long id; private Long supplierId; private Long[] ids; private List<Long> clientIdList; }
mapper接口
List<UserVo> queryList(UserVo select);
mapper映射文件xml
<select id="queryList" resultType="UserVo" parameterType="UserVo"> select * from bms_bills_memo <where> and id in <foreach collection="ids" open="(" close=")" item="id" separator=","> #{id} </foreach> and client_id in <foreach collection="clientIdList" separator="," item="detail" open="(" close=")" > #{detail} </foreach> </where> </select>
5、传入多个list或者array,不使用实体进行封装。用注解@Params, collection使用到Param中定义的别名
mapper接口
List<UserVo> queryList(@Param("idArray") Long[] array, @Param("clientIdList") List<Long> list);
mapper映射文件xml
<select id="queryList" resultType="UserVo"> select * from t_user_inf <where> and id in <foreach collection="idArray" open="(" close=")" item="id" separator=","> #{id} </foreach> and client_id in <foreach collection="clientIdList" separator="," item="detail" open="(" close=")" > #{detail} </foreach> </where> </select>
6、map参数
当我们传入的参数为 Map<String,Objject>的时候,那么能不能正常使用 foreach呢,答案是肯定的,因为对象也是类似于map结构啊
/** * map 获取数据 * @param map * @return */ List<SysUser> getUserByIds(Map<String,Object> map);
// xml <select id="getUserByIds" resultMap="BaseResultMap"> select <include refid="Base_Column_List" /> from t_sys_user where status = #{status} and id in <foreach collection="ids" item="id" open="(" close=")" separator=","> #{id} </foreach> </select>
实际调用:
@Test public void testMapUsers() { Map<String,Object> params = new HashMap<>(); params.put("status", "1"); params.put("ids", Arrays.asList(1,2,3,4,5,6,7,8)); List<SysUser> all = sysUserDao.getUserByIds(params); try { System.out.println(new JsonMapper().writeValueAsString(all)); } catch (JsonProcessingException e) { e.printStackTrace(); } }
调用结果:
三、总结
1、mapper 接口中添加 @Param注解的场合,list,array将会失效;
2、使用了 @Param注解 collection的内容需要使用Param中的别名来指定你需要用到的list或者array
扩展:Mybatis中foreach的使用
首先我们要明白的是foreach的本质就是把数据库能执行的sql在xml中按照一定语法来进行拼接,所以拼接之前,我们了解一下foreach标签中几个常见元素的作用
1.collection
List或Array:如果传入的参数类型是List或Array,collection属性的默认值分别是list和array。如果需要自定义集合名称。
Map:如果传入的参数是Map,collection属性可以指定遍历Map的keys、values或entrySet
2.item
集合遍历中每一个元素的别名
3.open
拼接sql时最前面拼接的字符串
4.separator
拼接sql时候两个元素之间的分隔字符串
5.close
拼接sql时最后面拼接的字符串
6.index
index:在List或Array中,index为元素的序号索引;在Map中,index为遍历元素的key值。
举一个简单的例子
一个简单的sql
select * from blog where title is not null and (id=1 or id=2 or id=3)
1.我们使用map集合作为参数实现拼接
<select id="queryBlogForeach" parameterType="map" resultType="blog"> select * from blog <where> title is not null <foreach collection="ids" item="id" open="and (" separator="or" close=")"> id=#{id} </foreach> </where> </select>
2.我们使用list集合作为参数实现拼接
<select id="queryBlogForeach2" parameterType="list" resultType="blog"> select * from blog <where> title is not null <foreach collection="list" item="id" open="and (" separator="or" close=")"> id=#{id} </foreach> </where> </select>
到此这篇关于Mybatis中foreach的使用的文章就介绍到这了,更多相关Mybatis foreach使用内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!