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>
<!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
<!-- &=& >=> <=< -->
<jdbcConnection
driverClass="com.mysql.cj.jdbc.Driver"
connectionURL="jdbc:mysql://10.11.185.31:3306/test?verifyServerCertificate=false&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;
}
}