• mybatis sql循环的使用


    foreach的主要用在构建in条件中,它可以在SQL语句中进行迭代一个集合。

    foreach元素的属性主要有 item,index,collection,open,separator,close。

        item表示集合中每一个元素进行迭代时的别名, 

        index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置,

        open表示该语句以什么开始, 

        separator表示在每次进行迭代之间以什么符号作为分隔 符,

        collection表示要循环的集合,

        close表示以什么结束。


    在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况 下,该属性的值是不一样的,主要有一下3种情况:

        1. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list


        2. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array



      3. 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在breast里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key

    4.如果传入的参数是实体类对象,该对象中有对应的要循环的集合或数组,则可以直接将collection的值写成该字段名称。

    下面分别来看看上述四种情况的示例代码:


    1.单参数List的类型:

    <select id="dynamicForeach" resultType="Services">
              select * from t_service where id in
           <foreach collection="list" index="index" item="item" open="(" separator="," close=")">
                   #{item}       
           </foreach>    
    
       </select>
    

     若传入的是List<String>类型 在Mapper文件中处理过后,SQL如下:(直接引用注解中的参数名字,这样mybatis会忽略类型,按名字引入)

    <select id="dynamicForeach" resultType="Services">
              select * from t_services where id in
           <foreach collection="ids" index="index" item="item" open="(" separator="," close=")">
                   #{item}       
           </foreach>    
       </select>

    上述collection的值为list,对应的Mapper是这样的

    public List dynamicForeachTest(List ids);

    若是传入的是的是List<String>类型的  可能会报出两个参数的异常,这时我们可以用Mybatis官方的注解@Param

    public List dynamicForeach(@Param("ids")List<String> ids);
    

     2.单参数array数组的类型:

    <select id="dynamicForeach2" resultType="Services">
              select * from t_service where id in
           <foreach collection="array" index="index" item="item" open="(" separator="," close=")">                               #{item}
             </foreach>
         </select>

    上述collection为array,对应的Mapper代码:

    public List dynamicForeach2(int[] ids);

    3.自己把参数封装成Map的类型:

    <select id="dynamicForeach3" resultType="Services">
            select * from t_service where title like "%"#{title}"%" and id in
             <foreach collection="ids" index="index" item="item" open="(" separator="," close=")">
                  #{item}
             </foreach>
        </select>

    上述collection的值为ids,是传入的参数Map的key,对应的Mapper代码:

    public List dynamicForeach3(Map params);

    4.传入的参数是实体类对象,该对象中有对应的要循环的集合或数组。

    public List<T> findList(T entity) {
    		return dao.findList(entity);
    	}
    

     对应的mapper可以这样使用:

    <select id="findList" resultType="Services">
    		SELECT 
    			<include refid="cmsServicesColumns"/>
    		FROM cms_Services a
    		<include refid="cmsServicesJoins"/>
    		<where>
    			
    			
    			<if test="category.id != null and category.id != ''">
    				AND (a.category_id = #{category.id})
    			</if>
    			<if test="categoryList != null">
    			and 
    			a.category_id in
    				<foreach item="category" collection="categoryList" open="(" separator="," close=")">
    
         	 #{category.id}
    
        		</foreach>
    			</if>
    		</where>
    	</select>
    

     collection对应的categoryList是实体类中的List:

    伪代码:
    public class Services extends DataEntity<Services> { private List<Category> categoryList;// 分类编号(组) }

     另外要注意的是:foreach循环出来的实体,是可以当成实体在循环外面去调用的,即如果例4中代码写成如下这样:

    <select id="findList" resultType="Services">
            SELECT 
                <include refid="cmsServicesColumns"/>
            FROM cms_Services a
            <include refid="cmsServicesJoins"/>
            <where>
                
                <if test="categoryList != null">
                and 
                a.category_id in
                    <foreach item="category" collection="categoryList" open="(" separator="," close=")">
    
              #{category.id}
    
                </foreach>
                </if>
    
    <if test="category.id != null and category.id != ''">
                    AND (a.category_id = #{category.id})
                </if>
            </where>
        </select>

    则如果该实体没有传入category

    依然会进入最后那一个循环中去,这点需要注意。

  • 相关阅读:
    一元试用一个月的备份服务,把编剧的套路彻底堵死
    微软开源 PowerShell 并支持 Linux 和 OS X
    MySQL Database on Azure 支持 5.7 版本啦!
    python把字典写入excel之一例
    python字典无序?有序?
    字典转化为有序列表
    对xml文件的sax解析(增删改查)之二
    对xml文件的sax解析(增删改查)之一
    XML中CDATA和#PCDATA的区别
    dtd文件中写的引用实体被xml文件引用后无法在浏览器中显示的问题
  • 原文地址:https://www.cnblogs.com/fengwenzhee/p/8352455.html
Copyright © 2020-2023  润新知