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类型

    扫描二维码关注公众号,回复: 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相关技巧、读书笔记
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/W_ryxj000/article/details/112502391