mybatis的批量update
方法有三种: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文件:
- <mapper namespace="com.dao.EmployeeDao">
- <!--可以通过改变实体类的字段来验证映射-->
- <update id="updateFirstWay">
- update employee set employee_name = #{employeeName},
- employee_gender = #{employeeGender},
- employee_salary = #{employeeSalary},
- dept_id = #{deptId}
- where employee_id = #{employeeId}
- </update>
- <update id="updateSecondWay">
- <foreach collection="list" item="emp" separator=";">
- update employee set employee_name = #{emp.employeeName},
- employee_gender = #{emp.employeeGender},
- employee_salary = #{emp.employeeSalary},
- dept_id = #{emp.deptId}
- where employee_id = #{emp.employeeId}
- </foreach>
- </update>
- <update id="updateThirdWay">
- update employee set
- employee_name= case employee_id
- <foreach collection="list" item="emp">
- when #{emp.employeeId} then #{emp.employeeName}
- </foreach>
- end, employee_gender= case employee_id
- <foreach collection="list" item="emp">
- when #{emp.employeeId} then #{emp.employeeGender}
- </foreach>
- end, employee_salary= case employee_id
- <foreach collection="list" item="emp">
- when #{emp.employeeId} then #{emp.employeeSalary}
- </foreach>
- end,dept_id= case employee_id
- <foreach collection="list" item="emp">
- when #{emp.employeeId} then #{emp.deptId}
- </foreach>
- end
- where
- <foreach collection="list" item="emp" separator="or">
- employee_id = #{emp.employeeId}
- </foreach>
- </update>
- </mapper>
实体类:
- package com.entity;
- import java.math.BigDecimal;
- public class Employee {
- private Integer employeeId;
- private String employeeName;
- private int employeeGender;
- private BigDecimal employeeSalary;
- private Integer deptId;
- public Employee() {
- }
- public Employee(Integer employeeId, String employeeName, int employeeGender, BigDecimal employeeSalary, Integer deptId) {
- this.employeeId = employeeId;
- this.employeeName = employeeName;
- this.employeeGender = employeeGender;
- this.employeeSalary = employeeSalary;
- this.deptId = deptId;
- }
- @Override
- public String toString() {
- return "Employee{" +
- "employeeId=" + employeeId +
- ", employeeName='" + employeeName + '\'' +
- ", employeeGender=" + employeeGender +
- ", employeeSalary=" + employeeSalary +
- ", deptId='" + deptId + '\'' +
- '}';
- }
- public Integer getEmployeeId() {
- return employeeId;
- }
- public void setEmployeeId(Integer employeeId) {
- this.employeeId = employeeId;
- }
- public String getEmployeeName() {
- return employeeName;
- }
- public void setEmployeeName(String employeeName) {
- this.employeeName = employeeName;
- }
- public int getEmployeeGender() {
- return employeeGender;
- }
- public void setEmployeeGender(int employeeGender) {
- this.employeeGender = employeeGender;
- }
- public BigDecimal getEmployeeSalary() {
- return employeeSalary;
- }
- public void setEmployeeSalary(BigDecimal employeeSalary) {
- this.employeeSalary = employeeSalary;
- }
- public Integer getDeptId() {
- return deptId;
- }
- public void setDeptId(Integer deptId) {
- this.deptId = deptId;
- }
- }
EmployeeDao.class:
- void updateFirstWay(Employee employee);
- int updateSecondWay(List<Employee> employees);
- int updateThirdWay(List<Employee> employees);
test代码:
- @Test
- public void testUpdateFirstWay() {
- List<Employee> employees = new ArrayList<>();
- employees.add(new Employee(10,"傲慢", 1, new BigDecimal(9999), 1));
- employees.add(new Employee(11,"色欲", 0, new BigDecimal(8888), 2));
- employees.add(new Employee(12,"怠惰", 1, new BigDecimal(7777), 3));
- employees.add(new Employee(13,"贪婪", 1, new BigDecimal(6666), 4));
- employees.add(new Employee(14,"愤怒", 1, new BigDecimal(5555), 5));
- SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtil.getSqlSessionFactory();
- SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH);
- EmployeeDao mapper = sqlSession.getMapper(EmployeeDao.class);
- try {
- for (int i = 0; i < employees.size(); i ++) {
- mapper.updateFirstWay(employees.get(i));
- if (i % 2 == 0 || i == employees.size() - 1) {
- sqlSession.commit();
- }
- }
- } catch (Exception e) {
- sqlSession.rollback();
- } finally {
- sqlSession.close();
- }
- }
- @Test
- public void testUpdateSecondWay() {
- List<Employee> employees = new ArrayList<>();
- employees.add(new Employee(15,"傲慢", 1, new BigDecimal(9999), 1));
- employees.add(new Employee(16,"色欲", 1, new BigDecimal(8888), 2));
- employees.add(new Employee(17,"怠惰", 1, new BigDecimal(7777), 3));
- employees.add(new Employee(18,"贪婪", 0, new BigDecimal(6666), 4));
- employees.add(new Employee(19,"愤怒", 1, new BigDecimal(5555), 5));
- EmployeeDao employeeDao = MapperFactory.generateMapper(EmployeeDao.class);
- employeeDao.updateSecondWay(employees);
- }
- @Test
- public void testUpdateThirdWay() {
- List<Employee> employees = new ArrayList<>();
- employees.add(new Employee(1,"傲慢", 1, new BigDecimal(9999), 1));
- employees.add(new Employee(2,"色欲", 1, new BigDecimal(8888), 2));
- EmployeeDao employeeDao = MapperFactory.generateMapper(EmployeeDao.class);
- employeeDao.updateThirdWay(employees);
- }
总结:#{}里面写的是实体类的字段,已经测试过了。
最后:根据实际要求,每个字段是要判断是否为空的,例
- <update id="updateFirstWay">
- update employee set
- <if test="b != null and b != ''">
- employee_name = #{b},
- </if>
- <if test="c != null and c != ''">
- employee_gender = #{c},
- </if>
- <if test="d != null and d != ''">
- employee_salary = #{d},
- </if>
- <if test="e != null and e !=''">
- dept_id = #{e}
- </if>
- where employee_id = #{a}
- </update>
因为当只修改部分数据库的列的值,而不是全部列的时候,就需要将不要修改的字段跳过。上面的代码有漏洞,当所有列都不修改的时候会出错,修改代码的话以后再说,累了
有个bug:数据库的binary类型,实体类写的Integer,但是写在ongl里面判断x != null and x != '',如果是0的话,那么这句话会跳过,false
mybatis的批量update的更多相关文章
- mybatis批量update操作的写法,及批量update报错的问题解决方法
mybatis的批量update操作写法很简单,如下: public interface YourMapper extends BaseMapper<YourExt> { void upd ...
- mybatis执行批量更新update
Mybatis的批量插入这里有http://ljhzzyx.blog.163.com/blog/static/38380312201353536375/.目前想批量更新,如果update的值是相同的话 ...
- MyBatis魔法堂:各数据库的批量Update操作
一.前言 MyBatis的update元素的用法与insert元素基本相同,因此本篇不打算重复了.本篇仅记录批量update操作的sql语句,懂得SQL语句,那么MyBatis部分的操作就简单了. ...
- 161102、MyBatis中批量插入
方法一: <insert id="insertbatch" parameterType="java.util.List"> <selectKe ...
- mybatis 的批量更新操作sql
转: mybatis 的批量更新操作sql 2018年07月23日 10:38:19 海力布 阅读数:1689 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.cs ...
- 170829、mybatis使用oracle和mybatis中批量更新
一.mybatis执行批量更新batch update 的方法(mysql数据库) 1.数据库连接必须配置:&allowMultiQueries=true(切记一定要加上这个属性,否则会有问题 ...
- MySQL+MyBatis下批量修改数据的问题
今天处理数据批量的更新,场景是这样子的,web站管理的字典功能,需要添加一个记录的整体描述,以及详细内容的描述.一个字典整体概述只有一组信息,但是其详细内容,会有很多项,不确定. 这个场景,在关系型数 ...
- 【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 ...
- 数据库--MyBatis的(insert,update,delete)三种批量操作
转自:http://blog.csdn.net/starywx/article/details/23268465 前段时间由于项目赶期没顾上开发过程中的性能问题,现对部分代码进行优化的过程中发现在数据 ...
随机推荐
- JuJu团队1月4号工作汇报
JuJu团队1月4号工作汇报 JuJu Scrum 团队成员 今日工作 剩余任务 困难 飞飞 将model嵌入GUI 美化UI 无 婷婷 调试代码 提升acc 无 恩升 -- 写python版本的 ...
- NO25 三剑客之SED行天下
功能说明 Sed是Stream Editor(流编辑器)缩写,是操作.过滤和转换文本内容的强大工具.常用功能有增删改查,过滤,取行. [root@oldboy ~]# sed --version #→ ...
- Mapreduce实例——WordCount
实验步骤 切换目录到/apps/hadoop/sbin下,启动hadoop. cd /apps/hadoop/sbin ./start-all.sh 2.在linux上,创建一个目录/data/map ...
- vscode点击ctrl键报错Request textDocument/definition failed.
现象 用vscode写java代码的时候突然出现,修复问题点击Ctrl时,输出窗口就打日志,报错Request textDocument/definition failed. 我百度唯一的有用线索就是 ...
- git参考
https://github.com/NewLifeX (redis.mq.数据海量查询.分布式任务调度)
- mysql 分组查询入门
- FPGA调试技巧(Quartus 15.1 Standard平台)
1.在SignalTap II Logic Analyzer(stp)观测信号,需要将待观察寄存器.网络节点的综合器属性设为synthesis noprune和synthesis keep,防止综合器 ...
- ConfigureDefender – Windows Defender 设置工具
用于配置Windows 10内置Defender防病毒设置的实用程序.它是一个便携式实用程序 ConfigureDefender实用程序是一个GUI应用程序,用于在Windows 10上查看和配置重要 ...
- manjaro更换深度桌面 卸载ked桌面
下载需要的桌面环境 pacman -S deepin deepin-extra 修改/etc/lightdm/lightdm.conf sudo nano /etc/lightdm/lightdm.c ...
- Netty 中队列的使用
任务队列中的Task有3种典型使用场景 用户程序自定义的普通任务 此前代码: 参考https://www.cnblogs.com/ronnieyuan/p/12016712.html NettySer ...