MyBatis动态sql详解(二) foreach语句详解

来源:互联网 发布:淘宝网佛教用品 编辑:程序博客网 时间:2024/06/05 06:31
一、介绍: 
 foreach主要是用于一个循环,大部分用到的是循环的生成sql,下面说一下动态foreach的属性:
  foreach元素的属性主要有item,index,collection,open,separator,close。
  1、collection表示如何来得到这个集合,如果传入的直接为一个List,那么collection值就为list,如果直接传入的为一个array不可变数组,那么collection值就为array,如果传入的为一个dto,比如dto里面的array变量名为idLists,那么collection的值就为idLists。
  2、item表示集合中每一个元素进行迭代时的别名,比如item为value,那么,每次获取的都使用#{value}即可
  3、index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,一般很少使用这个
  4、open表示该语句以什么开始
  5、separator表示在每次进行迭代之间以什么符号作为分隔符
  6、close表示以什么结束

二、原理:
  动态SQL,最后都会根据条件拼成SQL,foreach也不例外,原理为:
  首先根据collection来得到集合,然后写入open字符,然后开始遍历:
每次遍历,都会执行里面的条件得到生成的sql,然后加入separator,遍历完成之后,加入close字符。

三、实战:
1.1、直接传入一个List可变数组:
  比如我想找users表中id在一个数组中的,可以这样:
 <select id="dymamicForeachListGetUser" resultType="com.happyheng.entity.User">
  select * from users where id in
  <foreach collection="list" index = "index" item = "item" open="(" separator="," close=")">
   #{item}
  </foreach>
 </select>

public static void testDynamicForeach() {
  SqlSession session = MyBatisUtil.getSqlSession(true);
  
  List<Integer> idList = new ArrayList<>();
  idList.add(7);
  idList.add(8);
  idList.add(10);
  idList.add(11);
  List<User> users = session.selectList("dymamicForeachListGetUser",idList);
  
  for (User user : users) {
   System.out.println(user);
  }
  session.close();
 }


2、直接传入一个array不可变数组:
 <select id="dymamicForeachArrayGetUser" resultType="com.happyheng.entity.User">
  select * from users where id in
  <foreach collection="array" index = "index" item = "idArray" open="(" separator="," close=")">
   #{idArray}
  </foreach>
 </select>

java代码中的使用:


 public static void testDynamicForeach() {
  SqlSession session = MyBatisUtil.getSqlSession(true);
  
  int[] ids = new int[]{7,8,10,11};
  List<User> users = session.selectList("dymamicForeachArrayGetUser", ids);
  
  for (User user : users) {
   System.out.println(user);
  }
  session.close();
 }


3、传入一个dto,里面有一个参数为List可变数组
 <select id="findCommunityInfo" parameterType="com.happyheng.ParkQuery" resultMap="resultMap">
        SELECT
        xxx
        FROM
        fairyland_account_info account ,fairyland_community_info comm
        where account.id = comm.fairyland_account_info_id

        <if test="userInfoId != null">
            AND account.user_info_id = #{userInfoId}
        </if>
        
        <if test="userIdList!=null">
            AND account.user_info_id IN
            <foreach collection="userIdList" item="userId" open="(" separator="," close=")">
                #{userId}
            </foreach>
        </if>

    </select>
其中,传入的dto为ParkQuery,里面有一个List<Long> 的userIdList参数(注意要有setter和getter) 所以下面的collection为userIdList,其对应的接口为:

 public List<CommunityInfoDto> findCommunityInfo(ParkQuery parkQuery);


4、传入一个dto,里面有一个参数为List可变数组,其中list中每个也是一个dto:
    <update id="updateStatus" parameterType="com.happyheng.query.FriendUpdateQuery">
        UPDATE friend_introduce_info SET be_used = #{beUsed,jdbcType=TINYINT} WHERE
        <foreach collection="listQuery" item="query" separator="or">
            (user_info_id = #{query.uid} AND introduced_user_info_id =#{query.introduceUid})
        </foreach>
    </update>
其中item=query即为list中的每个dto即为query,那么 #{query.uid}即为获取dto中的uid。


1 0
原创粉丝点击