月球大数据地理空间分析展示平台-【后端】-月球后台服务
13693261870
2023-06-02 c31e03f0e51214a524d3fc34d30f3459698ff625
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
package com.moon.server.extend;
 
import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.metadata.TableFieldInfo;
import com.baomidou.mybatisplus.core.metadata.TableInfo;
import com.baomidou.mybatisplus.core.toolkit.sql.SqlScriptUtils;
import com.moon.server.entity.all.StaticData;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlSource;
 
/**
 * 批量更新方法
 * @author WWW
 */
@SuppressWarnings("ALL")
public class UpdateBatchMethod extends AbstractMethod {
    /**
     * update user set name = "a", age = 17 where id = 1;
     * update user set name = "b", age = 18 where id = 2;
     * <script>
     * <foreach collection="list" item="item" separator=";">
     * update user
     * <set>
     * <if test="item.name != null and item.name != ''">
     * name = #{item.name,jdbcType=VARCHAR},
     * </if>
     * <if test="item.age != null">
     * age = #{item.age,jdbcType=INTEGER},
     * </if>
     * </set>
     * where id = #{item.id,jdbcType=INTEGER}
     * </foreach>
     * </script>
     */
    @Override
    public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
        String sql = "<script>\n<foreach collection=\"list\" item=\"item\" separator=\";\">\nupdate %s %s where %s=#{%s} %s\n</foreach>\n</script>";
        String additional = tableInfo.isWithVersion() ? tableInfo.getVersionFieldInfo().getVersionOli("item", "item.") : "" + tableInfo.getLogicDeleteSql(true, true);
        //String setSql = sqlSet(tableInfo.isWithLogicDelete(), false, tableInfo, false, "item", "item.");
        String setSql = getSqlSet(tableInfo.isWithLogicDelete(), false, tableInfo, false, "item", "item.");
        String sqlResult = String.format(sql, tableInfo.getTableName(), setSql, tableInfo.getKeyColumn(), "item." + tableInfo.getKeyProperty(), additional);
 
        // update %s %s where %s=#{%s} %s
        // update tab set a=#{a} where gid=1
 
        SqlSource sqlSource = languageDriver.createSqlSource(configuration, sqlResult, modelClass);
 
        // 第三个参数必须和RootMapper的自定义方法名一致
        return this.addUpdateMappedStatement(mapperClass, modelClass, "updateBatch", sqlSource);
    }
 
    private String getSqlSet(boolean logic, boolean ew, TableInfo table, boolean judgeAliasNull, final String alias, final String prefix) {
        // String sqlScript = table.getAllSqlSet(logic, prefix);
        String sqlScript = getSqlSet(table);
        if (judgeAliasNull) {
            sqlScript = SqlScriptUtils.convertIf(sqlScript, String.format("%s != null", alias), true);
        }
        if (ew) {
            sqlScript = sqlScript + "\n";
            sqlScript = sqlScript + this.convertIfEwParam("ew.sqlSet", false);
        }
 
        sqlScript = SqlScriptUtils.convertSet(sqlScript);
 
        return sqlScript;
    }
 
    private String getSqlSet(TableInfo tableInfo) {
        StringBuilder sb = new StringBuilder();
        for (TableFieldInfo f : tableInfo.getFieldList()) {
            if (StaticData.UPDATE_EXCLUDE_FIELDS.contains(f.getProperty())) {
                continue;
            }
 
            if ("geom".equals(f.getProperty())) {
                sb.append("<if test=\"item['geom'] != null\">geom=${item.geom},</if>\n");
                continue;
            }
 
            sb.append(String.format("<if test=\"item['%s'] != null\">%s=#{item.%s},</if>\n", f.getProperty(), f.getColumn(), f.getProperty()));
        }
        sb.deleteCharAt(sb.length() - 1);
 
        return sb.toString();
    }
}