mybatis 逆向工程 批量插入插件

4 篇文章 0 订阅

代码示例 Wiki - Gitee.com

 mybatis-generator-core对应的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!--
 generator.xml
-->
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<!-- 配置参考 http://mybatis.org/generator/configreference/xmlconfig.html -->
<generatorConfiguration>
    <context id="testTables" targetRuntime="MyBatis3">

        <property name="javaFileEncoding" value="UTF-8"/>
        <!-- 为模型生成序列化方法-->
        <plugin type="org.mybatis.generator.plugins.SerializablePlugin"/>
        <!-- 为生成的Java模型创建一个toString方法 -->
        <plugin type="org.mybatis.generator.plugins.ToStringPlugin"/>
        <!--生成mapper.xml时覆盖原文件-->
        <plugin type="org.mybatis.generator.plugins.UnmergeableXmlMappersPlugin" />
        <!--生成EqualsHashCode-->
        <plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin" />

        <plugin type="org.mybatis.generator.plugins.CaseInsensitiveLikePlugin" />
        <!-- 查出所有数据然后截取
        <plugin type="org.mybatis.generator.plugins.RowBoundsPlugin" />
        -->
        <!-- 自定义分页插件 -->
        <plugin type="com.ctl.MySqlLimitPlugin"/>
        <!-- 批量插入插件 MyColumnPlugin和BatchInsertPlugin需要一起使用-->
        <plugin type="com.ctl.MyColumnPlugin"/>
        <plugin type="com.ctl.BatchInsertPlugin"/>

        <commentGenerator type="org.mybatis.generator.internal.DefaultCommentGenerator">
            <property name="suppressDate" value="true"/>
            <property name="suppressAllComments" value="true"/> <!-- 去除自动注释 -->
        </commentGenerator>
        <!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
        <!-- &amp;=&   &gt;=> &lt;=< -->
        <jdbcConnection
                driverClass="com.mysql.cj.jdbc.Driver"
                connectionURL="jdbc:mysql://10.11.185.31:3306/test?verifyServerCertificate=false&amp;useSSL=false"
                userId="root"
                password="root@123@CTL"/>

        <!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和
            NUMERIC 类型解析为java.math.BigDecimal -->
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <!-- targetProject:生成PO类的位置 -->
        <javaModelGenerator targetPackage="com.ctl.po" targetProject="/home/gitee/mybatis-generator-core/src/main/java">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false"/>
            <!-- 从数据库返回的值被清理前后的空格 -->
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>
        <!-- targetProject:mapper映射文件生成的位置 -->
        <sqlMapGenerator targetPackage="com.ctl.mapper" targetProject="/home/gitee/mybatis-generator-core/src/main/resources">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false"/>
        </sqlMapGenerator>
        <!-- targetPackage:mapper接口生成的位置 -->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.ctl.mapper" targetProject="/home/gitee/mybatis-generator-core/src/main/java">
            <!-- enableSubPackages:是否让schema作为包的后缀 -->
            <property name="enableSubPackages" value="false"/>
        </javaClientGenerator>

        <!-- 指定数据库表 -->
        <!--
            <table tableName="goods_info" domainObjectName="DispatchWayList" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>
       -->
        <table tableName="tb_test"></table>

    </context>
</generatorConfiguration>

 插件1

package com.ctl;

import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.PluginAdapter;
import org.mybatis.generator.api.dom.java.*;
import org.mybatis.generator.codegen.mybatis3.ListUtilities;
import org.mybatis.generator.internal.util.StringUtility;

import java.util.Iterator;
import java.util.List;
import java.util.Properties;

public class MyColumnPlugin extends PluginAdapter {
    public static final String ENUM_NAME = "Columns";
    private boolean useColumnRoot;

    public MyColumnPlugin() {
    }

    public void setProperties(Properties properties) {
        super.setProperties(properties);
        this.useColumnRoot = StringUtility.isTrue(properties.getProperty("useColumnRoot"));
    }

    public boolean validate(List<String> warnings) {
        return true;
    }

