MyBatis之foreach的用法
MyBatis提供foreach语句实现In查询。foreach语法如下:
collection:该属性的对应方法的参数类型可以是List、数组、Map。如果方法的参数类型不属于前三种,则必须和方法参数@Param指定的元素名一致。
item: 表示迭代过程中每个元素的别名。可以随便起名,但是必须跟元素中的#{}里面的名称一致。
index:在list、array中,index为元素的序号索引。但是在Map中,index为遍历元素的key值,该参数为可选项;
open:前缀
close:后缀
separator:分隔符,表示迭代时每个元素之间以什么分隔。
有个点要说明一下
在MyBatis中,没有使用@Param的情况下
当传递的参数为数组时 需要将collection属性设置为 array
当传递的参数为列表时 需要将collection属性设置为 list
(一)String[] 如何遍历
dao层
public interface UserInfoDao {
// 法1:入参类型是Array
List<UserInfoDO> getUserInfobyNames1(String[] names);
}
xml
<!--
法1:当dao层接口的入参类型是Array
-->
<select id="getUserInfobyNames1" resultType="com.springboottest.model.UserInfoDO">
SELECT * FROM user_info WHERE user_name in
<foreach collection="array" item="name" index="index" open="(" close=")" separator=",">
#{name}
</foreach>
</select>
(二)List<> 如何遍历
dao层
public interface UserInfoDao {
// 法2:入参类型是List
List<UserInfoDO> getUserInfobyNames2(List<String> names);
}
xml
<!--
法2:当dao层接口的入参类型是List
-->
<select id="getUserInfobyNames2" resultType="com.springboottest.model.UserInfoDO">
SELECT * FROM user_info WHERE user_name in
<foreach collection="list" item="name" index="index" open="(" close=")" separator=",">
#{name}
</foreach>
</select>
(三)Map<String,List<>> 如何遍历里面的list
dao层
public interface UserInfoDao {
// 法3:入参类型是Map,Map里面的List对象,如下
//List<String> list = new ArrayList<>();
//list.add("1");
//list.add("2");
//list.add("3");
//Map<String, Object> map = new HashMap<>();
//map.put("userids", list);
List<UserInfoDO> getUserInfobyNames3(Map<String,Object> map);
}
xml
<!--
法3:当dao层接口的入参类型是Map,循环里面的List对象,
注意这里的collection 即为 userids
-->
<select id="getUserInfobyNames3" resultType="com.springboottest.model.UserInfoDO">
SELECT * FROM user_info WHERE user_name in
<foreach collection="userids" item="name" index="index" open="(" close=")" separator=",">
#{name}
</foreach>
</select>
(四)Map<String,Map> 如何遍历里面的map
dao层
public interface UserInfoDao {
// 法4:入参类型是Map,Map里面的Map对象,如下
//Map<String,Object> map= new HashMap<>();
//Map<String, Object> map2 = new HashMap<>();
//map2.put("map2的1", "123456");
//map2.put("map2的2", "7891011");
//map.put("map2", map2);
List<UserInfoDO> getUserInfobyNames4(Map<String,Object> map);
}
xml
<!--
法4:当dao层接口的入参类型是Map,循环里面的map对象,
注意这里的collection 需要为 map2.entrySet()
-->
<select id="getUserInfobyNames4" resultType="com.springboottest.model.UserInfoDO">
SELECT * FROM user_info WHERE user_name in
<foreach collection="map2.entrySet()" open="(" close=")" separator="or" index="key" item="value" >
#{value}
</foreach>
</select>
(五)Map<String,Object> 新增操作
全动态(字段 +入参 )
dao层
public interface UserInfoDao {
//Map<String,Object> map =new HashMap<>();
//map.put("ID", UuidUtil.getUnid());
//map.put("REAL_NAME",linkPersonName);
//Date date = new Date();
//map.put("LOGIN_TIME",date);
//map.put("CREATE_TIME",date);
void insertSelective(@Param("wdmap") Map<String,Object> map);
}
xml (注重点:由于使用了${} ,所以mapper接口需要 @Param 注解 )
<insert id="insertSelective" parameterType="java.util.Map">
insert into "NETWORK".ENT_LOGIN_LOG
(
<foreach collection="wdmap" item="value" index="key" separator=",">
<if test="value != null">
${key}
</if>
</foreach>
)
values
(
<foreach collection="wdmap" item="value" index="key" separator=",">
<if test="value != null">
#{value}
</if>
</foreach>
)
</insert>
全静态(字段 +入参 )
由于是一个入参,加上全静态,就不需要加@Param 注解了
void insertSelective(Map<String,Object> map);
<insert id="insertSelective" parameterType="java.util.Map">
insert into "NETWORK".INTERFACE_CALL_RECORD
(ID,,REAL_NAME,CALL_TIME,CREATE_TIME)
values
(#{ID},#{REAL_NAME},#{CALL_TIME},#{CREATE_TIME})
</insert>
非要加@Param 注解的话
void insertSelective(@Param("wdmap") Map<String,Object> map);
<insert id="insertSelective" parameterType="java.util.Map">
insert into "NETWORK".INTERFACE_CALL_RECORD
(ID,,REAL_NAME,CALL_TIME,CREATE_TIME)
values
(#{wdmap.ID},#{wdmap.REAL_NAME},#{wdmap.CALL_TIME},#{wdmap.CREATE_TIME})
</insert>
(六)List<Map<String,Object>> 遍历新增操作
全动态(字段 +入参 )
dao层
public interface UserInfoDao {
//List<Map<String, Object>> dataList =new HashMap<>()
//Map<String,Object> map1 =new HashMap<>();
//map1.put("ID", UuidUtil.getUnid());
//map1.put("REAL_NAME",linkPersonName);
//Map<String,Object> map2 =new HashMap<>();
//map2.put("ID", UuidUtil.getUnid());
//map2.put("REAL_NAME",linkPersonName);
//dataList.add(map1);
//dataList.add(map2);
void insertData(List<Map<String, Object>> dataList);
}
xml
<insert id="insertData" parameterType="java.util.List">
<foreach collection="dataList" item="item" index="index" separator=";">
INSERT INTO "PORTALWORK-POLICY3.0".SMS_SEND_RECORD
(
<foreach collection="item" index="key" item="value" separator=",">
${key}
</foreach>
)
values
(
<foreach collection="item" index="key" item="value" separator=",">
#{value}
</foreach>
)
</foreach>
</insert>
静态字段 + 动态入参
<insert id="insertData" parameterType="java.util.List">
INSERT INTO "PORTALWORK-POLICY3.0".SMS_SEND_RECORD (ID, REAL_NAME)
VALUES
<foreach collection="dataList" item="item" index="index" separator=",">
(
<foreach collection="item" index="key" item="value" separator=",">
#{value}
</foreach>
)
</foreach>
</insert>
参考文章
【1】MyBatis实现In查询
【2】Mybatis——foreach用法
【3】MyBatis中foreach的用法
【4】mybatis通用批量新增全动态插入list<map<string,object>>
本文详细介绍了MyBatis中foreach标签的使用,包括如何遍历String[],List,Map以及嵌套结构,展示了在不同的参数类型下如何在XML映射文件中编写动态SQL,用于实现In查询和数据插入操作。同时,文章提到了参数类型与collection属性的匹配原则,以及全动态和全静态字段与入参的情况。
2436





