准備工作
現在有一張表為:student,相關字段如下:
- 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相關技巧、讀書筆記