    public boolean modelBaseRecordClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
        this.generateToString(introspectedTable, topLevelClass);
        return true;
    }

    public boolean modelRecordWithBLOBsClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
        this.generateToString(introspectedTable, topLevelClass);
        return true;
    }

    public boolean modelPrimaryKeyClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
        this.generateToString(introspectedTable, topLevelClass);
        return true;
    }

    private void generateToString(IntrospectedTable introspectedTable, TopLevelClass topLevelClass) {
        String columnUp = "Column";
        String column = "column";
        FullyQualifiedJavaType fullyQualifiedJavaType = new FullyQualifiedJavaType(ENUM_NAME);
        InnerEnum innerEnum = new InnerEnum(fullyQualifiedJavaType);
        innerEnum.setVisibility(JavaVisibility.PUBLIC);
        List<IntrospectedColumn> introspectedColumns = ListUtilities.removeIdentityAndGeneratedAlwaysColumns(introspectedTable.getAllColumns());
        Iterator var = introspectedColumns.iterator();
        while (var.hasNext()) {
            IntrospectedColumn introspectedColumn = (IntrospectedColumn) var.next();
            innerEnum.getEnumConstants().add(introspectedColumn.getActualColumnName().toUpperCase() + "(\"" + introspectedColumn.getActualColumnName() + "\")");
        }
        Field field = new Field(column, FullyQualifiedJavaType.getStringInstance());
        field.setName(column);
        field.setVisibility(JavaVisibility.PRIVATE);
        field.setType(FullyQualifiedJavaType.getStringInstance());
        innerEnum.addField(field);

        Method method = new Method(ENUM_NAME);
        method.setConstructor(true);
        method.setVisibility(JavaVisibility.DEFAULT);
        method.setReturnType(fullyQualifiedJavaType);
        method.addBodyLine("this." + column + "=" + column + ";");
        method.addParameter(new Parameter(FullyQualifiedJavaType.getStringInstance(), column));
        innerEnum.addMethod(method);


        Method setColumn = new Method("set" + columnUp);
        setColumn.setName("set" + columnUp);
        setColumn.setVisibility(JavaVisibility.PUBLIC);
        setColumn.addParameter(new Parameter(FullyQualifiedJavaType.getStringInstance(), column));
        setColumn.addBodyLine("this." + column + " = " + column + ";");
        innerEnum.addMethod(setColumn);

        Method getColumn = new Method("get" + columnUp);
        getColumn.setName("get" + columnUp);
        getColumn.setVisibility(JavaVisibility.PUBLIC);
        getColumn.setReturnType(FullyQualifiedJavaType.getStringInstance());
        getColumn.addBodyLine("return " + column + ";");
        innerEnum.addMethod(getColumn);

        topLevelClass.addInnerEnum(innerEnum);
    }
}

 插件2

package com.ctl;

/*
 * Copyright (c) 2017.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */


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.java.*;
import org.mybatis.generator.api.dom.xml.*;
import org.mybatis.generator.codegen.mybatis3.ListUtilities;
import org.mybatis.generator.codegen.mybatis3.MyBatis3FormattingUtilities;
import org.mybatis.generator.codegen.mybatis3.xmlmapper.elements.InsertElementGenerator;
import org.mybatis.generator.internal.util.StringUtility;
import org.mybatis.generator.api.dom.xml.XmlElement;

import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

/**
 * ---------------------------------------------------------------------------
 * 批量插入插件
 * ---------------------------------------------------------------------------
 *
 * @author: hewei
 * @time:2017/1/13 9:33
 * ---------------------------------------------------------------------------
 */
public class BatchInsertPlugin extends PluginAdapter {
    public static final String METHOD_BATCH_INSERT = "batchInsert";  // 方法名
    public static final String METHOD_BATCH_INSERT_SELECTIVE = "batchInsertSelective";  // 方法名
    public static final String PRO_ALLOW_MULTI_QUERIES = "allowMultiQueries";   // property allowMultiQueries
    private boolean allowMultiQueries = false;  // 是否允许多sql提交

