case when语法及结合mybatis批量更新的方法

case when的使用方法主要有两种:

第一种:

UPDATE USER SET
USERNAME = 
CASE 
WHEN ID = 1 THEN 'USERNAME1'
WHEN ID = 2 THEN 'USERNAME2'
WHEN ID = 3 THEN 'USERNAME3'
END
,
PASSWORD = 
CASE 
WHEN ID = 1 THEN 'PASSWORD1'
WHEN ID = 2 THEN 'PASSWORD2'
WHEN ID = 3 THEN 'PASSWORD3'
END
image.gif

以上形态中case后未跟任何内容,而是采取了搜索的方式进行更新,也就是说在整张表中搜索ID=1,ID=2,ID=3的数据进行更新。

第二种:

UPDATE USER SET
PASSWORD =
CASE ID
WHEN 1 THEN 'PASSWORD1'
WHEN 2 THEN 'PASSWORD2'
WHEN 3 THEN 'PASSWORD3'
END,
USERNAME = 
CASE ID
WHEN 1 THEN 'USERNAME1'
WHEN 2 THEN 'USERNAME2'
WHEN 3 THEN 'USERNAME3'
END;
image.gif

case后跟某字段,然后通过判断该字段的值来进行更新,一般情况下两者通用。

批量更新方法:

需求描述:需要批量更新数据,但是需要更新的字段和信息不一致。

方法一:使用mybatis进行批量更新中的mapper文件如下:



    UPDATE ${user}
    
        
            
                
                    WHEN #{param.id} THEN #{param.id}
                
            
        
        
            
                
                    WHEN #{param.} THEN #{param.username}
                
            
        
        
            
                
                    WHEN #{param.id} THEN #{param.password}
                
            
        
    
    
        id in
        
            #{param.id}
        
    


image.gif

以上需求针对多列数据不同情况下的更新,如果各列数据相同,则使用where column in(a,b,c)这种形式进行批量更新。

方法二:

最初解决方法:



    
            UPDATE ${param.user}
            
                
                    username = #{param.username},
                
                
                    password = #{param.password}
                
            
            WHERE id = #{param.id}
        

image.gif

病情描述:上述方法再执行的时候总是会报错,但是sql并没有问题。

原因分析:因为JDBC默认不支持多个sql同时执行,所以需要设置JDBC的url。

解决方法:设置方法如下,

jdbc:mysql://localhost:3306/ngwf?allowMultiQueries=true&characterEncoding=utf-8

如果url中需要设置多个参数,使用&符号连接即可,和get方法的url类似。

批量更新性能:

使用逐条更新10000条用时3600ms,更新10000条时casewhen直接卡死,使用casewhen更新1000条用时9400ms,逐条更新1000条耗时1500ms,测试用表仅三个字段。

你可能感兴趣的:(case when语法及结合mybatis批量更新的方法)