准备工作
现在有一张表为: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类型
扫描二维码关注公众号,回复: 12417796 查看本文章--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)的错误了。
欢迎关注
公众号三筒记简介:分享各种编程知识、excel相关技巧、读书笔记