    /**
     * {@inheritDoc}
     */
    @Override
    public boolean validate(List<String> warnings) {
        return true;
    }

    public void setProperties(Properties properties) {
        super.setProperties(properties);
        this.allowMultiQueries = StringUtility.isTrue(properties.getProperty("allowMultiQueries"));
    }

    /**
     * Java Client Methods 生成
     * 具体执行顺序 http://www.mybatis.org/generator/reference/pluggingIn.html
     *
     * @param interfaze
     * @param introspectedTable
     * @return
     */
    @Override
    public boolean clientGenerated(Interface interfaze, IntrospectedTable introspectedTable) {
        // 1. batchInsert
        FullyQualifiedJavaType listType = FullyQualifiedJavaType.getNewListInstance();
        listType.addTypeArgument(introspectedTable.getRules().calculateAllFieldsClass());
        Method batchInsertSelectiveMethod = new Method(METHOD_BATCH_INSERT_SELECTIVE);
        batchInsertSelectiveMethod.setReturnType(FullyQualifiedJavaType.getIntInstance());
        batchInsertSelectiveMethod.setVisibility(JavaVisibility.DEFAULT);
        batchInsertSelectiveMethod.addParameter(new Parameter(listType, "list", "@Param(\"list\")"));
        FullyQualifiedJavaType selectiveType = new FullyQualifiedJavaType(introspectedTable.getRules().calculateAllFieldsClass().getShortName() + "." + MyColumnPlugin.ENUM_NAME);
        batchInsertSelectiveMethod.addParameter(new Parameter(selectiveType, "selective", "@Param(\"selective\")", true));
        batchInsertSelectiveMethod.setAbstract(true);

        Method batchInsertMethod = new Method(METHOD_BATCH_INSERT);
        batchInsertMethod.setReturnType(FullyQualifiedJavaType.getIntInstance());
        batchInsertMethod.setVisibility(JavaVisibility.DEFAULT);
        batchInsertMethod.addParameter(new Parameter(listType, "list", "@Param(\"list\")"));
        batchInsertMethod.setAbstract(true);

        interfaze.addMethod(batchInsertSelectiveMethod);
        interfaze.addMethod(batchInsertMethod);
        return true;
    }

    /**
     * SQL Map Methods 生成
     * 具体执行顺序 http://www.mybatis.org/generator/reference/pluggingIn.html
     * {@link InsertElementGenerator}
     *
     * @param document
     * @param introspectedTable
     * @return
     */
    @Override
    public boolean sqlMapDocumentGenerated(Document document, IntrospectedTable introspectedTable) {
        // 1. batchInsert
        XmlElement batchInsertEle = new XmlElement("insert");
        batchInsertEle.addAttribute(new Attribute("id", METHOD_BATCH_INSERT));
        // 参数类型
        batchInsertEle.addAttribute(new Attribute("parameterType", "map"));
        batchInsertEle.addElement(new TextElement("insert into " + introspectedTable.getFullyQualifiedTableNameAtRuntime()));
        List<IntrospectedColumn> allColumns = introspectedTable.getAllColumns();
        StringBuffer buffer = new StringBuffer();
        buffer.append("(");
        for (int i = 0; i < allColumns.size(); i++) {
            IntrospectedColumn introspectedColumn = allColumns.get(i);
            if (i != allColumns.size() - 1) {
                buffer.append(introspectedColumn.getActualColumnName()).append(",");
            } else {
                buffer.append(introspectedColumn.getActualColumnName());
            }
        }
        buffer.append(")");

        batchInsertEle.addElement(new TextElement(buffer.toString()));
        StringBuilder valuesClause = new StringBuilder();
        valuesClause.append("("); //$NON-NLS-1$
        List<IntrospectedColumn> columns = ListUtilities.removeIdentityAndGeneratedAlwaysColumns(introspectedTable.getAllColumns());
        for (int i = 0; i < columns.size(); i++) {
            IntrospectedColumn introspectedColumn = columns.get(i);
            valuesClause.append(MyBatis3FormattingUtilities.getParameterClause(introspectedColumn,"item."));
            if (i + 1 < columns.size()) {
                valuesClause.append(", "); //$NON-NLS-1$
            }
        }

        valuesClause.append(')');
        // 添加foreach节点
        XmlElement foreachElement = new XmlElement("foreach");
        foreachElement.addAttribute(new Attribute("collection", "list"));
        foreachElement.addAttribute(new Attribute("item", "item"));
        foreachElement.addAttribute(new Attribute("separator", ","));
        foreachElement.addElement(new TextElement(valuesClause.toString()));
        // values 构建
        batchInsertEle.addElement(new TextElement("values"));
        batchInsertEle.addElement(foreachElement);
        document.getRootElement().addElement(batchInsertEle);

        // 2. batchInsertSelective
        XmlElement batchInsertSelectiveEle = new XmlElement("insert");
        batchInsertSelectiveEle.addAttribute(new Attribute("id", METHOD_BATCH_INSERT_SELECTIVE));
        // 参数类型
        batchInsertSelectiveEle.addAttribute(new Attribute("parameterType", "map"));
        batchInsertSelectiveEle.getElements().addAll(this.generateSelectiveEnhancedEles(introspectedTable));
        document.getRootElement().addElement(batchInsertSelectiveEle);
        return true;
    }

