方法有三种:1.通过java代码batch方式,xml文件只需一条update语句。java代码繁琐

2.xml使用foreach,“;”分割多条update语句,要求:jdbc的url需加上allowMultiQueries=true。速度慢

3.xml使用foreach进行代码拼接,用了case...when...then...end,oracle好像不支持这种写法,mysql和sqlserver是可以的

xml文件:

  1. <mapper namespace="com.dao.EmployeeDao">
  2. <!--可以通过改变实体类的字段来验证映射-->
  3. <update id="updateFirstWay">
  4. update employee set employee_name = #{employeeName},
  5. employee_gender = #{employeeGender},
  6. employee_salary = #{employeeSalary},
  7. dept_id = #{deptId}
  8. where employee_id = #{employeeId}
  9. </update>
  10.  
  11. <update id="updateSecondWay">
  12. <foreach collection="list" item="emp" separator=";">
  13. update employee set employee_name = #{emp.employeeName},
  14. employee_gender = #{emp.employeeGender},
  15. employee_salary = #{emp.employeeSalary},
  16. dept_id = #{emp.deptId}
  17. where employee_id = #{emp.employeeId}
  18. </foreach>
  19. </update>
  20.  
  21. <update id="updateThirdWay">
  22. update employee set
  23. employee_name= case employee_id
  24. <foreach collection="list" item="emp">
  25. when #{emp.employeeId} then #{emp.employeeName}
  26. </foreach>
  27. end, employee_gender= case employee_id
  28. <foreach collection="list" item="emp">
  29. when #{emp.employeeId} then #{emp.employeeGender}
  30. </foreach>
  31. end, employee_salary= case employee_id
  32. <foreach collection="list" item="emp">
  33. when #{emp.employeeId} then #{emp.employeeSalary}
  34. </foreach>
  35. end,dept_id= case employee_id
  36. <foreach collection="list" item="emp">
  37. when #{emp.employeeId} then #{emp.deptId}
  38. </foreach>
  39. end
  40. where
  41. <foreach collection="list" item="emp" separator="or">
  42. employee_id = #{emp.employeeId}
  43. </foreach>
  44. </update>
  45. </mapper>

  实体类:

  1. package com.entity;
  2.  
  3. import java.math.BigDecimal;
  4.  
  5. public class Employee {
  6.  
  7. private Integer employeeId;
  8. private String employeeName;
  9. private int employeeGender;
  10. private BigDecimal employeeSalary;
  11. private Integer deptId;
  12.  
  13. public Employee() {
  14. }
  15.  
  16. public Employee(Integer employeeId, String employeeName, int employeeGender, BigDecimal employeeSalary, Integer deptId) {
  17. this.employeeId = employeeId;
  18. this.employeeName = employeeName;
  19. this.employeeGender = employeeGender;
  20. this.employeeSalary = employeeSalary;
  21. this.deptId = deptId;
  22. }
  23.  
  24. @Override
  25. public String toString() {
  26. return "Employee{" +
  27. "employeeId=" + employeeId +
  28. ", employeeName='" + employeeName + '\'' +
  29. ", employeeGender=" + employeeGender +
  30. ", employeeSalary=" + employeeSalary +
  31. ", deptId='" + deptId + '\'' +
  32. '}';
  33. }
  34.  
  35. public Integer getEmployeeId() {
  36. return employeeId;
  37. }
  38.  
  39. public void setEmployeeId(Integer employeeId) {
  40. this.employeeId = employeeId;
  41. }
  42.  
  43. public String getEmployeeName() {
  44. return employeeName;
  45. }
  46.  
  47. public void setEmployeeName(String employeeName) {
  48. this.employeeName = employeeName;
  49. }
  50.  
  51. public int getEmployeeGender() {
  52. return employeeGender;
  53. }
  54.  
  55. public void setEmployeeGender(int employeeGender) {
  56. this.employeeGender = employeeGender;
  57. }
  58.  
  59. public BigDecimal getEmployeeSalary() {
  60. return employeeSalary;
  61. }
  62.  
  63. public void setEmployeeSalary(BigDecimal employeeSalary) {
  64. this.employeeSalary = employeeSalary;
  65. }
  66.  
  67. public Integer getDeptId() {
  68. return deptId;
  69. }
  70.  
  71. public void setDeptId(Integer deptId) {
  72. this.deptId = deptId;
  73. }
  74. }

  EmployeeDao.class:

  1. void updateFirstWay(Employee employee);
  2. int updateSecondWay(List<Employee> employees);
  3. int updateThirdWay(List<Employee> employees);

  test代码:

  1. @Test
  2. public void testUpdateFirstWay() {
  3. List<Employee> employees = new ArrayList<>();
  4. employees.add(new Employee(10,"傲慢", 1, new BigDecimal(9999), 1));
  5. employees.add(new Employee(11,"色欲", 0, new BigDecimal(8888), 2));
  6. employees.add(new Employee(12,"怠惰", 1, new BigDecimal(7777), 3));
  7. employees.add(new Employee(13,"贪婪", 1, new BigDecimal(6666), 4));
  8. employees.add(new Employee(14,"愤怒", 1, new BigDecimal(5555), 5));
  9. SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtil.getSqlSessionFactory();
  10. SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
  11. EmployeeDao mapper = sqlSession.getMapper(EmployeeDao.class);
  12. try {
  13. for (int i = 0; i < employees.size(); i ++) {
  14. mapper.updateFirstWay(employees.get(i));
  15. if (i % 2 == 0 || i == employees.size() - 1) {
  16. sqlSession.commit();
  17. }
  18. }
  19. } catch (Exception e) {
  20. sqlSession.rollback();
  21. } finally {
  22. sqlSession.close();
  23. }
  24. }
  25.  
  26. @Test
  27. public void testUpdateSecondWay() {
  28. List<Employee> employees = new ArrayList<>();
  29. employees.add(new Employee(15,"傲慢", 1, new BigDecimal(9999), 1));
  30. employees.add(new Employee(16,"色欲", 1, new BigDecimal(8888), 2));
  31. employees.add(new Employee(17,"怠惰", 1, new BigDecimal(7777), 3));
  32. employees.add(new Employee(18,"贪婪", 0, new BigDecimal(6666), 4));
  33. employees.add(new Employee(19,"愤怒", 1, new BigDecimal(5555), 5));
  34. EmployeeDao employeeDao = MapperFactory.generateMapper(EmployeeDao.class);
  35. employeeDao.updateSecondWay(employees);
  36. }
  37.  
  38. @Test
  39. public void testUpdateThirdWay() {
  40. List<Employee> employees = new ArrayList<>();
  41. employees.add(new Employee(1,"傲慢", 1, new BigDecimal(9999), 1));
  42. employees.add(new Employee(2,"色欲", 1, new BigDecimal(8888), 2));
  43. EmployeeDao employeeDao = MapperFactory.generateMapper(EmployeeDao.class);
  44. employeeDao.updateThirdWay(employees);
  45. }

  总结:#{}里面写的是实体类的字段,已经测试过了。

