管道基础大数据平台系统开发-【后端】-Server
1
sws
2022-11-26 ab849f796bdc17236a95ea5fe5c166fb8f24a75c
src/main/java/com/lf/server/extend/InsertBatchMethod.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,76 @@
package com.lf.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.lf.server.helper.GdbHelper;
import org.apache.ibatis.executor.keygen.NoKeyGenerator;
import org.apache.ibatis.mapping.MappedStatement;
import org.apache.ibatis.mapping.SqlSource;
/**
 * æ‰¹é‡æ’入方法
 * @author WWW
 */
@SuppressWarnings("ALL")
public class InsertBatchMethod extends AbstractMethod {
    /**
     * insert into user(id, name, age) values (1, "a", 17), (2, "b", 18);
     * <script>
     * insert into user(id, name, age) values
     * <foreach collection="list" item="item" index="index" open="(" separator="),(" close=")">
     * #{item.id}, #{item.name}, #{item.age}
     * </foreach>
     * </script>
     */
    @Override
    public MappedStatement injectMappedStatement(Class<?> mapperClass, Class<?> modelClass, TableInfo tableInfo) {
        final String sql = "<script>insert into %s %s values %s</script>";
        final String fieldSql = prepareFieldSql(tableInfo);
        final String valueSql = prepareValuesSql(tableInfo);
        final String sqlResult = String.format(sql, tableInfo.getTableName(), fieldSql, valueSql);
        SqlSource sqlSource = languageDriver.createSqlSource(configuration, sqlResult, modelClass);
        // ç¬¬ä¸‰ä¸ªå‚数必须和RootMapper的自定义方法名一致
        return this.addInsertMappedStatement(mapperClass, modelClass, "insertBatch", sqlSource, new NoKeyGenerator(), null, null);
    }
    private String prepareFieldSql(TableInfo tableInfo) {
        StringBuilder fieldSql = new StringBuilder();
        // fieldSql.append(tableInfo.getKeyColumn()).append(",")
        // tableInfo.getFieldList().forEach(x -> fieldSql.append(x.getColumn()).append(","))
        for (TableFieldInfo f : tableInfo.getFieldList()) {
            if (GdbHelper.excludeFields.contains(f.getColumn())) {
                continue;
            }
            fieldSql.append(f.getColumn()).append(",");
        }
        fieldSql.delete(fieldSql.length() - 1, fieldSql.length());
        fieldSql.insert(0, "(");
        fieldSql.append(")");
        return fieldSql.toString();
    }
    private String prepareValuesSql(TableInfo tableInfo) {
        final StringBuilder valueSql = new StringBuilder();
        valueSql.append("<foreach collection=\"list\" item=\"item\" index=\"index\" open=\"(\" separator=\"),(\" close=\")\">");
        // valueSql.append("#{item.").append(tableInfo.getKeyProperty()).append("},")
        // tableInfo.getFieldList().forEach(x -> valueSql.append("#{item.").append(x.getProperty()).append("},"))
        for (TableFieldInfo f : tableInfo.getFieldList()) {
            if (GdbHelper.excludeFields.contains(f.getColumn())) {
                continue;
            }
            valueSql.append("geom".equals(f.getColumn()) ? "${item." : "#{item.").append(f.getProperty()).append("},");
        }
        valueSql.delete(valueSql.length() - 1, valueSql.length());
        valueSql.append("</foreach>");
        return valueSql.toString();
    }
}