    /**
     * 生成insert selective 增强的插入语句
     *
     * @param introspectedTable
     * @return
     */
    private List<VisitableElement> generateSelectiveEnhancedEles(IntrospectedTable introspectedTable) {
        List<VisitableElement> eles = new ArrayList<>();
        eles.add(new TextElement("insert into " + introspectedTable.getFullyQualifiedTableNameAtRuntime() + " ("));
        XmlElement foreachInsertColumns = new XmlElement("foreach");
        foreachInsertColumns.addAttribute(new Attribute("collection", "selective"));
        foreachInsertColumns.addAttribute(new Attribute("item", "column"));
        foreachInsertColumns.addAttribute(new Attribute("separator", ","));
        foreachInsertColumns.addElement(new TextElement("${column.column}"));
        eles.add(foreachInsertColumns);
        eles.add(new TextElement(")"));
        // values
        eles.add(new TextElement("values"));
        // foreach values
        XmlElement foreachValues = new XmlElement("foreach");
        foreachValues.addAttribute(new Attribute("collection", "list"));
        foreachValues.addAttribute(new Attribute("item", "item"));
        foreachValues.addAttribute(new Attribute("separator", ","));
        foreachValues.addElement(new TextElement("("));
        // foreach 所有插入的列,比较是否存在
        XmlElement foreachInsertColumnsCheck = new XmlElement("foreach");
        foreachInsertColumnsCheck.addAttribute(new Attribute("collection", "selective"));
        foreachInsertColumnsCheck.addAttribute(new Attribute("item", "column"));
        foreachInsertColumnsCheck.addAttribute(new Attribute("separator", ","));

        // 所有表字段
        List<IntrospectedColumn> columns = ListUtilities.removeIdentityAndGeneratedAlwaysColumns(introspectedTable.getAllColumns());
        List<IntrospectedColumn> columns1 = ListUtilities.removeIdentityAndGeneratedAlwaysColumns(introspectedTable.getAllColumns());
        for (int i = 0; i < columns1.size(); i++) {
            IntrospectedColumn introspectedColumn = columns.get(i);
            XmlElement check = new XmlElement("if");
            check.addAttribute(new Attribute("test", "'" + introspectedColumn.getActualColumnName() + "'.toString() == column.column"));
            check.addElement(new TextElement(MyBatis3FormattingUtilities.getParameterClause(introspectedColumn, "item.")));
            foreachInsertColumnsCheck.addElement(check);
        }
        foreachValues.addElement(foreachInsertColumnsCheck);
        foreachValues.addElement(new TextElement(")"));
        eles.add(foreachValues);
        return eles;
    }
}

