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 前段时间由于项目赶期没顾上开发过程中的性能问题,现对部分代码进行优化的过程中发现在数据 ...
随机推荐
- 【LeetCode】113. 路径总和 II
题目 给定一个二叉树和一个目标和,找到所有从根节点到叶子节点路径总和等于给定目标和的路径. 说明: 叶子节点是指没有子节点的节点. 示例: 给定如下二叉树,以及目标和 sum = 22, 5 / \ ...
- python merge、join、concat用法与区别
由于合并变化较大,以后函数可能会修改,只给出一些例子作为参考 总结: merge.join 1.当没有索引时:merge.join为按照一定条件合并 2.当有索引.并按照索引合并时,得到结果为两者混 ...
- 第3节 sqoop:2、sqoop的基本简介和安装
3. sqoop数据迁移 3.1.概述 sqoop是apache旗下一款“Hadoop和关系数据库服务器之间传送数据”的工具. 导入数据:MySQL,Oracle导入数据到Hadoop的HDFS.HI ...
- sql 经纬度范围检索(谷歌方案)
SELECT id, ( * acos ( //公里: 6371 英里: 3959 cos ( radians(78.3232) ) * cos( radians( 数据库纬度字段) ) * cos( ...
- Thinkcmf任意漏洞包含漏洞分析复现
简介 ThinkCMF是一款基于PHP+MYSQL开发的中文内容管理框架,底层采用ThinkPHP3.2.3构建.ThinkCMF提出灵活的应用机制,框架自身提供基础的管理功能,而开发者可以根据自身的 ...
- Word 写论文的一些教训和经验
参考文献 写正文时就在引用位置添加参考文献的title,写完后,在百度学术或谷歌学术中搜索参考文献获取GB/T 7714的参考格式,在参考文献的章节为文献编号,在引用位置插入交叉引用. 插图 可以先在 ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 辅助类:屏幕阅读器
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- HihoCoder第十周:后序遍历
也就在大二学数据结构的时候知道了树的前序遍历.后序遍历.中序遍历.之后就忘了,在之后就是大四研究生老师考我,我当时还不知道,真够丢人的.自此之后,知道了如何通过其中两个得到第三个,但是也没有编程实现过 ...
- POJ2533:Longest Ordered Subsequence
Longest Ordered Subsequence Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 37454 Acc ...
- C# OBJ模型解析的封装(网上看到的保留一份)
/// <author>Lukas Eibensteiner</author> /// <date>19.02.2013</date> /// < ...