Mybatis填坑日志(1)——batchUpdate与update使用区别

问题描述

今天使用Mybatis做批量插入的时候,程序一直报错:

…There is no getter for property named ‘list’ in ‘class com.XXX.XXX.XXX.AccountInfo’…

程序中AccountManageDao.java文件内容如下:

public batchUpdateStatus(List lstAccInfo) {
    String sqlId = "updateAccountCheckStatus"
    baseDao.batchUpdate(SQL_PREFIX.concat(sqlId), lstAccInfo);
}

AccountManage.mapper.xml文件中的sql语句为:

   
    
        
            UPDATE account_info
            
                
                    VERF_STATUS = #{item.verfStatus},
                
            
        WHERE INVOICE_CODE = #{item.invoiceCode} 
        AND INVOICE_NUM = #{item.invoiceNum} 
        AND INVOICE_TYPE = #{item.invoiceType}
        
    

解决方案

查阅各种资料后,确定自己的sql语句并没有写错,但是报错让我摸不着头脑,最后突然想到一个问题,既然已经是batchUpdate为什么还要自己在sql语句中做循环呢,于是乎把上面AccountManageDao.java文件内容修改如下:

public batchUpdateStatus(List lstAccInfo) {
    String sqlId = "updateAccountCheckStatus"
    baseDao.update(SQL_PREFIX.concat(sqlId), lstAccInfo);
}

于是问题完美解决,不再报错也成功批量更新了数据库。可是这个错误背后的原因还是让我产生了深思,我对于在工作和学习中接触到的很多知识理解得还不够深入,很多时候都是“知其然不知其所以然”的状态,所以这就导致一个问题会纠结很久,严重影响了工作的效率。问题产生的本质原因是batchUpdate函数会在函数内部循环传入的列表调用sql语句,所以就会使用AccountInfo类型作为编号为updateAccountCheckStatus语句的输入,而AccountInfo中并没有list属性的getter方法,这就导致了上面的报错。
如果希望使用batchUpdate函数调用sql语句,那么sql中就不需要写循环,直接按单笔处理即可,batchUpdate函数内部会循环调用下面的sql语句:

   
    
        UPDATE account_info
            
                
                    VERF_STATUS = #{item.verfStatus},
                
            
        WHERE INVOICE_CODE = #{item.invoiceCode} 
        AND INVOICE_NUM = #{item.invoiceNum} 
        AND INVOICE_TYPE = #{item.invoiceType}
    

源码分析

这个问题深入研究以后,可以发现很多值得探索的地方,比如分析batchUpdate的源码,并且学习Mybatis的xml文件的使用方法…

你可能感兴趣的:(数据库学习)