Mybatis批量更新<转>
Mybatis批量更新
批量操作就不进行赘述了。减少服务器与数据库之间的交互。网上有很多关于批量插入还有批量删除的帖子。但是批量更新却没有详细的解决方案。
实现目标
这里主要讲的是1张table中。根据不同的id值,来update不同的property。
数据表:1张。Tblsupertitleresult。错题结果统计。
表结构:
表中每一条数据必须通过两个字段来确定:userHhCode+titleId
需要批量更新的字段是:correctDate,result,checkState。
1批量更新的sql语句
我用的数据库是mysql。其他数据库的sql语句也都大同小异。
用mybatis的mapper-xml进行组装sql之前需要写出批量操作的sql语句。
Sql:
update tblsupertitleresult set result =case
when (userHhCode=2001 and titleId=1)then 90
when (userHhCode=2001 and titleId=2)then 70
end
,checkState = case
when (userHhCode=2001 and titleId=1)then 80
when (userHhCode=2001 andtitleId=2)then 120
end
where (userHhCode=2001 and titleId=1) or(userHhCode=2001 and titleId=2)
关于这个批量更新的sql语句做一个简单的解释。
要更新userHhCode=2001,titleId=1和userHhCode=2001 ,titleId=2的两条数据。
当userHhCode=2001,titleId=1时,将result设置为90,checkState设置为80
当userHhCode=2001,titleId=2时,将result设置为80,checkState设置为120.
这是mysql语句。运行没有问题。接下来就是mybatis的mapper-xml
Mybatis中mapper-xml
这里,首先介绍实体类。
public classWrongTitle { //manipulatetable of tblsupertitleresult private String titleId; private String titleIdNew; private String result; private String checkState; private String isCollect; private String times; private String wrongDate; private String wrongNum; private String collectDate; private String userHhCode; private String correctDate; private String tid;// teacher who will review this wrong title private String paperTitleId;
getter和set方法省略。
好了现在开始介绍mybatis里面的几个标签。由于一些原因,mybatis的技术文档和用户指南所介绍得并不详细。
<foreach>标签:foreach元素的属性主要有item,index,collection,open,separator,close。item表示集合中每一个元素进行迭代时的别名,
index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,
open表示该语句以什么开始,
separator表示在每次进行迭代之间以什么符号作为分隔符,
close表示以什么结束,
在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但是在不同情况下,该属性的值是不一样的,主要有一下3种情况:
1.如果传入的是单参数且参数类型是一个List的时候,collection属性值为list;
2.如果传入的是单参数且参数类型是一个array数组的时候,collection的属性值为array;
3.如果传入的参数是多个的时候,我们就需要把它们封装成一个Map了,当然单参数也可以封装成map,实际上如果你在传入参数的时候,在MyBatis里面也是会把它封装成一个Map的,map的key就是参数名,所以这个时候collection属性值就是传入的List或array对象在自己封装的map里面的key;
关于以上三种collection的用法。百度上有很多帖子。这里不进行赘述。
<trim>标签:有四个属性:
Prefix: 指的是<trim></trim>所包含的部分(body)以什么开头。
prefixOverrides:指<trim>中如果有内容时可忽略(body)前的匹配字符。
suffix: 指的是<trim></trim>所包含的部分(body)以什么结尾。
suffixOverrides:指<trim>中如果有内容时可忽略(body)后的匹配字符。
接下来直接上:
Mapper-xml
<update id="batchUpdate"> update tblsupertitleresult <trim prefix="set" suffixOverrides=","> <trim prefix="checkState =case" suffix="end,"> <foreach collection="list"item="i" index="index"> <if test="i.checkState!=null"> when (userHhCode=#{i.userHhCode} and titleId=#{i.titleId}) then #{i.checkState} </if> </foreach> </trim> <trim prefix=" correctDate =case" suffix="end,"> <foreach collection="list"item="i" index="index"> <if test="i.correctDate!=null"> when (userHhCode=#{i.userHhCode} and titleId=#{i.titleId}) then #{i.correctDate} </if> </foreach> </trim> <trim prefix="result =case" suffix="end," > <foreach collection="list"item="i" index="index"> <if test="i.result!=null"> when (userHhCode=#{i.userHhCode} and titleId=#{i.titleId}) then #{i.result} </if> </foreach> </trim> </trim> where <foreach collection="list" separator="or" item="i" index="index"> (userHhCode =#{i.userHhCode} andtitleId=#{i.titleId}) </foreach> </update>
接下来就是dao:
public interface DatacenterDAO{
// batch update super title_result_view
public intbatchUpdate(List<WrongTitle> list );
Test类
public classTestBatch {
/**
* @param args
*/
public static voidmain(String[] args) {
ApplicationContext context = newClassPathXmlApplicationContext("applicationContext.xml");
DatacenterDAO dao = context.getBean(DatacenterDAO.class);
ArrayList<WrongTitle> list = newArrayList<WrongTitle>();
WrongTitle t1=new WrongTitle();
WrongTitle t2=new WrongTitle();
WrongTitle t3=new WrongTitle();
WrongTitle t4=new WrongTitle();
t1.setTitleId(3+"");
t2.setTitleId(4+"");
t3.setTitleId(5+"");
t4.setTitleId(6+"");
t1.setUserHhCode(2001+"");
t2.setUserHhCode(2001+"");
t3.setUserHhCode(2001+"");
t4.setUserHhCode(2001+"");
t1.setCheckState(5+"");
t2.setCheckState(6+"");
t3.setCheckState(7+"");
t4.setCheckState(8+"");
t1.setResult(10+"");
t2.setResult(12+"");
t3.setResult(14+"");
t4.setResult(16+"");
list.add(t1);
list.add(t2);
list.add(t3);
list.add(t4);
int i=dao.batchUpdate(list);
System.out.println("操作了"+i+"行数据");
}
运行结果截图:
希望能帮助到大家~。~
================
亲测可用,但是不知道效率到底如何。
Mybatis批量更新<转>的更多相关文章
- mybatis批量更新报错badsql
mybatis批量更新时语法写的都对,但是报错,需要在连接上面加上allowMultiQueries=true 示例:jdbc:MySQL://192.168.1.236:3306/test?useU ...
- mybatis批量更新update-设置多个字段值 报错 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near
mybatis批量更新update-设置多个字段值 2016年08月01日 12:49:26 姚一号 阅读数:29539 标签: mysql mybatis批量更新批量更新allowMultiQuer ...
- Mybatis批量更新详解
转:http://www.cnblogs.com/winkey4986/p/3915151.html Mybatis批量更新 批量操作就不进行赘述了.减少服务器与数据库之间的交互.网上有很多关于批量插 ...
- mybatis批量更新两种方式:1.修改值全部一样 2.修改每条记录值不一样
Mybatis批量更新数据 mybatis批量更新两种方式:1.修改值全部一样 2.修改每条记录值不一样 mybatis批量更新两种方式:1.修改值全部一样 2.修改每条记录值不一样 mybatis批 ...
- mybatis批量更新策略
我们知道循环中操作db会导致连接数满,严重影响数据库性能.所以在对db进行DQL与DML时,根据业务逻辑尽量批量操作,这里我们介绍下使用mybatis批量更新mysql的两种方式. 方式一: < ...
- Mybatis批量更新数据库与批量插入数据库(以oracle为例)
一.批量更新 1.普通写法(一条记录update一次,性能比较差,容易造成阻塞.不建议使用) <update id="updateBatch" parameterType=& ...
- mybatis 批量更新 Parameter '__frch_item_0' not found. Available parameters are [list]
一次在做批量更新数据的时候报错 Parameter '__frch_item_0' not found. Available parameters are [list] 记过反复查找,最后才发现是一个 ...
- MyBatis批量更新
逐条更新 这种方式显然是最简单,也最不容易出错的,即便出错也只是影响到当条出错的数据,而且可以对每条数据都比较可控. 代码 updateBatch(List<MyData> datas){ ...
- mybatis批量更新报错 org.mybatis.spring.MyBatisSystemException
具体报错信息: org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.Bin ...
随机推荐
- Android -- sqlite数据库随apk发布
背景 把在工程中测 ...
- 关于docker的15个小tip
1. 获取最近运行容器的id 这是我们经常会用到的一个操作,按照官方示例,你可以这样做(环境ubuntu): $ ID=$(docker run ubuntu echo hello world) he ...
- 【转】四大机器学习降维算法:PCA、LDA、LLE、Laplacian Eigenmaps
最近在找降维的解决方案中,发现了下面的思路,后面可以按照这思路进行尝试下: 链接:http://www.36dsj.com/archives/26723 引言 机器学习领域中所谓的降维就是指采用某种映 ...
- 求证:a^4+b^4 ≧a^3*b+a*b^3
证明: a4+b4-a3b-ab3 =a3(a-b)-b3(a-b) =(a3-b3)(a-b) =(a-b)2(a2+ab+b2) 而a2+ab+b2=a2+ab+b2/4+3b2/4=(a+b/2 ...
- es5 - array - reverse
/** * 描述:也就是数组元素反转 * 使用:arr.reverse() */ var a = [1,2,3]; console.log(a.reverse()); /** * 一个经典的问题:如何 ...
- Python dict的特点
dict的特点 1:查找速度快 2:浪费空间 3:key不可以重复,且不可变 4:数据无序排放 dict的第一个特点是查找速度快,无论dict有10个元素还是10万个元素,查找速度都一样.而list的 ...
- MySQL 官方文档
MySQL 5.6 Reference Manual Preface and Legal Notices 1 General Information 2 Installing and Upgradin ...
- 深入探讨Linux静态库与动态库的详解(转)
2.生成动态库并使用 linux下编译时通过 -shared 参数可以生成动态库(.so)文件,如下 库从本质上来说是一种可执行代码的二进制格式,可以被载入内存中执行.库分静态库和动态库两种. 一.静 ...
- php 一个过虑xxs的代码
一个过虑xxs的代码 public static function removeXSS($str) { $str = str_replace('<!-- -->', '', $str); ...
- ubuntu16.4安装后做的事情
1.安装搜狗拼音输入法 http://pinyin.sogou.com/linux/help.php 2.安装谷歌浏览器 http://jingyan.baidu.com/article/335530 ...