All Downloads are FREE. Search and download functionalities are using the official Maven repository.

mboog.generator.plugins.BatchInsertPlugin Maven / Gradle / Ivy

There is a newer version: 1.2.4
Show newest version
package mboog.generator.plugins;

import mboog.generator.plugins.upsert.AbstractUpsertPlugin;
import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.PluginAdapter;
import org.mybatis.generator.api.dom.OutputUtilities;
import org.mybatis.generator.api.dom.xml.Attribute;
import org.mybatis.generator.api.dom.xml.Document;
import org.mybatis.generator.api.dom.xml.TextElement;
import org.mybatis.generator.api.dom.xml.XmlElement;
import org.mybatis.generator.codegen.mybatis3.MyBatis3FormattingUtilities;
import org.mybatis.generator.internal.util.StringUtility;

import java.util.List;
import java.util.Map;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * @author LiYi
 */
public class BatchInsertPlugin extends PluginAdapter {

    private boolean readonly;

    @Override
    public void initialized(IntrospectedTable introspectedTable) {
        if ("VIEW".equalsIgnoreCase(introspectedTable.getTableType())) {
            readonly = true;
        } else {
            String readonly_pro = introspectedTable.getTableConfiguration().getProperty("readonly");
            readonly = StringUtility.isTrue(readonly_pro);
        }
    }

    @Override
    public boolean sqlMapDocumentGenerated(Document document, IntrospectedTable introspectedTable) {

        if (!readonly) {
            List columns;
            if (introspectedTable.getGeneratedKey() != null) {
                String generatedKeyColumn = introspectedTable.getGeneratedKey().getColumn();
                columns = introspectedTable.getAllColumns().stream()
                        .filter(n -> !n.getActualColumnName().equals(generatedKeyColumn))
                        .collect(Collectors.toList());
            } else {
                columns = introspectedTable.getAllColumns();
            }

            String tableName = introspectedTable.getFullyQualifiedTableNameAtRuntime();

            document.getRootElement().addElement(batchInsertXmlElement(tableName, columns));
            document.getRootElement().addElement(batchInsertSelectiveXmlElement(tableName, columns));

        }
        return super.sqlMapDocumentGenerated(document, introspectedTable);
    }

    private XmlElement batchInsertXmlElement(String tableName, List columns) {
        // 构建 batchInsert
        XmlElement batchInsertXml = new XmlElement("insert");
        batchInsertXml.addAttribute(new Attribute("id", "batchInsert"));
        batchInsertXml.addAttribute(new Attribute("parameterType", "java.util.List"));
        context.getCommentGenerator().addComment(batchInsertXml);
        batchInsertXml.addElement(new TextElement("insert into " + tableName + " ("));
        StringBuilder stringBuilderInto = new StringBuilder("  ");
        for (int i = 0; i < columns.size(); i += 4) {
            for (int x = 0; x < 4 && i + x < columns.size(); x++) {
                IntrospectedColumn column = columns.get(i + x);
                OutputUtilities.xmlIndent(stringBuilderInto,1);
                stringBuilderInto.append(MyBatis3FormattingUtilities.getEscapedColumnName(column));
                if (i + x < columns.size() - 1) {
                    stringBuilderInto.append(",");
                } else {
                    stringBuilderInto.append(" )");
                }
            }
            if (i + 4 < columns.size()) {
                OutputUtilities.newLine(stringBuilderInto);
            }
            OutputUtilities.xmlIndent(stringBuilderInto,2);
        }
        StringBuilder stringBuilderValues = new StringBuilder("(");
        for (int i = 0; i < columns.size(); i += 3) {
            for (int x = 0; x < 3 && i + x < columns.size(); x++) {
                IntrospectedColumn column = columns.get(i + x);
                String parameterClause = MyBatis3FormattingUtilities.getParameterClause(column);
                parameterClause = parameterClause.replace("#{", "#{listItem.");
                OutputUtilities.xmlIndent(stringBuilderValues,1);
                stringBuilderValues.append(parameterClause);

                if (i + x < columns.size() - 1) {
                    stringBuilderValues.append(",");
                } else {
                    stringBuilderValues.append(" )");
                }
            }
            if (i + 3 < columns.size()) {
                OutputUtilities.newLine(stringBuilderValues);
            }
            OutputUtilities.xmlIndent(stringBuilderValues,2);
        }
        batchInsertXml.addElement(new TextElement(stringBuilderInto.toString()));
        batchInsertXml.addElement(new TextElement("values"));
        XmlElement foreachXmlElement = new XmlElement("foreach");
        foreachXmlElement.addAttribute(new Attribute("collection", "list"));
        foreachXmlElement.addAttribute(new Attribute("item", "listItem"));
        foreachXmlElement.addAttribute(new Attribute("separator", ","));
        foreachXmlElement.addElement(new TextElement(stringBuilderValues.toString()));
        batchInsertXml.addElement(foreachXmlElement);
        return batchInsertXml;
    }

