• mybatis标签之——<trim>及 <foreach collection>


    https://www.cnblogs.com/zjfjava/p/8882614.html

    trim标记是一个格式化的标记,主要用于拼接sql的条件语句(前缀或后缀的添加或忽略),可以完成set或者是where标记的功能。

    trim属性主要有以下四个

    •  prefix:前缀覆盖并增加其内容
    •  suffix:后缀覆盖并增加其内容
    •  prefixOverrides:前缀判断的条件
    •  suffixOverrides:后缀判断的条件

    例如在update中

    复制代码
    <update id="updateByPrimaryKey" parameterType="Object">
            update student set 
      <trim  suffixOverrides="," > 
        <if test="name != null  ">
            NAME=#{name},
        </if>
        <if test="hobby != null  ">
            HOBBY=#{hobby},
        </if>
      </trim> where id=#{id}
        </update>
    复制代码

     如果name和hobby的值都不为空的话,会执行如下语句

    update student set NAME='XX',HOBBY='XX' /*,*/ where id='XX'

    会忽略最后一个“,” ;

    在select中

    复制代码
    <select id="selectByNameOrHobby" resultMap="BaseResultMap">
    select * from student 
    <trim prefix="WHERE" prefixOverrides="AND | OR">
        <if test="name != null and name.length()>0"> AND name=#{name}
        </if>
        <if test="hobby != null and hobby.length()>0"> AND hobby=#{hobby}
        </if>
    </trim>
    </select>
    复制代码

     如果name和hobby的值都不为空的话,会执行如下语句

    select * from user WHERE /*and*/ name = ‘xx’ and hobby= ‘xx’

    会为<trim>片段添加 "WHERE" 前缀,并忽略第一个 “and”  ;

    当然,避免出现“WHERE AND”还有其他方法,如下

    复制代码
    <!--将where提取出来,并加上“1=1”的查询条件 -->
    select * from student 
    where 1=1
    <trim suffixOverrides=",">
       <if test="name != null and name != ''">
          and NAME = #{name}
       </if>
       <if test="hobby != null and hobby != ''">
          and HOBBY = #{hobby}
       </if> 
    </trim>
    复制代码

    用在insert中

    复制代码
        <insert id="insert" parameterType="Object">
            insert into student    <trim     prefix="("    suffix=")"    suffixOverrides="," >
        <if test="name != null  ">
            NAME,
        </if>
        <if test="hobby != null  ">
            HOBBY,
        </if>    
        </trim>    <trim     prefix="values("    suffix=")"    suffixOverrides="," >  
        <if test="name != null  ">
            #{name},
        </if>
        <if test="hobby != null  ">
            #{hobby},
        </if>
        </trim>
        </insert>
    复制代码

    可以为生成格式正确的insert语句。

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

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

        item表示集合中每一个元素进行迭代时的别名,
        index指 定一个名字,用于表示在迭代过程中,每次迭代到的位置,
        open表示该语句以什么开始,
        separator表示在每次进行迭代之间以什么符号作为分隔 符,
        close表示以什么结束。


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

        1. 如果传入的是单参数且参数类型是一个List的时候,collection属性值为list
        2. 如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array
        3. 如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可

    以封装成map,实际上如果你在传入参数的时候,在breast里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key 下面分别来看看上述三种情况的示例代码:
    1.单参数List的类型:
      

    1 <select id="dynamicForeachTest" parameterType="java.util.List" resultType="Blog">
    2           select * from t_blog where id in
    3        <foreach collection="list" index="index" item="item" open="(" separator="," close=")">
    4                #{item}       
    5        </foreach>    
    6    </select>


    上述collection的值为list,对应的Mapper是这样的
    public List dynamicForeachTest(List ids);
    测试代码:

    复制代码
     1 @Test
     2     public void dynamicForeachTest() {
     3         SqlSession session = Util.getSqlSessionFactory().openSession();      
     4         BlogMapper blogMapper = session.getMapper(BlogMapper.class);
     5          List ids = new ArrayList();
     6          ids.add(1);
     7          ids.add(3);
     8           ids.add(6);
     9         List blogs = blogMapper.dynamicForeachTest(ids);
    10          for (Blog blog : blogs)
    11              System.out.println(blog);
    12          session.close();
    13      }
    复制代码


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

    1 <select id="dynamicForeach2Test" parameterType="java.util.ArrayList" resultType="Blog">
    2     select * from t_blog where id in
    3     <foreach collection="array" index="index" item="item" open="(" separator="," close=")">
    4          #{item}
    5     </foreach>
    6 </select>    


    上述collection为array,对应的Mapper代码:
    public List dynamicForeach2Test(int[] ids);
    对应的测试代码:
          

    复制代码
     1 @Test
     2 public void dynamicForeach2Test() {
     3         SqlSession session = Util.getSqlSessionFactory().openSession();
     4         BlogMapper blogMapper = session.getMapper(BlogMapper.class);
     5         int[] ids = new int[] {1,3,6,9};
     6         List blogs = blogMapper.dynamicForeach2Test(ids);
     7         for (Blog blog : blogs)
     8         System.out.println(blog);    
     9         session.close();
    10 }
    复制代码


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

    1 <select id="dynamicForeach3Test" parameterType="java.util.HashMap" resultType="Blog">
    2         select * from t_blog where title like "%"#{title}"%" and id in
    3          <foreach collection="ids" index="index" item="item" open="(" separator="," close=")">
    4               #{item}
    5          </foreach>
    6 </select>


    上述collection的值为ids,是传入的参数Map的key,对应的Mapper代码:
    public List dynamicForeach3Test(Map params);
    对应测试代码:
        

    @Test
        public void dynamicForeach3Test() {
            SqlSession session = Util.getSqlSessionFactory().openSession();
             BlogMapper blogMapper = session.getMapper(BlogMapper.class);
              final List ids = new ArrayList();
              ids.add(1);
              ids.add(2);
              ids.add(3);
              ids.add(6);
             ids.add(7);
             ids.add(9);
            Map params = new HashMap();
             params.put("ids", ids);
             params.put("title", "中国");
            List blogs = blogMapper.dynamicForeach3Test(params);
             for (Blog blog : blogs)
                 System.out.println(blog);
             session.close();
         }
    

      

     

    Mybatis 插入与批量插入以及多参数批量删除

     <insert id="insert" parameterType="model.AttachmentTable">
            insert into attachment_table (id, name, logID,url)
            values (#{id,jdbcType=INTEGER}, #{name,jdbcType=VARCHAR}, #{logid,jdbcType=INTEGER},#{url,jdbcType=LONGVARCHAR})
        </insert>
        <insert id="insertByBatch" parameterType="java.util.List">
            insert into attachment_table (name, logID,url)
            values
            <foreach collection="list" item="item" index="index" separator=",">
                (#{item.name,jdbcType=VARCHAR}, #{item.logid,jdbcType=INTEGER},#{item.url,jdbcType=LONGVARCHAR})
            </foreach>
        </insert>

    Mybatis 多参数批量删除示例

    package com.vrv.linkdood.app.workreport.demomodule.mapper;import org.apache.ibatis.annotations.Param;public interface AttachmentTableMapper {
        void deleteByLogIdAndNames(@Param("logid") Integer logID, @Param("names") String[] names);
    }
    复制代码
        <delete id="deleteByLogIdAndNames">
            delete from attachment_table
            where logid = #{logid,jdbcType=INTEGER} AND NAME IN
            <foreach collection="names" item="item" index="index" open="(" close=")" separator=",">
                #{item}
            </foreach>
        </delete>
    复制代码
    
    

    Mybatis 批量更新数据

     <!-- 批量更新第一种方法,通过接收传进来的参数list进行循环着组装sql -->
        <update id="batchUpdate" parameterType="java.util.Map">
            <!-- 接收list参数,循环着组装sql语句,注意for循环的写法
                 separator=";" 代表着每次循环完,在sql后面放一个分号
                 item="cus" 循环List的每条的结果集
                 collection="list" list 即为 map传过来的参数key -->
            <foreach collection="list" separator=";" item="cus">
                update t_customer set
                c_name = #{cus.name},
                c_age = #{cus.age},
                c_sex = #{cus.sex},
                c_ceroNo = #{cus.ceroNo},
                c_ceroType = #{cus.ceroType}
                where id = #{cus.id}
            </foreach>
        </update>
    
    
    属性 描述
    item 循环体中的具体对象。支持属性的点路径访问,如item.age,item.info.details。
    具体说明:在list和数组中是其中的对象,在map中是value。
    该参数为必选。
    collection

    要做foreach的对象,作为入参时,List<?>对象默认用list代替作为键,数组对象有array代替作为键,Map对象没有默认的键。
    当然在作为入参时可以使用@Param("keyName")来设置键,设置keyName后,list,array将会失效。 除了入参这种情况外,还有一种作为参数对象的某个字段的时候。举个例子:
    如果User有属性List ids。入参是User对象,那么这个collection = "ids"
    如果User有属性Ids ids;其中Ids是个对象,Ids有个属性List id;入参是User对象,那么collection = "ids.id"
    上面只是举例,具体collection等于什么,就看你想对那个元素做循环。
    该参数为必选。

    separator 元素之间的分隔符,例如在in()的时候,separator=","会自动在元素中间用“,“隔开,避免手动输入逗号导致sql错误,如in(1,2,)这样。该参数可选。
    open foreach代码的开始符号,一般是(和close=")"合用。常用在in(),values()时。该参数可选。
    close foreach代码的关闭符号,一般是)和open="("合用。常用在in(),values()时。该参数可选。
    index 在list和数组中,index是元素的序号,在map中,index是元素的key,该参数可选。




  • 相关阅读:
    生成格雷码 转自leetcode
    webstorm注册码 永久有效!!!(亲测有效)
    Myeclipse或者eclipse太卡
    对封装的再次理解(容器)
    几个好的参考的网站
    将json字符串转为json对象,从对象中取需要的数据
    ElementUI学习笔记
    Oracle的case when 和decode
    20190807更新数据相关笔记
    oracle未查找到任何数据问题
  • 原文地址:https://www.cnblogs.com/yuluoxingkong/p/10178890.html
Copyright © 2020-2023  润新知