zoukankan      html  css  js  c++  java
  • 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相关技巧、读书笔记

  • 相关阅读:
    Git 数据是怎么存储的
    技术管理规划-路径跟资源
    技术管理规划-如何规划团队的架构
    技术管理规划-如何设定团队的目标
    技术管理规划-设定团队的职能
    springboot实践1
    spring的事件机制实战
    Apollo的基本概念和集成实战
    spring的事件
    ELK的简单安装使用
  • 原文地址:https://www.cnblogs.com/manongxiao/p/14264867.html
Copyright © 2011-2022 走看看