zoukankan      html  css  js  c++  java
  • 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+"行数据");

    }

    运行结果截图:

     

    希望能帮助到大家~。~

    ================

    亲测可用,但是不知道效率到底如何。

  • 相关阅读:
    Effective_STL 学习笔记(三十一) 了解你的排序选择
    Effective_STL 学习笔记(三十) 确保目标区间足够大
    Effective_STL 学习笔记(二十九) 需要一个一个字符输入时考虑使用 istreambuf_iterator
    maven 项目 配置docker镜像生成(dockerfile-maven-plugin)
    docker容器时间不对及java程序时间不对解决
    spring boot 下websocket实现的两种方法
    封装下Excel导出
    python安装出现的证书问题
    k8s安装
    ssh免密登录
  • 原文地址:https://www.cnblogs.com/winkey4986/p/3915151.html
Copyright © 2011-2022 走看看