原生的mybatis-generator不能满足需求时,需要扩展plugin,有两种方式。
第一种:
import java.util.List;
import org.mybatis.generator.api.IntrospectedTable;
import org.mybatis.generator.api.PluginAdapter;
import org.mybatis.generator.api.dom.java.Interface;
import org.mybatis.generator.api.dom.java.TopLevelClass;
import org.mybatis.generator.api.dom.xml.Document;
import org.mybatis.generator.codegen.mybatis3.javamapper.elements.AbstractJavaMapperMethodGenerator;
import org.mybatis.generator.codegen.mybatis3.xmlmapper.elements.AbstractXmlElementGenerator;
/**
* @author yinchen
*/
public class CustomPlugin extends PluginAdapter {
@Override
public boolean validate(List<String> warnings) {
return true;
}
@Override
public boolean clientGenerated(Interface interfaze, TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
AbstractJavaMapperMethodGenerator methodGenerator = new CustomJavaMapperMethodGenerator();
methodGenerator.setContext(context);
methodGenerator.setIntrospectedTable(introspectedTable);
methodGenerator.addInterfaceElements(interfaze);
return super.clientGenerated(interfaze, topLevelClass, introspectedTable);
}
@Override
public boolean sqlMapDocumentGenerated(Document document, IntrospectedTable introspectedTable) {
AbstractXmlElementGenerator elementGenerator = new CustomAbstractXmlElementGenerator();
elementGenerator.setContext(context);
elementGenerator.setIntrospectedTable(introspectedTable);
elementGenerator.addElements(document.getRootElement());
return super.sqlMapDocumentGenerated(document, introspectedTable);
}
}
import java.util.Set;
import java.util.TreeSet;
import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;
import org.mybatis.generator.api.dom.java.Interface;
import org.mybatis.generator.api.dom.java.JavaVisibility;
import org.mybatis.generator.api.dom.java.Method;
import org.mybatis.generator.api.dom.java.Parameter;
import org.mybatis.generator.codegen.mybatis3.javamapper.elements.AbstractJavaMapperMethodGenerator;
/**
* @author yinchen
*/
public class CustomJavaMapperMethodGenerator extends AbstractJavaMapperMethodGenerator {
@Override
public void addInterfaceElements(Interface interfaze) {
addInterfaceFind(interfaze);
addInterfaceList(interfaze);
addInterfacePageList(interfaze);
}
private void addInterfaceFind(Interface interfaze) {
// 先创建import对象
Set<FullyQualifiedJavaType> importedTypes = new TreeSet<>();
// 添加Lsit的包
importedTypes.add(FullyQualifiedJavaType.getNewListInstance());
// 创建方法对象
Method method = new Method();
// 设置该方法为public
method.setVisibility(JavaVisibility.PUBLIC);
// 设置返回类型是List
FullyQualifiedJavaType returnType = new FullyQualifiedJavaType(introspectedTable.getBaseRecordType());
// 方法对象设置返回类型对象
method.setReturnType(returnType);
// 设置方法名称为我们在IntrospectedTable类中初始化的 “selectByObject”
method.setName("find");
// 设置参数类型是对象
FullyQualifiedJavaType parameterType;
parameterType = new FullyQualifiedJavaType(introspectedTable.getBaseRecordType());
// import参数类型对象
importedTypes.add(parameterType);
// 为方法添加参数,变量名称record
method.addParameter(new Parameter(parameterType, "record")); //$NON-NLS-1$
//
addMapperAnnotations(interfaze, method);
context.getCommentGenerator().addGeneralMethodComment(method, introspectedTable);
if (context.getPlugins().clientSelectByPrimaryKeyMethodGenerated(method, interfaze, introspectedTable)) {
interfaze.addImportedTypes(importedTypes);
interfaze.addMethod(method);
}
}
private void addInterfaceList(Interface interfaze) {
// 先创建import对象
Set<FullyQualifiedJavaType> importedTypes = new TreeSet<FullyQualifiedJavaType>();
// 添加Lsit的包
importedTypes.add(FullyQualifiedJavaType.getNewListInstance());
// 创建方法对象
Method method = new Method();
// 设置该方法为public
method.setVisibility(JavaVisibility.PUBLIC);
// 设置返回类型是List
FullyQualifiedJavaType returnType = FullyQualifiedJavaType.getNewListInstance();
FullyQualifiedJavaType listType;
// 设置List的类型是实体类的对象
listType = new FullyQualifiedJavaType(introspectedTable.getBaseRecordType());
importedTypes.add(listType);
// 返回类型对象设置为List
returnType.addTypeArgument(listType);
// 方法对象设置返回类型对象
method.setReturnType(returnType);
// 设置方法名称为我们在IntrospectedTable类中初始化的 “selectByObject”
method.setName("list");
// 设置参数类型是对象
FullyQualifiedJavaType parameterType;
parameterType = new FullyQualifiedJavaType(introspectedTable.getBaseRecordType());
// import参数类型对象
importedTypes.add(parameterType);
// 为方法添加参数,变量名称record
method.addParameter(new Parameter(parameterType, "record")); //$NON-NLS-1$
//
addMapperAnnotations(interfaze, method);
context.getCommentGenerator().addGeneralMethodComment(method, introspectedTable);
if (context.getPlugins().clientSelectByPrimaryKeyMethodGenerated(method, interfaze, introspectedTable)) {
interfaze.addImportedTypes(importedTypes);
interfaze.addMethod(method);
}
}
private void addInterfacePageList(Interface interfaze) {
// 先创建import对象
Set<FullyQualifiedJavaType> importedTypes = new TreeSet<FullyQualifiedJavaType>();
// 添加Lsit的包
importedTypes.add(FullyQualifiedJavaType.getNewListInstance());
// 创建方法对象
Method method = new Method();
// 设置该方法为public
method.setVisibility(JavaVisibility.PUBLIC);
// 设置返回类型是List
FullyQualifiedJavaType returnType = FullyQualifiedJavaType.getNewListInstance();
FullyQualifiedJavaType listType;
// 设置List的类型是实体类的对象
listType = new FullyQualifiedJavaType(introspectedTable.getBaseRecordType());
importedTypes.add(listType);
// 返回类型对象设置为List
returnType.addTypeArgument(listType);
// 方法对象设置返回类型对象
method.setReturnType(returnType);
// 设置方法名称为我们在IntrospectedTable类中初始化的 “selectByObject”
method.setName("pageList");
// 设置参数类型是对象
FullyQualifiedJavaType parameterType;
parameterType = new FullyQualifiedJavaType(introspectedTable.getBaseRecordType());
// import参数类型对象
importedTypes.add(parameterType);
// 为方法添加参数,变量名称record
method.addParameter(new Parameter(parameterType, "record")); //$NON-NLS-1$
//
addMapperAnnotations(interfaze, method);
context.getCommentGenerator().addGeneralMethodComment(method, introspectedTable);
if (context.getPlugins().clientSelectByPrimaryKeyMethodGenerated(method, interfaze, introspectedTable)) {
interfaze.addImportedTypes(importedTypes);
interfaze.addMethod(method);
}
}
public void addMapperAnnotations(Interface interfaze, Method method) {
}
}
import org.mybatis.generator.api.IntrospectedColumn;
import org.mybatis.generator.api.dom.xml.Attribute;
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.codegen.mybatis3.xmlmapper.elements.AbstractXmlElementGenerator;
/**
* @author yinchen
*/
public class CustomAbstractXmlElementGenerator extends AbstractXmlElementGenerator {
@Override
public void addElements(XmlElement parentElement) {
// 增加base_query
XmlElement sql = new XmlElement("sql");
sql.addAttribute(new Attribute("id", "base_query"));
//在这里添加where条件
XmlElement selectTrimElement = new XmlElement("trim"); //设置trim标签
selectTrimElement.addAttribute(new Attribute("prefix", "WHERE"));
selectTrimElement.addAttribute(new Attribute("prefixOverrides", "AND | OR")); //添加where和and
StringBuilder sb = new StringBuilder();
for(IntrospectedColumn introspectedColumn : introspectedTable.getAllColumns()) {
XmlElement selectNotNullElement = new XmlElement("if"); //$NON-NLS-1$
sb.setLength(0);
sb.append("null != ");
sb.append(introspectedColumn.getJavaProperty());
selectNotNullElement.addAttribute(new Attribute("test", sb.toString()));
sb.setLength(0);
// 添加and
sb.append(" and ");
// 添加别名t
sb.append("t.");
sb.append(MyBatis3FormattingUtilities.getEscapedColumnName(introspectedColumn));
// 添加等号
sb.append(" = ");
sb.append(MyBatis3FormattingUtilities.getParameterClause(introspectedColumn));
selectNotNullElement.addElement(new TextElement(sb.toString()));
selectTrimElement.addElement(selectNotNullElement);
}
sql.addElement(selectTrimElement);
parentElement.addElement(sql);
// 公用select
sb.setLength(0);
sb.append("select ");
sb.append("t.* ");
sb.append("from ");
sb.append(introspectedTable.getFullyQualifiedTableNameAtRuntime());
sb.append(" t");
TextElement selectText = new TextElement(sb.toString());
// 公用include
XmlElement include = new XmlElement("include");
include.addAttribute(new Attribute("refid", "base_query"));
// 增加find
XmlElement find = new XmlElement("select");
find.addAttribute(new Attribute("id", "find"));
find.addAttribute(new Attribute("resultMap", "BaseResultMap"));
find.addAttribute(new Attribute("parameterType", introspectedTable.getBaseRecordType()));
find.addElement(selectText);
find.addElement(include);
parentElement.addElement(find);
// 增加list
XmlElement list = new XmlElement("select");
list.addAttribute(new Attribute("id", "list"));
list.addAttribute(new Attribute("resultMap", "BaseResultMap"));
list.addAttribute(new Attribute("parameterType", introspectedTable.getBaseRecordType()));
list.addElement(selectText);
list.addElement(include);
parentElement.addElement(list);
// 增加pageList
XmlElement pageList = new XmlElement("select");
pageList.addAttribute(new Attribute("id", "pageList"));
pageList.addAttribute(new Attribute("resultMap", "BaseResultMap"));
pageList.addAttribute(new Attribute("parameterType", introspectedTable.getBaseRecordType()));
pageList.addElement(selectText);
pageList.addElement(include);
parentElement.addElement(pageList);
}
}
第二种:
import static org.mybatis.generator.internal.util.messages.Messages.getString;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
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.FullyQualifiedJavaType;
import org.mybatis.generator.api.dom.java.Interface;
import org.mybatis.generator.api.dom.java.JavaVisibility;
import org.mybatis.generator.api.dom.java.Method;
import org.mybatis.generator.api.dom.java.Parameter;
import org.mybatis.generator.api.dom.java.TopLevelClass;
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;
/**
* 生产批量insert类
*/
public class BatchInsertPlugin extends PluginAdapter {
@Override
public boolean validate(List<String> list) {
return true;
}
/**
* 修改Mapper类
*/
@Override
public boolean clientGenerated(Interface interfaze, TopLevelClass topLevelClass,
IntrospectedTable introspectedTable) {
addBatchInsertMethod(interfaze, introspectedTable);
return super.clientGenerated(interfaze, topLevelClass, introspectedTable);
}
/**
* 修改Mapper.xml
*/
@Override
public boolean sqlMapDocumentGenerated(Document document, IntrospectedTable introspectedTable) {
addBatchInsertSelectiveXml(document, introspectedTable);
return super.sqlMapDocumentGenerated(document, introspectedTable);
}
private void addBatchInsertMethod(Interface interfaze, IntrospectedTable introspectedTable) {
// 设置需要导入的类
Set<FullyQualifiedJavaType> importedTypes = new TreeSet<FullyQualifiedJavaType>();
importedTypes.add(FullyQualifiedJavaType.getNewListInstance());
importedTypes.add(new FullyQualifiedJavaType(introspectedTable.getBaseRecordType()));
Method ibsmethod = new Method();
// 1.设置方法可见性
ibsmethod.setVisibility(JavaVisibility.PUBLIC);
// 2.设置返回值类型
FullyQualifiedJavaType ibsreturnType = FullyQualifiedJavaType.getIntInstance();// int型
ibsmethod.setReturnType(ibsreturnType);
// 3.设置方法名
ibsmethod.setName("insertBatch");
// 4.设置参数列表
FullyQualifiedJavaType paramType = FullyQualifiedJavaType.getNewListInstance();
FullyQualifiedJavaType paramListType;
if (introspectedTable.getRules().generateBaseRecordClass()) {
paramListType = new FullyQualifiedJavaType(introspectedTable.getBaseRecordType());
} else if (introspectedTable.getRules().generatePrimaryKeyClass()) {
paramListType = new FullyQualifiedJavaType(introspectedTable.getPrimaryKeyType());
} else {
throw new RuntimeException(getString("RuntimeError.12"));
}
paramType.addTypeArgument(paramListType);
ibsmethod.addParameter(new Parameter(paramType, "records"));
interfaze.addImportedTypes(importedTypes);
interfaze.addMethod(ibsmethod);
}
public void addBatchInsertSelectiveXml(Document document, IntrospectedTable introspectedTable) {
List<IntrospectedColumn> columns = introspectedTable.getAllColumns();
//获得要自增的列名
String incrementField = introspectedTable.getTableConfiguration().getProperties().getProperty("incrementField");
if (incrementField != null) {
incrementField = incrementField.toUpperCase();
}
XmlElement javaPropertyAndDbType = new XmlElement("trim");
javaPropertyAndDbType.addAttribute(new Attribute("prefix", " ("));
javaPropertyAndDbType.addAttribute(new Attribute("suffix", ")"));
javaPropertyAndDbType.addAttribute(new Attribute("suffixOverrides", ","));
XmlElement insertBatchElement = new XmlElement("insert");
insertBatchElement.addAttribute(new Attribute("id", "insertBatch"));
if (introspectedTable.getPrimaryKeyColumns().size() == 1) {
insertBatchElement.addAttribute(new Attribute("useGeneratedKeys", "true"));
insertBatchElement.addAttribute(
new Attribute("keyProperty", introspectedTable.getPrimaryKeyColumns().get(0).getJavaProperty()));
}
insertBatchElement.addAttribute(new Attribute("parameterType", "java.util.List"));
XmlElement trim1Element = new XmlElement("trim");
trim1Element.addAttribute(new Attribute("prefix", "("));
trim1Element.addAttribute(new Attribute("suffix", ")"));
trim1Element.addAttribute(new Attribute("suffixOverrides", ","));
for (IntrospectedColumn introspectedColumn : columns) {
String columnName = introspectedColumn.getActualColumnName();
if (!columnName.toUpperCase().equals(incrementField)) {//不是自增字段的才会出现在批量插入中
XmlElement iftest = new XmlElement("if");
iftest
.addAttribute(new Attribute("test", "list[0]." + introspectedColumn.getJavaProperty() + "!=null"));
iftest.addElement(new TextElement(columnName + ","));
trim1Element.addElement(iftest);
XmlElement trimiftest = new XmlElement("if");
trimiftest
.addAttribute(new Attribute("test", "item." + introspectedColumn.getJavaProperty() + "!=null"));
trimiftest.addElement(new TextElement(
"#{item." + introspectedColumn.getJavaProperty() + ",jdbcType=" + introspectedColumn
.getJdbcTypeName() + "},"));
javaPropertyAndDbType.addElement(trimiftest);
}
}
XmlElement foreachElement = new XmlElement("foreach");
foreachElement.addAttribute(new Attribute("collection", "list"));
foreachElement.addAttribute(new Attribute("index", "index"));
foreachElement.addAttribute(new Attribute("item", "item"));
foreachElement.addAttribute(new Attribute("separator", ","));
insertBatchElement.addElement(
new TextElement("insert into " + introspectedTable.getAliasedFullyQualifiedTableNameAtRuntime()));
insertBatchElement.addElement(trim1Element);
insertBatchElement.addElement(new TextElement(" values "));
foreachElement.addElement(javaPropertyAndDbType);
insertBatchElement.addElement(foreachElement);
document.getRootElement().addElement(insertBatchElement);
}
}
使用Main方式运行:
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import org.mybatis.generator.api.MyBatisGenerator;
import org.mybatis.generator.config.Configuration;
import org.mybatis.generator.config.xml.ConfigurationParser;
import org.mybatis.generator.internal.DefaultShellCallback;
/**
* @author yinchen
*/
public class GenMain {
/**
* 使用 main 方式时,generatorConfig.xml中
* targetProject="spring/mybatis/src/main/java" 需要是项目全路径
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
String path =
Thread.currentThread().getContextClassLoader().getResource("mybatis/generatorConfig.xml").getPath();
System.out.println(path);
File configFile = new File(path);
List<String> warnings = new ArrayList<>();
boolean overwrite = true;
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);
System.out.println(warnings);
}
}
参考:https://www.cnblogs.com/se7end/p/9293755.html