欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

mybatis批量更新

程序员文章站 2022-03-10 18:38:26
...

Mybatis批量更新

批量操作就不进行赘述了。减少服务器与数据库之间的交互。网上有很多关于批量插入还有批量删除的帖子。但是批量更新却没有详细的解决方案。

实现目标

这里主要讲的是1张table中。根据不同的id值,来update不同的property。

数据表:1张。Tblsupertitleresult。错题结果统计。

表结构:

mybatis批量更新

 

表中每一条数据必须通过两个字段来确定: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

    privateStringtitleId;

    privateStringtitleIdNew;

    privateStringresult;

    privateStringcheckState;

    privateStringisCollect;

    privateStringtimes;

    privateStringwrongDate;

    privateStringwrongNum;

    privateStringcollectDate;

    privateStringuserHhCode;

    privateStringcorrectDate;

    privateStringtid;// 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  

  <updateid="batchUpdate">

            update tblsupertitleresult

            <trimprefix="set"suffixOverrides=",">

            <trimprefix="checkState =case"suffix="end,">

                <foreachcollection="list"item="i" index="index">

                        <iftest="i.checkState!=null">

                         when (userHhCode=#{i.userHhCode} and titleId=#{i.titleId}) then #{i.checkState}

                        </if>

                </foreach>

             </trim>

             <trimprefix=" correctDate =case" suffix="end,">

                <foreachcollection="list"item="i" index="index">

                        <iftest="i.correctDate!=null">

                         when (userHhCode=#{i.userHhCode} and titleId=#{i.titleId}) then #{i.correctDate}

                        </if>

                </foreach>

             </trim>

             <trimprefix="result =case" suffix="end," >

                <foreachcollection="list"item="i" index="index">

                        <iftest="i.result!=null">

                         when (userHhCode=#{i.userHhCode} and titleId=#{i.titleId}) then #{i.result}

                        </if>

                </foreach>

             </trim>

             </trim>

            where

            <foreachcollection="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批量更新

转载至https://blog.csdn.net/cyd1919/article/details/8088402