    private XmlElement batchInsertSelectiveXmlElement(String tableName, List columns) {
        // 构建 batchInsertSelective
        XmlElement batchInsertSelectiveXml = new XmlElement("insert");
        batchInsertSelectiveXml.addAttribute(new Attribute("id", "batchInsertSelective"));
        batchInsertSelectiveXml.addAttribute(new Attribute("parameterType", "java.util.List"));
        context.getCommentGenerator().addComment(batchInsertSelectiveXml);
        batchInsertSelectiveXml.addElement(new TextElement("insert into " + tableName));

        XmlElement trimIntoXmlElement = new XmlElement("trim");
        trimIntoXmlElement.addAttribute(new Attribute("suffixOverrides", ","));
        trimIntoXmlElement.addAttribute(new Attribute("prefix", "("));
        trimIntoXmlElement.addAttribute(new Attribute("suffix", ") values"));

        XmlElement foreachXmlElement = new XmlElement("foreach");
        foreachXmlElement.addAttribute(new Attribute("collection", "list"));
        foreachXmlElement.addAttribute(new Attribute("item", "listItem"));
        foreachXmlElement.addAttribute(new Attribute("separator", ","));

        XmlElement trimValueXmlElement = new XmlElement("trim");
        trimValueXmlElement.addAttribute(new Attribute("suffixOverrides", ","));
        trimValueXmlElement.addAttribute(new Attribute("prefix", "("));
        trimValueXmlElement.addAttribute(new Attribute("suffix", ")"));

        foreachXmlElement.addElement(trimValueXmlElement);
        for (int i = 0; i < columns.size(); i++) {
            IntrospectedColumn column = columns.get(i);

            XmlElement innerInfXmlElement = new XmlElement("if");
            String test = String.format("list[0].%s != null", column.getJavaProperty());
            innerInfXmlElement.addAttribute(new Attribute("test", test));
            innerInfXmlElement.addElement(new TextElement(MyBatis3FormattingUtilities.getEscapedColumnName(column) + ","));
            trimIntoXmlElement.addElement(innerInfXmlElement);

            XmlElement innerValueInfXmlElement = new XmlElement("if");
            String valueTest = String.format("list[0].%s != null", column.getJavaProperty());
            innerValueInfXmlElement.addAttribute(new Attribute("test", valueTest));
            String parameterClause = MyBatis3FormattingUtilities.getParameterClause(column);
            parameterClause = parameterClause.replace("#{", "#{listItem.");
            innerValueInfXmlElement.addElement(new TextElement(parameterClause + ","));
            trimValueXmlElement.addElement(innerValueInfXmlElement);
        }
        batchInsertSelectiveXml.addElement(trimIntoXmlElement);
        batchInsertSelectiveXml.addElement(foreachXmlElement);
        return batchInsertSelectiveXml;
    }


    @Override
    public boolean validate(List warnings) {
        return true;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy