MyBatis之foreach的用法

本文详细介绍了MyBatis中foreach标签的使用,包括如何遍历String[],List,Map以及嵌套结构,展示了在不同的参数类型下如何在XML映射文件中编写动态SQL,用于实现In查询和数据插入操作。同时,文章提到了参数类型与collection属性的匹配原则,以及全动态和全静态字段与入参的情况。

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>>

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值