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

以上形态中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;

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

批量更新方法:

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

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

<!--caseWhen形式更新-->
<update id="testCaseWhen" parameterType="java.util.Map">
    UPDATE ${user}
    <set>
        <trim prefix="id= CASE id" suffix="END,">
            <foreach collection="list" item="param">
                <if test="param.id != null and id != ''">
                    WHEN #{param.id} THEN #{param.id}
                </if>
            </foreach>
        </trim>
        <trim prefix="username = CASE id" suffix="END,">
            <foreach collection="list" item="param">
                <if test="param.username != null and param.username != ''">
                    WHEN #{param.} THEN #{param.username}
                </if>
            </foreach>
        </trim>
        <trim prefix="password = CASE id" suffix="END,">
            <foreach collection="list" item="param">
                <if test="param.password != null and param.password != ''">
                    WHEN #{param.id} THEN #{param.password}
                </if>
            </foreach>
        </trim>
    </set>
    <where>
        id in
        <foreach collection="list" item="param" separator="," open="(" close=")">
            #{param.id}
        </foreach>
    </where>
</update>

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

方法二:

最初解决方法:

<!--测试参数为list-->
<update id="testMybatis" parameterType="list">
    <foreach collection="list" item="param" separator=";">
            UPDATE ${param.user}
            <set>
                <if test="param.username != null and param.username != ''">
                    username = #{param.username},
                </if>
                <if test="param.password != null and param.password != ''">
                    password = #{param.password}
                </if>
            </set>
            WHERE id = #{param.id}
        </foreach>
</update>

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

原因分析:因为JDBC默认不支持多个sql同时执行,所以需要设置JDBC的url,增加参数allowMultiQueries=true

解决方法:设置方法如下

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

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

批量更新性能:

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

06-26 16:58