最后:根据实际要求,每个字段是要判断是否为空的,例

  1. <update id="updateFirstWay">
  2. update employee set
  3. <if test="b != null and b != ''">
  4. employee_name = #{b},
  5. </if>
  6. <if test="c != null and c != ''">
  7. employee_gender = #{c},
  8. </if>
  9. <if test="d != null and d != ''">
  10. employee_salary = #{d},
  11. </if>
  12. <if test="e != null and e !=''">
  13. dept_id = #{e}
  14. </if>
  15. where employee_id = #{a}
  16. </update>

  因为当只修改部分数据库的列的值,而不是全部列的时候,就需要将不要修改的字段跳过。上面的代码有漏洞,当所有列都不修改的时候会出错,修改代码的话以后再说,累了

有个bug:数据库的binary类型,实体类写的Integer,但是写在ongl里面判断x != null and x != '',如果是0的话,那么这句话会跳过,false

mybatis的批量update的更多相关文章

  1. mybatis批量update操作的写法,及批量update报错的问题解决方法

    mybatis的批量update操作写法很简单,如下: public interface YourMapper extends BaseMapper<YourExt> { void upd ...

  2. mybatis执行批量更新update

    Mybatis的批量插入这里有http://ljhzzyx.blog.163.com/blog/static/38380312201353536375/.目前想批量更新,如果update的值是相同的话 ...

  3. MyBatis魔法堂:各数据库的批量Update操作

    一.前言   MyBatis的update元素的用法与insert元素基本相同,因此本篇不打算重复了.本篇仅记录批量update操作的sql语句,懂得SQL语句,那么MyBatis部分的操作就简单了. ...

  4. 161102、MyBatis中批量插入

    方法一: <insert id="insertbatch" parameterType="java.util.List"> <selectKe ...

  5. mybatis 的批量更新操作sql

    转: mybatis 的批量更新操作sql 2018年07月23日 10:38:19 海力布 阅读数:1689   版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.cs ...

  6. 170829、mybatis使用oracle和mybatis中批量更新

    一.mybatis执行批量更新batch update 的方法(mysql数据库) 1.数据库连接必须配置:&allowMultiQueries=true(切记一定要加上这个属性,否则会有问题 ...

  7. MySQL+MyBatis下批量修改数据的问题

    今天处理数据批量的更新,场景是这样子的,web站管理的字典功能,需要添加一个记录的整体描述,以及详细内容的描述.一个字典整体概述只有一组信息,但是其详细内容,会有很多项,不确定. 这个场景,在关系型数 ...

  8. 【mybatis】mybatis进行批量更新,报错:com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right

    使用mybatis进行批量更新操作: 报错如下: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an erro ...

  9. 数据库--MyBatis的(insert,update,delete)三种批量操作

    转自:http://blog.csdn.net/starywx/article/details/23268465 前段时间由于项目赶期没顾上开发过程中的性能问题,现对部分代码进行优化的过程中发现在数据 ...

随机推荐

  1. JuJu团队1月4号工作汇报

    JuJu团队1月4号工作汇报 JuJu   Scrum 团队成员 今日工作 剩余任务 困难 飞飞 将model嵌入GUI 美化UI 无 婷婷 调试代码 提升acc 无 恩升 -- 写python版本的 ...

  2. NO25 三剑客之SED行天下

    功能说明 Sed是Stream Editor(流编辑器)缩写,是操作.过滤和转换文本内容的强大工具.常用功能有增删改查,过滤,取行. [root@oldboy ~]# sed --version #→ ...

  3. Mapreduce实例——WordCount

    实验步骤 切换目录到/apps/hadoop/sbin下,启动hadoop. cd /apps/hadoop/sbin ./start-all.sh 2.在linux上,创建一个目录/data/map ...

  4. vscode点击ctrl键报错Request textDocument/definition failed.

    现象 用vscode写java代码的时候突然出现,修复问题点击Ctrl时,输出窗口就打日志,报错Request textDocument/definition failed. 我百度唯一的有用线索就是 ...

  5. git参考

    https://github.com/NewLifeX  (redis.mq.数据海量查询.分布式任务调度)

  6. mysql 分组查询入门

  7. FPGA调试技巧(Quartus 15.1 Standard平台)

    1.在SignalTap II Logic Analyzer(stp)观测信号,需要将待观察寄存器.网络节点的综合器属性设为synthesis noprune和synthesis keep,防止综合器 ...

  8. ConfigureDefender – Windows Defender 设置工具

    用于配置Windows 10内置Defender防病毒设置的实用程序.它是一个便携式实用程序 ConfigureDefender实用程序是一个GUI应用程序,用于在Windows 10上查看和配置重要 ...

  9. manjaro更换深度桌面 卸载ked桌面

    下载需要的桌面环境 pacman -S deepin deepin-extra 修改/etc/lightdm/lightdm.conf sudo nano /etc/lightdm/lightdm.c ...

  10. Netty 中队列的使用

    任务队列中的Task有3种典型使用场景 用户程序自定义的普通任务 此前代码: 参考https://www.cnblogs.com/ronnieyuan/p/12016712.html NettySer ...