mybatis標簽之——


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,該參數可選。





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM