mybatis中批量更新sql語句,trim、foreach標簽,varchar定義理解


准備工作

現在有一張表為:student,相關字段如下:

image-20210111214809694

  • mapper層方法
int batchUpdateStudent(List<Student> studentList);
  • xml語句
<update id="batchUpdateStudent">
		update student
		<trim prefix="set" suffixOverrides=",">
			<trim prefix="name =case" suffix="end,">
				<foreach collection="list" item="item" index="index">
                                        <if test="item.name!=null">
                                                      when aid = #{item.aid} then #{item.name}
					</if>
				</foreach>
			</trim>
                        <trim prefix="email =case" suffix="end,">
				<foreach collection="list" item="item" index="index">
					<if test="item.email!=null">
                                                when aid = #{item.aid} then #{item.email}
					</if>
				</foreach>
			</trim>
		</trim>
		WHERE
		<foreach collection="list" item="item" open="( " separator=") or (" close=" )">
			aid = #{item.aid}
		</foreach>
</update>
  • 運行結果,未被匹配到的記錄並不會保持原來的數值,而是會被設置為null,因此一定要添加where條件。
update student
set name =case
when aid = 1 then ''
when aid = 2 then ''
end, 
email =case
when aid = 1 then ''
when aid = 2 then ''
end
where (aid = 1) or (aid = 2)

動態sql標簽詳解

trim標簽

相關屬性 具體描述
prefix 給sql語句拼接的前綴
suffix 給sql語句拼接的后綴
prefixOverrides 去除sql語句前面的關鍵字或者字符,該關鍵字或者字符由prefixOverrides屬性指定,假設該屬性指定為"and",當sql語句的開頭為"and",trim標簽將會去除該"and"
suffixOverrides 去除sql語句后面的關鍵字或者字符,該關鍵字或者字符由suffixOverrides屬性指定

Foreach標簽

相關屬性 具體描述
collection 遍歷的集合名稱;
item 每個元素進行迭代時的別名;
index 在迭代過程中,每次迭代到的位置;
open 以什么開始;
close 以什么結束;
separator 每次進行迭代之間以什么符號作為分隔符。
  • collection屬性詳細說明:

    傳入"單個參數"並且參數類型為List,collection屬性值為list,如上圖例子;

    傳入"單個參數"並且參數類型為array數組,collection的屬性值為array;

    傳入"多個參數",將其封裝為map,collection的屬性值為map中的key值。

    List<Student> lists = new ArrayList<>();
    ......
    Map map = new HashMap();
    params.put("studentList", list);
    params.put("uuid", "hgjahgkjasgj");
    
    <foreach collection="studentList" index="index" item="item" open="(" separator="," close=")">
          #{item}
    </foreach>
    

varchar(20)中的20代表字符還是字節

mysql數據庫

  • 5.X 以上的版本的定義中表示的字符長度,例如varchar(10,可以添加10個英文字符或者10個數字或者10個中文字符。

  • 4.X 的版本表示的是字節長度,會根據字符集轉變內容字節長度存儲。

-- 獲取到字節長度 
SELECT LENGTH('中國');
-- 獲取到字符長度
SELECT CHAR_LENGTH('中國');

oracle數據庫

  • oracle中建立表時,varchar2類型的字段長度單位默認使用byte類型定義,也可以使用字符為單位來定義長度,例如:varchar2(20 char)

  • 函數:lengthb(string)計算string所占的字節長度,length(string)計算string所占的字符長度

    --獲取到字節長度
    selec lengthb('中國') from dual;
    --獲取到字符長度
    selec length('中國') from dual;
    

注意事項

  • 如果存在mysql數據庫的數據遷移到oracle中數據庫中的相關表時,在oracle中創建表時,注意oracle表中的varchar2類型長度單位默認使用byte類型

    --mysql:代表的是20個字符,也就是說,可以存在20個漢字的情況
    name	VARCHAR(20)
    --oracle:代表的是20個字節,假設此oracle中一個漢字可能對應2個字節,20個漢字對應的則是40字節,遷移時會報長度不夠的錯誤
    name	VARCHAR2(20) 
    -- 可以使用,表示20個字符
    name	VARCHAR2(20 char) 
    
  • oracle建表時,如果不知道具體的長度,可以在mysql中使用LENGTH()、MAX()函數,找到該字段的最大字節數;在oracle中確定該字段的長度時,比查出來的最大長度大就不會報字段超長(value too large)的錯誤了。

原創不易,歡迎轉載,轉載時請注明出處,謝謝!
作者:瀟~蕭下
原文鏈接:https://www.cnblogs.com/manongxiao/p/14264867.html

歡迎關注
公眾號三筒記簡介:分享各種編程知識、excel相關技巧、讀書筆記


免責聲明!

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



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