使用方式如下:

public class GeneratorSqlmapLinux {
    static Logger logger = LoggerFactory.getLogger(GeneratorSqlmapLinux.class);
    // http://mybatis.org/generator/configreference/xmlconfig.html   #xml配置
    // https://github.com/mybatis/generator/archive/mybatis-generator-1.4.1.zip
    public void generator() throws Exception {
        List<String> warnings = new ArrayList<>();
        boolean overwrite = true;
        File configFile = new File(GeneratorSqlmapLinux.class.getResource("generatorConfigLinux.xml").getPath());
        ConfigurationParser cp = new ConfigurationParser(warnings);
        Configuration config = cp.parseConfiguration(configFile);
        DefaultShellCallback callback = new DefaultShellCallback(overwrite);
        MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
        myBatisGenerator.generate(null);
//        List<GeneratedJavaFile> generatedJavaFiles = myBatisGenerator.getGeneratedJavaFiles();
//        List<GeneratedXmlFile> generatedXmlFiles = myBatisGenerator.getGeneratedXmlFiles();
//        logger.info("java files:" + generatedJavaFiles);
//        logger.info("xml files:" + generatedXmlFiles);
    }

    public static void main(String[] args) throws Exception {
        try {
            GeneratorSqlmapLinux generatorSqlmap = new GeneratorSqlmapLinux();
            generatorSqlmap.generator();

            SqlSession sqlSession = getSqlSession();
            sqlSession.commit(true);
            com.ctl.mapper.TbTestMapper mapper = sqlSession.getMapper(com.ctl.mapper.TbTestMapper.class);
            logger.info("{}",mapper.selectByPrimaryKey(1L));
            com.ctl.po.TbTestExample tbTestExample = new com.ctl.po.TbTestExample();
            tbTestExample.createCriteria().andIdGreaterThan(0L);
            tbTestExample.setOffset(0);
            tbTestExample.setLimit(10);
            logger.info("{}",mapper.selectByExample(tbTestExample));
            List<com.ctl.po.TbTest> list = new ArrayList<>();
            for (int i = 0; i < 30; i++) {
                com.ctl.po.TbTest tbTest = new com.ctl.po.TbTest();
                tbTest.setId(SnowflakeIdUtils.genID());
                tbTest.setSource(new Random().nextInt(999999)+1);
                tbTest.setVar(StringUtils.leftPad("0",new Random().nextInt(999999)+1));
                tbTest.setDefaultAddress(StringUtils.leftPad("0",6,"xx"+new Random().nextInt(9999)));
                list.add(tbTest);
                if(list.size()%10==0){
                    mapper.batchInsert(list);
                    list.clear();
                }
            }
            for (int i = 0; i < 30; i++) {
                com.ctl.po.TbTest tbTest = new com.ctl.po.TbTest();
                tbTest.setId(SnowflakeIdUtils.genID());
                tbTest.setSource(new Random().nextInt(999999)+1);
                tbTest.setVar(StringUtils.leftPad("0",new Random().nextInt(999999)+1));
                tbTest.setDefaultAddress(StringUtils.leftPad("0",6,"xx"+new Random().nextInt(9999)));
                list.add(tbTest);
                if(list.size()%10==0){
                    mapper.batchInsertSelective(list, TbTest.Columns.ID, TbTest.Columns.SOURCE, TbTest.Columns.DEFAULT_ADDRESS);
                    list.clear();
                }
            }
            sqlSession.commit();
            sqlSession.close();

        } catch (Exception e) {
            logger.error("",e);
        }
    }
    private static SqlSessionFactory sessionFactory;

    public static SqlSession getSqlSession() {
        try {
            // 流关闭了吗??
            InputStream iStream = Resources.getResourceAsStream("mybatis.xml");
            if (sessionFactory == null) {
                sessionFactory = new SqlSessionFactoryBuilder().build(iStream);
            }
            return sessionFactory.openSession();
        } catch (IOException e) {
            logger.error("",e);
        }
        return null;
    }

}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值