目录(?)[+]
Mybatis批量更新
批量操作就不进行赘述了。减少服务器与数据库之间的交互。网上有很多关于批量插入还有批量删除的帖子。但是批量更新却没有详细的解决方案。
这里主要讲的是1张table中。根据不同的id值,来update不同的property。
数据表:1张。Tblsupertitleresult。错题结果统计。
表结构:
表中每一条数据必须通过两个字段来确定:userHhCode+titleId
需要批量更新的字段是:correctDate,result,checkState。
我用的数据库是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
这里,首先介绍实体类。
public classWrongTitle { //manipulatetable of tblsupertitleresult privateString titleId; privateString titleIdNew; privateString result; privateString checkState; privateString isCollect; privateString times; privateString wrongDate; privateString wrongNum; privateString collectDate; privateString userHhCode; privateString correctDate; privateString tid;// teacher who will review this wrong title privateString 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>
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+"行数据"); }