这篇文章给大家介绍什么是Mybatis-Generator扩展自定义生成,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

Mybatis-Generator 可自动生成Model、Dao、Mapper代码,但其自带生成的代码存在以下问题:

生成的注释不是我们想要的,我们期望的是根据数据库表、字段生成不同的注释;

分页代码生成缺失,每个公司的分页方式不同,尤其是老久项目或已发布API,不能随意变动,那么如何自适应分页代码生成;

Mapper.xml没有group by相关代码生成;

重复生成代码时,Mapper.xml并不是覆盖原代码,而是对内容进行了追加;

序列化,mybatis-generator内置了SerializablePlugin,但仅对Model,并没有对 Example序列化,在一些开发中是不够的;

对Service Layer代码没有生成。

一、注释的自定义生成

根据数据库表或字段的COMMENT生成注释。@Date 生成的时间可根据需要自己定义格式。

packagerun.override;importjava.util.Date;importjava.util.Properties;importorg.mybatis.generator.api.IntrospectedColumn;importorg.mybatis.generator.api.IntrospectedTable;importorg.mybatis.generator.api.dom.java.CompilationUnit;importorg.mybatis.generator.api.dom.java.Field;importorg.mybatis.generator.api.dom.java.InnerClass;importorg.mybatis.generator.api.dom.java.InnerEnum;importorg.mybatis.generator.api.dom.java.JavaElement;importorg.mybatis.generator.api.dom.java.Method;importorg.mybatis.generator.api.dom.java.Parameter;importorg.mybatis.generator.api.dom.xml.XmlElement;importorg.mybatis.generator.internal.DefaultCommentGenerator;importorg.mybatis.generator.internal.util.StringUtility;/***CommentGenerator*@ClassNameCommentGenerator*@Description*@authorMarvis*/publicclassCommentGeneratorextendsDefaultCommentGenerator{privatePropertiesproperties;privatebooleansuppressDate;privatebooleansuppressAllComments;publicCommentGenerator(){this.properties=newProperties();this.suppressDate=false;this.suppressAllComments=false;}publicvoidaddJavaFileComment(CompilationUnitcompilationUnit){compilationUnit.addFileCommentLine("/***copyright(c)2019Marvis***/");}/***XMLfileComment*/publicvoidaddComment(XmlElementxmlElement){if(this.suppressAllComments){return;}}publicvoidaddRootComment(XmlElementrootElement){}publicvoidaddConfigurationProperties(Propertiesproperties){this.properties.putAll(properties);this.suppressDate=StringUtility.isTrue(properties.getProperty("suppressDate"));this.suppressAllComments=StringUtility.isTrue(properties.getProperty("suppressAllComments"));}protectedvoidaddJavadocTag(JavaElementjavaElement,booleanmarkAsDoNotDelete){StringBuildersb=newStringBuilder();sb.append("*");sb.append("@date");Strings=getDateString();if(s!=null){sb.append('');sb.append(s);}javaElement.addJavaDocLine(sb.toString());}protectedStringgetDateString(){if(this.suppressDate){returnnull;}returnnewDate().toString();}/***CommentofExampleinnerclass(GeneratedCriteria,Criterion)*/publicvoidaddClassComment(InnerClassinnerClass,IntrospectedTableintrospectedTable){if(this.suppressAllComments){return;}innerClass.addJavaDocLine("/**");innerClass.addJavaDocLine("*"+introspectedTable.getFullyQualifiedTable().getDomainObjectName()+"<p/>");innerClass.addJavaDocLine("*"+introspectedTable.getFullyQualifiedTable().toString());addJavadocTag(innerClass,false);innerClass.addJavaDocLine("*/");}publicvoidaddEnumComment(InnerEnuminnerEnum,IntrospectedTableintrospectedTable){if(this.suppressAllComments){return;}StringBuildersb=newStringBuilder();innerEnum.addJavaDocLine("/**");innerEnum.addJavaDocLine("*"+introspectedTable.getFullyQualifiedTable().getAlias()+"<p/>");innerEnum.addJavaDocLine("*"+introspectedTable.getFullyQualifiedTable());innerEnum.addJavaDocLine(sb.toString());addJavadocTag(innerEnum,false);innerEnum.addJavaDocLine("*/");}/***entityfiledComment*/publicvoidaddFieldComment(Fieldfield,IntrospectedTableintrospectedTable,IntrospectedColumnintrospectedColumn){if(this.suppressAllComments){return;}//if(introspectedColumn.getRemarks()!=null&&!introspectedColumn.getRemarks().trim().equals(""))field.addJavaDocLine("/**");field.addJavaDocLine("*"+introspectedColumn.getRemarks());field.addJavaDocLine("*@author");field.addJavaDocLine("*@date"+getDateString());field.addJavaDocLine("*@return");field.addJavaDocLine("*/");}/***CommentofEXamplefiled*/publicvoidaddFieldComment(Fieldfield,IntrospectedTableintrospectedTable){if(this.suppressAllComments){return;}field.addJavaDocLine("/**");addJavadocTag(field,false);field.addJavaDocLine("*/");}/***CommentofExamplemethod*/publicvoidaddGeneralMethodComment(Methodmethod,IntrospectedTableintrospectedTable){if(this.suppressAllComments){return;}}/****entityGetterComment*/publicvoidaddGetterComment(Methodmethod,IntrospectedTableintrospectedTable,IntrospectedColumnintrospectedColumn){if(this.suppressAllComments){return;}method.addJavaDocLine("/**");method.addJavaDocLine("*@return"+introspectedTable.getFullyQualifiedTable().getAlias()+":"+introspectedColumn.getRemarks());method.addJavaDocLine("*/");}publicvoidaddSetterComment(Methodmethod,IntrospectedTableintrospectedTable,IntrospectedColumnintrospectedColumn){if(this.suppressAllComments){return;}StringBuildersb=newStringBuilder();method.addJavaDocLine("/**");Parameterparm=(Parameter)method.getParameters().get(0);sb.append("*@param");sb.append(parm.getName());sb.append(":");sb.append(introspectedColumn.getRemarks());method.addJavaDocLine(sb.toString());method.addJavaDocLine("*/");}/***CommentofExampleinnerclass(Criteria)*/publicvoidaddClassComment(InnerClassinnerClass,IntrospectedTableintrospectedTable,booleanmarkAsDoNotDelete){if(this.suppressAllComments){return;}innerClass.addJavaDocLine("/**");innerClass.addJavaDocLine("*"+introspectedTable.getFullyQualifiedTable().getAlias()+"<p/>");innerClass.addJavaDocLine("*"+introspectedTable.getFullyQualifiedTable().toString());addJavadocTag(innerClass,markAsDoNotDelete);innerClass.addJavaDocLine("*/");}

Model 类注释(表的描述): MySQL。

1)EntityCommentPlugin

packagerun.override.model;importjava.sql.Connection;importjava.sql.ResultSet;importjava.sql.SQLException;importjava.sql.Statement;importjava.util.Date;importjava.util.List;importorg.mybatis.generator.api.FullyQualifiedTable;importorg.mybatis.generator.api.IntrospectedTable;importorg.mybatis.generator.api.PluginAdapter;importorg.mybatis.generator.api.dom.java.TopLevelClass;importorg.mybatis.generator.internal.JDBCConnectionFactory;importorg.mybatis.generator.internal.util.StringUtility;/***CommentofEntity,onlysupportMySQL*@ClassNameCommentPlugin*@Description*@authorMarvis*/publicclassEntityCommentPluginextendsPluginAdapter{@OverridepublicbooleanmodelBaseRecordClassGenerated(TopLevelClasstopLevelClass,IntrospectedTableintrospectedTable){addModelClassComment(topLevelClass,introspectedTable);returnsuper.modelBaseRecordClassGenerated(topLevelClass,introspectedTable);}@OverridepublicbooleanmodelRecordWithBLOBsClassGenerated(TopLevelClasstopLevelClass,IntrospectedTableintrospectedTable){addModelClassComment(topLevelClass,introspectedTable);returnsuper.modelRecordWithBLOBsClassGenerated(topLevelClass,introspectedTable);}protectedvoidaddModelClassComment(TopLevelClasstopLevelClass,IntrospectedTableintrospectedTable){FullyQualifiedTabletable=introspectedTable.getFullyQualifiedTable();StringtableComment=getTableComment(table);topLevelClass.addJavaDocLine("/**");if(StringUtility.stringHasValue(tableComment))topLevelClass.addJavaDocLine("*"+tableComment+"<p/>");topLevelClass.addJavaDocLine("*"+table.toString()+"<p/>");topLevelClass.addJavaDocLine("*@date"+newDate().toString());topLevelClass.addJavaDocLine("*");topLevelClass.addJavaDocLine("*/");}/***@authorMarvis*@dateJul13,20174:39:52PM*@paramtable*/privateStringgetTableComment(FullyQualifiedTabletable){StringtableComment="";Connectionconnection=null;Statementstatement=null;ResultSetrs=null;try{JDBCConnectionFactoryjdbc=newJDBCConnectionFactory(context.getJdbcConnectionConfiguration());connection=jdbc.getConnection();statement=connection.createStatement();rs=statement.executeQuery("SHOWCREATETABLE"+table.getIntrospectedTableName());if(rs!=null&&rs.next()){StringcreateDDL=rs.getString(2);intindex=createDDL.indexOf("COMMENT='");if(index<0){tableComment="";}else{tableComment=createDDL.substring(index+9);tableComment=tableComment.substring(0,tableComment.length()-1);}}}catch(SQLExceptione){}finally{closeConnection(connection,statement,rs);}returntableComment;}/****@authorMarvis*@dateJul13,20174:45:26PM*@paramconnection*@paramstatement*@paramrs*/privatevoidcloseConnection(Connectionconnection,Statementstatement,ResultSetrs){try{if(null!=rs)rs.close();}catch(SQLExceptione){e.printStackTrace();}finally{try{if(statement!=null)statement.close();}catch(Exceptione){e.printStackTrace();}finally{try{if(connection!=null)connection.close();}catch(SQLExceptione){e.printStackTrace();}}}}/***Thispluginisalwaysvalid-nopropertiesarerequired*/@Overridepublicbooleanvalidate(List<String>warnings){returntrue;}}二、分页和分组代码生成

这里,我对Dao Model进行了通用方法的抽取,建立通用基类。同时,对其进行了一些扩展,增加分页和分组。

先对基类进行介绍。

1)BaseMapper

packagecn.xxx.core.base.dao;importjava.util.List;importorg.apache.ibatis.annotations.Param;publicinterfaceBaseMapper<T,Example,ID>{longcountByExample(Exampleexample);intdeleteByExample(Exampleexample);intdeleteByPrimaryKey(IDid);intinsert(Trecord);intinsertSelective(Trecord);List<T>selectByExample(Exampleexample);TselectByPrimaryKey(IDid);intupdateByExampleSelective(@Param("record")Trecord,@Param("example")Exampleexample);intupdateByExample(@Param("record")Trecord,@Param("example")Exampleexample);intupdateByPrimaryKeySelective(Trecord);intupdateByPrimaryKey(Trecord);}2)BaseExample

packagecn.xxx.core.base.model;/***BaseExample基类*@ClassNameBaseExample*@Description增加分页参数*@authorMarvis*@dateJul31,201711:26:53AM*/publicabstractclassBaseExample{protectedPageInfopageInfo;protectedStringgroupByClause;publicPageInfogetPageInfo(){returnpageInfo;}publicvoidsetPageInfo(PageInfopageInfo){this.pageInfo=pageInfo;}publicStringgetGroupByClause(){returngroupByClause;}publicvoidsetGroupByClause(StringgroupByClause){this.groupByClause=groupByClause;}}3)PageInfo

packagecn.xxx.core.base.model;importcom.fasterxml.jackson.annotation.JsonIgnore;/***分页查询参数类**@author**/publicclassPageInfo{publicstaticfinalintDefault_PageSize=20;//当前页码protectedintcurrentPage=1;//总页数protectedinttotalPage;//总记录数protectedinttotalCount;//每页条数protectedintpageSize=Default_PageSize;//开始protectedintpageBegin=0;//结束protectedintpageEnd=20;/***bean起始坐标(不包含)*/privateIntegerpageBeginId=null;publicstaticfinalStringPageQuery_classname="pageInfo";/***将分布参数传入处理,最终计算出当前页码PageQuery_currPage,开始坐标PageQuery_star,*结束坐标PageQuery_end,总页数PageQuery_Psize*<p/>*页数从1开始计数**@paramtotalCount*记录总数*@parampageSize*每页显示个数*@paramcurrentPage*当前页码*/publicvoidsetPageParams(inttotalCount,intpageSize,intcurrentPage){this.totalPage=pageSize==0?1:(int)Math.ceil((double)totalCount/(double)pageSize);this.totalCount=totalCount;this.pageSize=pageSize;this.currentPage=currentPage;floatPsize_l=totalCount/(float)(this.pageSize);if(currentPage<2){currentPage=1;pageBegin=0;}elseif(currentPage>Psize_l){if(Psize_l==0){currentPage=1;}else{currentPage=(int)Math.ceil(Psize_l);}pageBegin=(currentPage-1)*this.pageSize;}else{pageBegin=(currentPage-1)*this.pageSize;}pageSize=(int)Math.ceil(Psize_l);this.pageEnd=currentPage*this.pageSize;if(this.currentPage<=0||this.currentPage>this.totalPage)this.pageSize=0;}/***将分布参数传入处理,最终计算出当前页码PageQuery_currPage,开始坐标PageQuery_star,*结束坐标PageQuery_end,总页数PageQuery_Psize**@paraminfoCount*记录总数*/publicvoidsetPageParams(inttotalCount){this.setPageParams(totalCount,this.pageSize,this.currentPage);}@OverridepublicStringtoString(){return"PageInfo[currentPage="+currentPage+",totalPage="+totalPage+",totalCount="+totalCount+",pageSize="+pageSize+",pageBegin="+pageBegin+",pageEnd="+pageEnd+",pageBeginId="+pageBeginId+"]";}publicintgetCurrentPage(){returncurrentPage;}publicintgetTotalPage(){returntotalPage;}publicintgetTotalCount(){returntotalCount;}/***每页显示个数*/publicintgetPageSize(){returnpageSize;}@JsonIgnorepublicintgetPageBegin(){returnpageBegin;}@JsonIgnorepublicintgetPageEnd(){returnpageEnd;}/***bean起始id(不包含)*/@JsonIgnorepublicIntegergetPageBeginId(){returnpageBeginId;}/***请求页*/publicvoidsetCurrentPage(intcurrentPage){this.currentPage=currentPage;}/***每页显示个数*/publicvoidsetPageSize(intpageSize){this.pageSize=pageSize;}}4)PaginationPlugin

分页扩展。并且Example继承BaseExample

packagerun.override.pagination;importorg.mybatis.generator.api.IntrospectedTable;importorg.mybatis.generator.api.dom.java.FullyQualifiedJavaType;importorg.mybatis.generator.api.dom.java.TopLevelClass;importorg.mybatis.generator.api.dom.xml.Attribute;importorg.mybatis.generator.api.dom.xml.TextElement;importorg.mybatis.generator.api.dom.xml.XmlElement;importrun.override.mapper.SqlMapIsMergeablePlugin;importrun.override.proxyFactory.FullyQualifiedJavaTypeProxyFactory;publicclassPaginationPluginextendsSqlMapIsMergeablePlugin{@OverridepublicbooleanmodelExampleClassGenerated(TopLevelClasstopLevelClass,IntrospectedTableintrospectedTable){FullyQualifiedJavaTypebaseExampleType=FullyQualifiedJavaTypeProxyFactory.getBaseExampleInstance();topLevelClass.setSuperClass(baseExampleType);topLevelClass.addImportedType(baseExampleType);returnsuper.modelExampleClassGenerated(topLevelClass,introspectedTable);}@OverridepublicbooleansqlMapSelectByExampleWithBLOBsElementGenerated(XmlElementelement,IntrospectedTableintrospectedTable){XmlElementisNotNullElement1=newXmlElement("if");isNotNullElement1.addAttribute(newAttribute("test","groupByClause!=null"));isNotNullElement1.addElement(newTextElement("groupby${groupByClause}"));element.addElement(5,isNotNullElement1);XmlElementisNotNullElement=newXmlElement("if");isNotNullElement.addAttribute(newAttribute("test","pageInfo!=null"));isNotNullElement.addElement(newTextElement("limit#{pageInfo.pageBegin},#{pageInfo.pageSize}"));element.addElement(isNotNullElement);returnsuper.sqlMapUpdateByExampleWithBLOBsElementGenerated(element,introspectedTable);}@OverridepublicbooleansqlMapSelectByExampleWithoutBLOBsElementGenerated(XmlElementelement,IntrospectedTableintrospectedTable){XmlElementisNotNullElement1=newXmlElement("if");isNotNullElement1.addAttribute(newAttribute("test","groupByClause!=null"));isNotNullElement1.addElement(newTextElement("groupby${groupByClause}"));element.addElement(5,isNotNullElement1);XmlElementisNotNullElement=newXmlElement("if");isNotNullElement.addAttribute(newAttribute("test","pageInfo!=null"));isNotNullElement.addElement(newTextElement("limit#{pageInfo.pageBegin},#{pageInfo.pageSize}"));element.addElement(isNotNullElement);returnsuper.sqlMapUpdateByExampleWithoutBLOBsElementGenerated(element,introspectedTable);}@OverridepublicbooleansqlMapCountByExampleElementGenerated(XmlElementelement,IntrospectedTableintrospectedTable){XmlElementanswer=newXmlElement("select");Stringfqjt=introspectedTable.getExampleType();answer.addAttribute(newAttribute("id",introspectedTable.getCountByExampleStatementId()));answer.addAttribute(newAttribute("parameterType",fqjt));answer.addAttribute(newAttribute("resultType","java.lang.Integer"));this.context.getCommentGenerator().addComment(answer);StringBuildersb=newStringBuilder();sb.append("selectcount(1)from");sb.append(introspectedTable.getAliasedFullyQualifiedTableNameAtRuntime());XmlElementifElement=newXmlElement("if");ifElement.addAttribute(newAttribute("test","_parameter!=null"));XmlElementincludeElement=newXmlElement("include");includeElement.addAttribute(newAttribute("refid",introspectedTable.getExampleWhereClauseId()));ifElement.addElement(includeElement);element.getElements().clear();element.getElements().add(newTextElement(sb.toString()));element.getElements().add(ifElement);returnsuper.sqlMapUpdateByExampleWithoutBLOBsElementGenerated(element,introspectedTable);}}5)FullyQualifiedJavaTypeProxyFactory

packagerun.override.proxyFactory;importorg.mybatis.generator.api.dom.java.FullyQualifiedJavaType;publicclassFullyQualifiedJavaTypeProxyFactoryextendsFullyQualifiedJavaType{privatestaticFullyQualifiedJavaTypepageInfoInstance=newFullyQualifiedJavaType("cn.xxx.core.base.model.PageInfo");privatestaticFullyQualifiedJavaTypebaseExampleInstance=newFullyQualifiedJavaType("cn.xxx.core.base.model.BaseExample");privatestaticFullyQualifiedJavaTypebaseMapperInstance=newFullyQualifiedJavaType("cn.xxx.core.base.dao.BaseMapper");privatestaticFullyQualifiedJavaTypebaseServiceInstance=newFullyQualifiedJavaType("cn.xxx.core.base.service.BaseService");privatestaticFullyQualifiedJavaTypebaseServiceImplInstance=newFullyQualifiedJavaType("cn.xxx.core.base.service.impl.BaseServiceImpl");publicFullyQualifiedJavaTypeProxyFactory(StringfullTypeSpecification){super(fullTypeSpecification);}publicstaticfinalFullyQualifiedJavaTypegetPageInfoInstanceInstance(){returnpageInfoInstance;}publicstaticfinalFullyQualifiedJavaTypegetBaseExampleInstance(){returnbaseExampleInstance;}publicstaticfinalFullyQualifiedJavaTypegetBaseMapperInstance(){returnbaseMapperInstance;}publicstaticfinalFullyQualifiedJavaTypegetBaseServiceInstance(){returnbaseServiceInstance;}publicstaticfinalFullyQualifiedJavaTypegetBaseServiceImplInstance(){returnbaseServiceImplInstance;}}三、Dao 生成代码简化1)ClientDaoPlugin

packagerun.override.dao;importjava.util.Arrays;importjava.util.List;importjava.util.stream.Collectors;importorg.mybatis.generator.api.IntrospectedTable;importorg.mybatis.generator.api.JavaTypeResolver;importorg.mybatis.generator.api.dom.java.FullyQualifiedJavaType;importorg.mybatis.generator.api.dom.java.Interface;importorg.mybatis.generator.api.dom.java.Method;importorg.mybatis.generator.api.dom.java.TopLevelClass;importorg.mybatis.generator.internal.types.JavaTypeResolverDefaultImpl;importrun.override.model.EntityCommentPlugin;importrun.override.proxyFactory.FullyQualifiedJavaTypeProxyFactory;/***javaClient("XMLMAPPER")extended**@ClassNameClientDaoPlugin*@DescriptionMapper.java*@authorMarvis*/publicclassClientDaoPluginextendsEntityCommentPlugin{@OverridepublicbooleanclientGenerated(Interfaceinterfaze,TopLevelClasstopLevelClass,IntrospectedTableintrospectedTable){JavaTypeResolverjavaTypeResolver=newJavaTypeResolverDefaultImpl();FullyQualifiedJavaTypecalculateJavaType=javaTypeResolver.calculateJavaType(introspectedTable.getPrimaryKeyColumns().get(0));FullyQualifiedJavaTypesuperInterfaceType=newFullyQualifiedJavaType(newStringBuilder("BaseMapper<").append(introspectedTable.getBaseRecordType()).append(",").append(introspectedTable.getExampleType()).append(",").append(calculateJavaType.getShortName()).append(">").toString());FullyQualifiedJavaTypebaseMapperInstance=FullyQualifiedJavaTypeProxyFactory.getBaseMapperInstance();interfaze.addSuperInterface(superInterfaceType);interfaze.addImportedType(baseMapperInstance);List<Method>changeMethods=interfaze.getMethods().stream().filter(method->method.getName().endsWith("WithBLOBs")||method.getReturnType().toString().endsWith("WithBLOBs")||Arrays.toString(method.getParameters().toArray()).contains("WithBLOBs")).collect(Collectors.toList());interfaze.getMethods().retainAll(changeMethods);if(changeMethods.isEmpty())interfaze.getImportedTypes().removeIf(javaType->javaType.getFullyQualifiedName().equals("java.util.List")||javaType.getFullyQualifiedName().equals("org.apache.ibatis.annotations.Param"));returnsuper.clientGenerated(interfaze,topLevelClass,introspectedTable);}}四、修正

重复生成时Mapper.xml不是覆盖原代码,而是对内容进行了追加。

1)SqlMapIsMergeablePlugin

packagerun.override.mapper;importorg.mybatis.generator.api.GeneratedXmlFile;importorg.mybatis.generator.api.IntrospectedTable;importrun.override.dao.ClientDaoPlugin;publicclassSqlMapIsMergeablePluginextendsClientDaoPlugin{@OverridepublicbooleansqlMapGenerated(GeneratedXmlFilesqlMap,IntrospectedTableintrospectedTable){//重新生成代码,xml内容覆盖sqlMap.setMergeable(false);returnsuper.sqlMapGenerated(sqlMap,introspectedTable);}}五、序列化自定义扩展

增加Example的序列化,并增加@SuppressWarnings("serial")注解。

1)SerializablePlugin

packagerun.override;importjava.util.List;importjava.util.Properties;importorg.mybatis.generator.api.IntrospectedTable;importorg.mybatis.generator.api.PluginAdapter;importorg.mybatis.generator.api.dom.java.FullyQualifiedJavaType;importorg.mybatis.generator.api.dom.java.TopLevelClass;publicclassSerializablePluginextendsPluginAdapter{privateFullyQualifiedJavaTypeserializable;privateFullyQualifiedJavaTypegwtSerializable;privatebooleanaddGWTInterface;privatebooleansuppressJavaInterface;publicSerializablePlugin(){this.serializable=newFullyQualifiedJavaType("java.io.Serializable");this.gwtSerializable=newFullyQualifiedJavaType("com.google.gwt.user.client.rpc.IsSerializable");}@OverridepublicvoidsetProperties(Propertiesproperties){super.setProperties(properties);this.addGWTInterface=Boolean.valueOf(properties.getProperty("addGWTInterface")).booleanValue();this.suppressJavaInterface=Boolean.valueOf(properties.getProperty("suppressJavaInterface")).booleanValue();}@OverridepublicbooleanmodelBaseRecordClassGenerated(TopLevelClasstopLevelClass,IntrospectedTableintrospectedTable){makeSerializable(topLevelClass,introspectedTable);returntrue;}@OverridepublicbooleanmodelPrimaryKeyClassGenerated(TopLevelClasstopLevelClass,IntrospectedTableintrospectedTable){makeSerializable(topLevelClass,introspectedTable);returntrue;}@OverridepublicbooleanmodelRecordWithBLOBsClassGenerated(TopLevelClasstopLevelClass,IntrospectedTableintrospectedTable){makeSerializable(topLevelClass,introspectedTable);returntrue;}@OverridepublicbooleanmodelExampleClassGenerated(TopLevelClasstopLevelClass,IntrospectedTableintrospectedTable){makeSerializable(topLevelClass,introspectedTable);returntrue;}protectedvoidmakeSerializable(TopLevelClasstopLevelClass,IntrospectedTableintrospectedTable){if(this.addGWTInterface){topLevelClass.addImportedType(this.gwtSerializable);topLevelClass.addSuperInterface(this.gwtSerializable);}if(!(this.suppressJavaInterface)){topLevelClass.addImportedType(this.serializable);topLevelClass.addSuperInterface(this.serializable);topLevelClass.addAnnotation("@SuppressWarnings(\"serial\")");}}/***Thispluginisalwaysvalid-nopropertiesarerequired*/@Overridepublicbooleanvalidate(List<String>warnings){returntrue;}}六、服务层代码自定义生成

重写Context,ConfigurationParserMyBatisGeneratorConfigurationParser,增加服务层生成逻辑。

先对Service基类进行介绍。

1)BaseService

packagecn.xxx.core.base.service;importjava.util.List;importorg.apache.ibatis.annotations.Param;importcn.xxx.core.base.model.BaseExample;importcn.xxx.core.base.model.PageInfo;publicinterfaceBaseService<T,ExampleextendsBaseExample,ID>{longcountByExample(Exampleexample);intdeleteByExample(Exampleexample);intdeleteByPrimaryKey(IDid);intinsert(Trecord);intinsertSelective(Trecord);List<T>selectByExample(Exampleexample);/***returnTobject*@authorMarvis*@dateMay23,201811:37:11AM*@paramexample*@return*/TselectByCondition(Exampleexample);/***ifpageInfo==null<p/>*thenreturnresultofselectByExample(example)*@authorMarvis*@dateJul13,20175:24:35PM*@paramexample*@parampageInfo*@return*/List<T>selectByPageExmple(Exampleexample,PageInfopageInfo);TselectByPrimaryKey(IDid);intupdateByExampleSelective(@Param("record")Trecord,@Param("example")Exampleexample);intupdateByExample(@Param("record")Trecord,@Param("example")Exampleexample);intupdateByPrimaryKeySelective(Trecord);intupdateByPrimaryKey(Trecord);}2)BaseServiceImpl

packagecn.xxx.core.base.service.impl;importjava.util.List;importcn.xxx.core.base.dao.BaseMapper;importcn.xxx.core.base.model.BaseExample;importcn.xxx.core.base.model.PageInfo;importcn.xxx.core.base.service.BaseService;publicabstractclassBaseServiceImpl<T,ExampleextendsBaseExample,ID>implementsBaseService<T,Example,ID>{privateBaseMapper<T,Example,ID>mapper;publicvoidsetMapper(BaseMapper<T,Example,ID>mapper){this.mapper=mapper;}publiclongcountByExample(Exampleexample){returnmapper.countByExample(example);}@OverridepublicintdeleteByExample(Exampleexample){returnmapper.deleteByExample(example);}@OverridepublicintdeleteByPrimaryKey(IDid){returnmapper.deleteByPrimaryKey(id);}@Overridepublicintinsert(Trecord){returnmapper.insert(record);}@OverridepublicintinsertSelective(Trecord){returnmapper.insertSelective(record);}@OverridepublicList<T>selectByExample(Exampleexample){returnmapper.selectByExample(example);}@OverridepublicTselectByCondition(Exampleexample){List<T>datas=selectByExample(example);returndatas!=null&&datas.size()==0?null:datas.get(0);}@OverridepublicList<T>selectByPageExmple(Exampleexample,PageInfopageInfo){if(pageInfo!=null){example.setPageInfo(pageInfo);pageInfo.setPageParams(Long.valueOf(this.countByExample(example)).intValue());}returnthis.selectByExample(example);}@OverridepublicTselectByPrimaryKey(IDid){returnmapper.selectByPrimaryKey(id);}@OverridepublicintupdateByExampleSelective(Trecord,Exampleexample){returnmapper.updateByExampleSelective(record,example);}@OverridepublicintupdateByExample(Trecord,Exampleexample){returnmapper.updateByExample(record,example);}@OverridepublicintupdateByPrimaryKeySelective(Trecord){returnmapper.updateByPrimaryKeySelective(record);}@OverridepublicintupdateByPrimaryKey(Trecord){returnmapper.updateByPrimaryKey(record);}}3)ServiceLayerPlugin

packagerun.override.service;importorg.mybatis.generator.api.GeneratedJavaFile;importorg.mybatis.generator.api.IntrospectedTable;importorg.mybatis.generator.api.JavaTypeResolver;importorg.mybatis.generator.api.dom.java.CompilationUnit;importorg.mybatis.generator.api.dom.java.Field;importorg.mybatis.generator.api.dom.java.FullyQualifiedJavaType;importorg.mybatis.generator.api.dom.java.Interface;importorg.mybatis.generator.api.dom.java.JavaVisibility;importorg.mybatis.generator.api.dom.java.Method;importorg.mybatis.generator.api.dom.java.Parameter;importorg.mybatis.generator.api.dom.java.TopLevelClass;importorg.mybatis.generator.internal.types.JavaTypeResolverDefaultImpl;importrun.override.pagination.PaginationPlugin;importrun.override.proxyFactory.FullyQualifiedJavaTypeProxyFactory;importjava.util.ArrayList;importjava.util.List;importjava.util.stream.Collectors;publicclassServiceLayerPluginextendsPaginationPlugin{/***生成额外java文件*/@OverridepublicList<GeneratedJavaFile>contextGenerateAdditionalJavaFiles(IntrospectedTableintrospectedTable){ContextOverridecontext=(ContextOverride)introspectedTable.getContext();ServiceGeneratorConfigurationserviceGeneratorConfiguration;if((serviceGeneratorConfiguration=context.getServiceGeneratorConfiguration())==null)returnnull;StringtargetPackage=serviceGeneratorConfiguration.getTargetPackage();StringtargetProject=serviceGeneratorConfiguration.getTargetProject();StringimplementationPackage=serviceGeneratorConfiguration.getImplementationPackage();CompilationUnitaddServiceInterface=addServiceInterface(introspectedTable,targetPackage);CompilationUnitaddServiceImplClazz=addServiceImplClazz(introspectedTable,targetPackage,implementationPackage);GeneratedJavaFilegjfServiceInterface=newGeneratedJavaFile(addServiceInterface,targetProject,this.context.getProperty("javaFileEncoding"),this.context.getJavaFormatter());GeneratedJavaFilegjfServiceImplClazz=newGeneratedJavaFile(addServiceImplClazz,targetProject,this.context.getProperty("javaFileEncoding"),this.context.getJavaFormatter());List<GeneratedJavaFile>list=newArrayList<>();list.add(gjfServiceInterface);list.add(gjfServiceImplClazz);returnlist;}protectedCompilationUnitaddServiceInterface(IntrospectedTableintrospectedTable,StringtargetPackage){StringentityClazzType=introspectedTable.getBaseRecordType();StringserviceSuperPackage=targetPackage;StringentityExampleClazzType=introspectedTable.getExampleType();StringdomainObjectName=introspectedTable.getFullyQualifiedTable().getDomainObjectName();JavaTypeResolverjavaTypeResolver=newJavaTypeResolverDefaultImpl();FullyQualifiedJavaTypecalculateJavaType=javaTypeResolver.calculateJavaType(introspectedTable.getPrimaryKeyColumns().get(0));StringBuilderbuilder=newStringBuilder();FullyQualifiedJavaTypesuperInterfaceType=newFullyQualifiedJavaType(builder.append("BaseService<").append(entityClazzType).append(",").append(entityExampleClazzType).append(",").append(calculateJavaType.getShortName()).append(">").toString());InterfaceserviceInterface=newInterface(builder.delete(0,builder.length()).append(serviceSuperPackage).append(".").append(domainObjectName).append("Service").toString());serviceInterface.addSuperInterface(superInterfaceType);serviceInterface.setVisibility(JavaVisibility.PUBLIC);FullyQualifiedJavaTypebaseServiceInstance=FullyQualifiedJavaTypeProxyFactory.getBaseServiceInstance();FullyQualifiedJavaTypemodelJavaType=newFullyQualifiedJavaType(entityClazzType);FullyQualifiedJavaTypeexampleJavaType=newFullyQualifiedJavaType(entityExampleClazzType);serviceInterface.addImportedType(baseServiceInstance);serviceInterface.addImportedType(modelJavaType);serviceInterface.addImportedType(exampleJavaType);serviceInterface.addFileCommentLine("/***copyright(c)2019Marvis***/");this.additionalServiceMethods(introspectedTable,serviceInterface);returnserviceInterface;}protectedCompilationUnitaddServiceImplClazz(IntrospectedTableintrospectedTable,StringtargetPackage,StringimplementationPackage){StringentityClazzType=introspectedTable.getBaseRecordType();StringserviceSuperPackage=targetPackage;StringserviceImplSuperPackage=implementationPackage;StringentityExampleClazzType=introspectedTable.getExampleType();StringjavaMapperType=introspectedTable.getMyBatis3JavaMapperType();StringdomainObjectName=introspectedTable.getFullyQualifiedTable().getDomainObjectName();JavaTypeResolverjavaTypeResolver=newJavaTypeResolverDefaultImpl();FullyQualifiedJavaTypecalculateJavaType=javaTypeResolver.calculateJavaType(introspectedTable.getPrimaryKeyColumns().get(0));StringBuilderbuilder=newStringBuilder();FullyQualifiedJavaTypesuperClazzType=newFullyQualifiedJavaType(builder.append("BaseServiceImpl<").append(entityClazzType).append(",").append(entityExampleClazzType).append(",").append(calculateJavaType.getShortName()).append(">").toString());FullyQualifiedJavaTypeimplInterfaceType=newFullyQualifiedJavaType(builder.delete(0,builder.length()).append(serviceSuperPackage).append(".").append(domainObjectName).append("Service").toString());TopLevelClassserviceImplClazz=newTopLevelClass(builder.delete(0,builder.length()).append(serviceImplSuperPackage).append(".").append(domainObjectName).append("ServiceImpl").toString());serviceImplClazz.addSuperInterface(implInterfaceType);serviceImplClazz.setSuperClass(superClazzType);serviceImplClazz.setVisibility(JavaVisibility.PUBLIC);serviceImplClazz.addAnnotation("@Service");FullyQualifiedJavaTypebaseServiceInstance=FullyQualifiedJavaTypeProxyFactory.getBaseServiceImplInstance();FullyQualifiedJavaTypemodelJavaType=newFullyQualifiedJavaType(entityClazzType);FullyQualifiedJavaTypeexampleJavaType=newFullyQualifiedJavaType(entityExampleClazzType);serviceImplClazz.addImportedType(newFullyQualifiedJavaType("org.springframework.beans.factory.annotation.Autowired"));serviceImplClazz.addImportedType(newFullyQualifiedJavaType("org.springframework.stereotype.Service"));serviceImplClazz.addImportedType(baseServiceInstance);serviceImplClazz.addImportedType(modelJavaType);serviceImplClazz.addImportedType(exampleJavaType);serviceImplClazz.addImportedType(implInterfaceType);FullyQualifiedJavaTypelogType=newFullyQualifiedJavaType("org.slf4j.Logger");FullyQualifiedJavaTypelogFactoryType=newFullyQualifiedJavaType("org.slf4j.LoggerFactory");FieldlogField=newField();logField.setVisibility(JavaVisibility.PRIVATE);logField.setStatic(true);logField.setFinal(true);logField.setType(logType);logField.setName("logger");logField.setInitializationString(builder.delete(0,builder.length()).append("LoggerFactory.getLogger(").append(domainObjectName).append("ServiceImpl.class)").toString());logField.addAnnotation("");logField.addAnnotation("@SuppressWarnings(\"unused\")");serviceImplClazz.addField(logField);serviceImplClazz.addImportedType(logType);serviceImplClazz.addImportedType(logFactoryType);StringmapperName=builder.delete(0,builder.length()).append(Character.toLowerCase(domainObjectName.charAt(0))).append(domainObjectName.substring(1)).append("Mapper").toString();FullyQualifiedJavaTypeJavaMapperType=newFullyQualifiedJavaType(javaMapperType);FieldmapperField=newField();mapperField.setVisibility(JavaVisibility.PUBLIC);mapperField.setType(JavaMapperType);//Mapper.javamapperField.setName(mapperName);mapperField.addAnnotation("@Autowired");serviceImplClazz.addField(mapperField);serviceImplClazz.addImportedType(JavaMapperType);MethodmapperMethod=newMethod();mapperMethod.setVisibility(JavaVisibility.PUBLIC);mapperMethod.setName("setMapper");mapperMethod.addBodyLine("super.setMapper("+mapperName+");");mapperMethod.addAnnotation("@Autowired");serviceImplClazz.addMethod(mapperMethod);serviceImplClazz.addFileCommentLine("/***copyright(c)2019Marvis***/");serviceImplClazz.addImportedType(newFullyQualifiedJavaType("org.springframework.beans.factory.annotation.Autowired"));this.additionalServiceImplMethods(introspectedTable,serviceImplClazz,mapperName);returnserviceImplClazz;}protectedvoidadditionalServiceMethods(IntrospectedTableintrospectedTable,InterfaceserviceInterface){if(this.notHasBLOBColumns(introspectedTable))return;introspectedTable.getGeneratedJavaFiles().stream().filter(file->file.getCompilationUnit().isJavaInterface()&&file.getCompilationUnit().getType().getShortName().endsWith("Mapper")).map(GeneratedJavaFile::getCompilationUnit).forEach(compilationUnit->((Interface)compilationUnit).getMethods().forEach(m->serviceInterface.addMethod(this.additionalServiceLayerMethod(serviceInterface,m))));}protectedvoidadditionalServiceImplMethods(IntrospectedTableintrospectedTable,TopLevelClassclazz,StringmapperName){if(this.notHasBLOBColumns(introspectedTable))return;introspectedTable.getGeneratedJavaFiles().stream().filter(file->file.getCompilationUnit().isJavaInterface()&&file.getCompilationUnit().getType().getShortName().endsWith("Mapper")).map(GeneratedJavaFile::getCompilationUnit).forEach(compilationUnit->((Interface)compilationUnit).getMethods().forEach(m->{MethodserviceImplMethod=this.additionalServiceLayerMethod(clazz,m);serviceImplMethod.addAnnotation("@Override");serviceImplMethod.addBodyLine(this.generateBodyForServiceImplMethod(mapperName,m));clazz.addMethod(serviceImplMethod);}));}privatebooleannotHasBLOBColumns(IntrospectedTableintrospectedTable){return!introspectedTable.hasBLOBColumns();}privateMethodadditionalServiceLayerMethod(CompilationUnitcompilation,Methodm){Methodmethod=newMethod();method.setVisibility(JavaVisibility.PUBLIC);method.setName(m.getName());List<Parameter>parameters=m.getParameters();method.getParameters().addAll(parameters.stream().peek(param->param.getAnnotations().clear()).collect(Collectors.toList()));method.setReturnType(m.getReturnType());compilation.addImportedType(newFullyQualifiedJavaType(m.getReturnType().getFullyQualifiedNameWithoutTypeParameters()));returnmethod;}privateStringgenerateBodyForServiceImplMethod(StringmapperName,Methodm){StringBuildersbf=newStringBuilder("return");sbf.append(mapperName).append(".").append(m.getName()).append("(");booleansingleParam=true;for(Parameterparameter:m.getParameters()){if(singleParam)singleParam=!singleParam;elsesbf.append(",");sbf.append(parameter.getName());}sbf.append(");");returnsbf.toString();}}4)ContextOverride

packagerun.override.service;importjava.util.List;importorg.mybatis.generator.api.dom.xml.XmlElement;importorg.mybatis.generator.config.Context;importorg.mybatis.generator.config.ModelType;publicclassContextOverrideextendsContext{//添加ServiceGeneratorConfigurationprivateServiceGeneratorConfigurationserviceGeneratorConfiguration;publicContextOverride(ModelTypedefaultModelType){super(defaultModelType);}publicServiceGeneratorConfigurationgetServiceGeneratorConfiguration(){returnserviceGeneratorConfiguration;}publicvoidsetServiceGeneratorConfiguration(ServiceGeneratorConfigurationserviceGeneratorConfiguration){this.serviceGeneratorConfiguration=serviceGeneratorConfiguration;}@Overridepublicvoidvalidate(List<String>errors){if(serviceGeneratorConfiguration!=null)serviceGeneratorConfiguration.validate(errors,this.getId());super.validate(errors);}publicXmlElementtoXmlElement(){XmlElementxmlElement=super.toXmlElement();if(serviceGeneratorConfiguration!=null)xmlElement.addElement(serviceGeneratorConfiguration.toXmlElement());returnxmlElement;}}5)MyBatisGeneratorConfigurationParserOverride

packagerun.override.service;importjava.util.Properties;importorg.mybatis.generator.config.Configuration;importorg.mybatis.generator.config.Context;importorg.mybatis.generator.config.JavaClientGeneratorConfiguration;importorg.mybatis.generator.config.ModelType;importorg.mybatis.generator.config.PluginConfiguration;importorg.mybatis.generator.config.xml.MyBatisGeneratorConfigurationParser;importorg.mybatis.generator.exception.XMLParserException;importorg.mybatis.generator.internal.util.StringUtility;importorg.w3c.dom.Element;importorg.w3c.dom.Node;importorg.w3c.dom.NodeList;publicclassMyBatisGeneratorConfigurationParserOverrideextendsMyBatisGeneratorConfigurationParser{publicMyBatisGeneratorConfigurationParserOverride(PropertiesextraProperties){super(extraProperties);}privatevoidparseJavaServiceGenerator(Contextcontext,Nodenode){ContextOverridecontextOverride=ContextOverride.class.cast(context);////替换ContextServiceGeneratorConfigurationserviceGeneratorConfiguration=newServiceGeneratorConfiguration();contextOverride.setServiceGeneratorConfiguration(serviceGeneratorConfiguration);Propertiesattributes=parseAttributes(node);StringtargetPackage=attributes.getProperty("targetPackage");StringtargetProject=attributes.getProperty("targetProject");StringimplementationPackage=attributes.getProperty("implementationPackage");serviceGeneratorConfiguration.setTargetPackage(targetPackage);serviceGeneratorConfiguration.setTargetProject(targetProject);serviceGeneratorConfiguration.setImplementationPackage(implementationPackage);NodeListnodeList=node.getChildNodes();for(inti=0;i<nodeList.getLength();i++){NodechildNode=nodeList.item(i);if(childNode.getNodeType()==Node.ELEMENT_NODE&&"property".equals(childNode.getNodeName()))parseProperty(serviceGeneratorConfiguration,childNode);}}@OverridepublicConfigurationparseConfiguration(ElementrootNode)throwsXMLParserException{Configurationconfiguration=newConfiguration();NodeListnodeList=rootNode.getChildNodes();for(inti=0;i<nodeList.getLength();++i){NodechildNode=nodeList.item(i);if(childNode.getNodeType()!=1){continue;}if("properties".equals(childNode.getNodeName()))parseProperties(configuration,childNode);elseif("classPathEntry".equals(childNode.getNodeName()))parseClassPathEntry(configuration,childNode);elseif("context".equals(childNode.getNodeName())){parseContext(configuration,childNode);}}returnconfiguration;}privatevoidparseContext(Configurationconfiguration,Nodenode){Propertiesattributes=parseAttributes(node);StringdefaultModelType=attributes.getProperty("defaultModelType");StringtargetRuntime=attributes.getProperty("targetRuntime");StringintrospectedColumnImpl=attributes.getProperty("introspectedColumnImpl");Stringid=attributes.getProperty("id");ModelTypemt=defaultModelType!=null?ModelType.getModelType(defaultModelType):null;Contextcontext=newContextOverride(mt);context.setId(id);if(StringUtility.stringHasValue(introspectedColumnImpl))context.setIntrospectedColumnImpl(introspectedColumnImpl);if(StringUtility.stringHasValue(targetRuntime))context.setTargetRuntime(targetRuntime);configuration.addContext(context);NodeListnodeList=node.getChildNodes();for(inti=0;i<nodeList.getLength();i++){NodechildNode=nodeList.item(i);if(childNode.getNodeType()!=1)continue;if("property".equals(childNode.getNodeName())){parseProperty(context,childNode);continue;}if("plugin".equals(childNode.getNodeName())){parsePlugin(context,childNode);continue;}if("commentGenerator".equals(childNode.getNodeName())){parseCommentGenerator(context,childNode);continue;}if("jdbcConnection".equals(childNode.getNodeName())){parseJdbcConnection(context,childNode);continue;}if("connectionFactory".equals(childNode.getNodeName())){parseConnectionFactory(context,childNode);continue;}if("javaModelGenerator".equals(childNode.getNodeName())){parseJavaModelGenerator(context,childNode);continue;}if("javaTypeResolver".equals(childNode.getNodeName())){parseJavaTypeResolver(context,childNode);continue;}if("sqlMapGenerator".equals(childNode.getNodeName())){parseSqlMapGenerator(context,childNode);continue;}if("javaClientGenerator".equals(childNode.getNodeName())){parseJavaClientGenerator(context,childNode);continue;}if("javaServiceGenerator".equals(childNode.getNodeName())){parseJavaServiceGenerator(context,childNode);continue;}if("table".equals(childNode.getNodeName()))parseTable(context,childNode);}}privatevoidparsePlugin(Contextcontext,Nodenode){PluginConfigurationpluginConfiguration=newPluginConfiguration();context.addPluginConfiguration(pluginConfiguration);Propertiesattributes=parseAttributes(node);Stringtype=attributes.getProperty("type");pluginConfiguration.setConfigurationType(type);NodeListnodeList=node.getChildNodes();for(inti=0;i<nodeList.getLength();i++){NodechildNode=nodeList.item(i);if(childNode.getNodeType()==1&&"property".equals(childNode.getNodeName()))parseProperty(pluginConfiguration,childNode);}}privatevoidparseJavaClientGenerator(Contextcontext,Nodenode){JavaClientGeneratorConfigurationjavaClientGeneratorConfiguration=newJavaClientGeneratorConfiguration();context.setJavaClientGeneratorConfiguration(javaClientGeneratorConfiguration);Propertiesattributes=parseAttributes(node);Stringtype=attributes.getProperty("type");StringtargetPackage=attributes.getProperty("targetPackage");StringtargetProject=attributes.getProperty("targetProject");StringimplementationPackage=attributes.getProperty("implementationPackage");javaClientGeneratorConfiguration.setConfigurationType(type);javaClientGeneratorConfiguration.setTargetPackage(targetPackage);javaClientGeneratorConfiguration.setTargetProject(targetProject);javaClientGeneratorConfiguration.setImplementationPackage(implementationPackage);NodeListnodeList=node.getChildNodes();for(inti=0;i<nodeList.getLength();i++){NodechildNode=nodeList.item(i);if(childNode.getNodeType()==1&&"property".equals(childNode.getNodeName()))parseProperty(javaClientGeneratorConfiguration,childNode);}}}6)ServiceGeneratorConfiguration

packagerun.override.service;importjava.util.List;importorg.mybatis.generator.api.dom.xml.Attribute;importorg.mybatis.generator.api.dom.xml.XmlElement;importorg.mybatis.generator.config.PropertyHolder;importorg.mybatis.generator.internal.util.StringUtility;importorg.mybatis.generator.internal.util.messages.Messages;publicclassServiceGeneratorConfigurationextendsPropertyHolder{privateStringtargetPackage;privateStringimplementationPackage;privateStringtargetProject;/****/publicServiceGeneratorConfiguration(){super();}publicStringgetTargetPackage(){returntargetPackage;}publicvoidsetTargetPackage(StringtargetPackage){this.targetPackage=targetPackage;}publicStringgetImplementationPackage(){returnimplementationPackage;}publicvoidsetImplementationPackage(StringimplementationPackage){this.implementationPackage=implementationPackage;}publicStringgetTargetProject(){returntargetProject;}publicvoidsetTargetProject(StringtargetProject){this.targetProject=targetProject;}publicXmlElementtoXmlElement(){XmlElementanswer=newXmlElement("javaServiceGenerator");if(targetPackage!=null){answer.addAttribute(newAttribute("targetPackage",targetPackage));}if(implementationPackage!=null){answer.addAttribute(newAttribute("implementationPackage",targetPackage));}if(targetProject!=null){answer.addAttribute(newAttribute("targetProject",targetProject));}addPropertyXmlElements(answer);returnanswer;}@SuppressWarnings({"rawtypes","unchecked"})publicvoidvalidate(Listerrors,StringcontextId){if(!StringUtility.stringHasValue(getTargetProject()))errors.add(Messages.getString("ValidationError.102",contextId));if(!StringUtility.stringHasValue(getTargetPackage()))errors.add(Messages.getString("ValidationError.112","ServiceGenerator",contextId));if(!StringUtility.stringHasValue(getImplementationPackage()))errors.add(Messages.getString("ValidationError.120",contextId));}}7)ConfigurationParserOverride

packagerun.override.service;importjava.io.File;importjava.io.FileReader;importjava.io.IOException;importjava.io.InputStream;importjava.io.Reader;importjava.util.ArrayList;importjava.util.List;importjava.util.Properties;importjavax.xml.parsers.DocumentBuilder;importjavax.xml.parsers.DocumentBuilderFactory;importjavax.xml.parsers.ParserConfigurationException;importorg.mybatis.generator.config.Configuration;importorg.mybatis.generator.config.xml.ConfigurationParser;importorg.mybatis.generator.config.xml.MyBatisGeneratorConfigurationParser;importorg.mybatis.generator.config.xml.ParserEntityResolver;importorg.mybatis.generator.config.xml.ParserErrorHandler;importorg.mybatis.generator.exception.XMLParserException;importorg.w3c.dom.Document;importorg.w3c.dom.Element;importorg.xml.sax.InputSource;importorg.xml.sax.SAXException;importorg.xml.sax.SAXParseException;publicclassConfigurationParserOverrideextendsConfigurationParser{privateList<String>warnings;privateList<String>parseErrors;privatePropertiesextraProperties;publicConfigurationParserOverride(List<String>warnings){this(null,warnings);}publicConfigurationParserOverride(PropertiesextraProperties,List<String>warnings){super(extraProperties,warnings);this.extraProperties=extraProperties;if(warnings==null)this.warnings=newArrayList<>();else{this.warnings=warnings;}this.parseErrors=newArrayList<>();}@OverridepublicConfigurationparseConfiguration(FileinputFile)throwsIOException,XMLParserException{FileReaderfr=newFileReader(inputFile);returnparseConfiguration(fr);}@OverridepublicConfigurationparseConfiguration(InputStreaminputStream)throwsIOException,XMLParserException{InputSourceis=newInputSource(inputStream);returnparseConfiguration(is);}@OverridepublicConfigurationparseConfiguration(Readerreader)throwsIOException,XMLParserException{InputSourceis=newInputSource(reader);returnparseConfiguration(is);}privateConfigurationparseConfiguration(InputSourceinputSource)throwsIOException,XMLParserException{this.parseErrors.clear();DocumentBuilderFactoryfactory=DocumentBuilderFactory.newInstance();factory.setValidating(true);try{DocumentBuilderbuilder=factory.newDocumentBuilder();builder.setEntityResolver(newParserEntityResolver());ParserErrorHandlerhandler=newParserErrorHandler(this.warnings,this.parseErrors);builder.setErrorHandler(handler);Documentdocument=null;try{document=builder.parse(inputSource);}catch(SAXParseExceptione){thrownewXMLParserException(this.parseErrors);}catch(SAXExceptione){if(e.getException()==null)this.parseErrors.add(e.getMessage());else{this.parseErrors.add(e.getException().getMessage());}}if(this.parseErrors.size()>0){thrownewXMLParserException(this.parseErrors);}ElementrootNode=document.getDocumentElement();Configurationconfig=parseMyBatisGeneratorConfiguration(rootNode);if(this.parseErrors.size()>0){thrownewXMLParserException(this.parseErrors);}returnconfig;}catch(ParserConfigurationExceptione){this.parseErrors.add(e.getMessage());thrownewXMLParserException(this.parseErrors);}}privateConfigurationparseMyBatisGeneratorConfiguration(ElementrootNode)throwsXMLParserException{//替换MyBatisGeneratorConfigurationParserMyBatisGeneratorConfigurationParserparser=newMyBatisGeneratorConfigurationParserOverride(this.extraProperties);returnparser.parseConfiguration(rootNode);}}七、PluginChain

通过继承,把以上扩展Plugin串起来(SerializablePlugin一些项目中可能不需要,故不加入Chain。同时,其他也可以根据需要对Chain进行更改)。

packagerun.override;importrun.override.service.ServiceLayerPlugin;publicclassPluginChainextendsServiceLayerPlugin{}八、generatorConfig.xml

增加javaServiceGenerator相关配置标签。本文使用内部DTD做示例,亦可通过外部DTD或xsd来实现。

1)generatorConfig.xml

<?xmlversion="1.0"encoding="UTF-8"?><!--内部DTD亦可通过外部DTD来实现--><!DOCTYPEgeneratorConfiguration[<!ELEMENTgeneratorConfiguration(properties?,classPathEntry*,context+)><!ELEMENTpropertiesEMPTY><!ATTLISTpropertiesresourceCDATA#IMPLIEDurlCDATA#IMPLIED><!--括号里是声明出现的次序:*:出现任意次,包括0次?:出现最多一次|:选择之一+:出现最少1次如果没有上述符号:必须且只能出现一次--><!ELEMENTcontext(property*,plugin*,commentGenerator?,(connectionFactory|jdbcConnection),javaTypeResolver?,javaModelGenerator,sqlMapGenerator,javaClientGenerator,javaServiceGenerator,table+)><!ATTLISTcontextidID#REQUIREDdefaultModelTypeCDATA#IMPLIEDtargetRuntimeCDATA#IMPLIEDintrospectedColumnImplCDATA#IMPLIED><!ELEMENTconnectionFactory(property*)><!ATTLISTconnectionFactorytypeCDATA#IMPLIED><!ELEMENTjdbcConnection(property*)><!ATTLISTjdbcConnectiondriverClassCDATA#REQUIREDconnectionURLCDATA#REQUIREDuserIdCDATA#IMPLIEDpasswordCDATA#IMPLIED><!ELEMENTclassPathEntryEMPTY><!ATTLISTclassPathEntrylocationCDATA#REQUIRED><!ELEMENTpropertyEMPTY><!ATTLISTpropertynameCDATA#REQUIREDvalueCDATA#REQUIRED><!ELEMENTplugin(property*)><!ATTLISTplugintypeCDATA#REQUIRED><!ELEMENTjavaModelGenerator(property*)><!ATTLISTjavaModelGeneratortargetPackageCDATA#REQUIREDtargetProjectCDATA#REQUIRED><!ELEMENTjavaTypeResolver(property*)><!ATTLISTjavaTypeResolvertypeCDATA#IMPLIED><!ELEMENTsqlMapGenerator(property*)><!ATTLISTsqlMapGeneratortargetPackageCDATA#REQUIREDtargetProjectCDATA#REQUIRED><!ELEMENTjavaClientGenerator(property*)><!ATTLISTjavaClientGeneratortypeCDATA#REQUIREDtargetPackageCDATA#REQUIREDtargetProjectCDATA#REQUIREDimplementationPackageCDATA#IMPLIED><!ELEMENTjavaServiceGenerator(property*)><!ATTLISTjavaServiceGeneratortargetPackageCDATA#REQUIREDimplementationPackageCDATA#REQUIREDtargetProjectCDATA#REQUIRED><!ELEMENTtable(property*,generatedKey?,domainObjectRenamingRule?,columnRenamingRule?,(columnOverride|ignoreColumn|ignoreColumnsByRegex)*)><!ATTLISTtablecatalogCDATA#IMPLIEDschemaCDATA#IMPLIEDtableNameCDATA#REQUIREDaliasCDATA#IMPLIEDdomainObjectNameCDATA#IMPLIEDmapperNameCDATA#IMPLIEDsqlProviderNameCDATA#IMPLIEDenableInsertCDATA#IMPLIEDenableSelectByPrimaryKeyCDATA#IMPLIEDenableSelectByExampleCDATA#IMPLIEDenableUpdateByPrimaryKeyCDATA#IMPLIEDenableDeleteByPrimaryKeyCDATA#IMPLIEDenableDeleteByExampleCDATA#IMPLIEDenableCountByExampleCDATA#IMPLIEDenableUpdateByExampleCDATA#IMPLIEDselectByPrimaryKeyQueryIdCDATA#IMPLIEDselectByExampleQueryIdCDATA#IMPLIEDmodelTypeCDATA#IMPLIEDescapeWildcardsCDATA#IMPLIEDdelimitIdentifiersCDATA#IMPLIEDdelimitAllColumnsCDATA#IMPLIED><!ELEMENTcolumnOverride(property*)><!ATTLISTcolumnOverridecolumnCDATA#REQUIREDpropertyCDATA#IMPLIEDjavaTypeCDATA#IMPLIEDjdbcTypeCDATA#IMPLIEDtypeHandlerCDATA#IMPLIEDisGeneratedAlwaysCDATA#IMPLIEDdelimitedColumnNameCDATA#IMPLIED><!ELEMENTignoreColumnEMPTY><!ATTLISTignoreColumncolumnCDATA#REQUIREDdelimitedColumnNameCDATA#IMPLIED><!ELEMENTignoreColumnsByRegex(except*)><!ATTLISTignoreColumnsByRegexpatternCDATA#REQUIRED><!ELEMENTexceptEMPTY><!ATTLISTexceptcolumnCDATA#REQUIREDdelimitedColumnNameCDATA#IMPLIED><!ELEMENTgeneratedKeyEMPTY><!ATTLISTgeneratedKeycolumnCDATA#REQUIREDsqlStatementCDATA#REQUIREDidentityCDATA#IMPLIEDtypeCDATA#IMPLIED><!ELEMENTdomainObjectRenamingRuleEMPTY><!ATTLISTdomainObjectRenamingRulesearchStringCDATA#REQUIREDreplaceStringCDATA#IMPLIED><!ELEMENTcolumnRenamingRuleEMPTY><!ATTLISTcolumnRenamingRulesearchStringCDATA#REQUIREDreplaceStringCDATA#IMPLIED><!ELEMENTcommentGenerator(property*)><!ATTLISTcommentGeneratortypeCDATA#IMPLIED>]><generatorConfiguration><contextid="ables"targetRuntime="MyBatis3"><!--添加Plugin--><plugintype="run.override.PluginChain"/><plugintype="run.override.SerializablePlugin"/><plugintype="org.mybatis.generator.plugins.ToStringPlugin"/><commentGeneratortype="run.override.CommentGenerator"/><jdbcConnectiondriverClass="com.mysql.jdbc.Driver"connectionURL="jdbc:mysql://xxx.xxx.xxx.xxx:3306/xxx?characterEncoding=utf8"userId="xxx"password="xxx"></jdbcConnection><javaTypeResolver><propertyname="forceBigDecimals"value="false"/></javaTypeResolver><javaModelGeneratortargetPackage="cn.xxx.elecsign.model"targetProject=".\src"><propertyname="enableSubPackages"value="false"/><propertyname="trimStrings"value="true"/></javaModelGenerator><sqlMapGeneratortargetPackage="mapper.cn.xxx.elecsign.dao"targetProject=".\src"><propertyname="enableSubPackages"value="false"/></sqlMapGenerator><javaClientGeneratortype="XMLMAPPER"targetPackage="cn.xxx.elecsign.dao"targetProject=".\src"><propertyname="enableSubPackages"value="false"/></javaClientGenerator><!--javaServiceGenerator--><javaServiceGeneratortargetPackage="cn.xxx.elecsign.dly.service"implementationPackage="cn.xxx.elecsign.dly.service.impl"targetProject=".\src"><propertyname="enableSubPackages"value="false"/></javaServiceGenerator><!--批次表,针对批量的异步操作--><tabletableName="table"domainObjectName="Table"alias="table"><generatedKeycolumn="id"sqlStatement="MySql"identity="true"/></table></context></generatorConfiguration>九、main启动

packagerun.generator;importjava.io.File;importjava.util.ArrayList;importjava.util.List;importorg.mybatis.generator.api.MyBatisGenerator;importorg.mybatis.generator.config.Configuration;importorg.mybatis.generator.internal.DefaultShellCallback;importrun.override.service.ConfigurationParserOverride;publicclassGenerator{publicvoidgenerator()throwsException{List<String>warnings=newArrayList<String>();booleanoverwrite=true;FileconfigFile=newFile("generatorConfig.xml");//替换ConfigurationParserConfigurationParserOverridecp=newConfigurationParserOverride(warnings);Configurationconfig=cp.parseConfiguration(configFile);DefaultShellCallbackcallback=newDefaultShellCallback(overwrite);MyBatisGeneratormyBatisGenerator=newMyBatisGenerator(config,callback,warnings);myBatisGenerator.generate(null);}publicstaticvoidmain(String[]args)throwsException{try{Generatorgenerator=newGenerator();generator.generator();}catch(Exceptione){e.printStackTrace();}}}

关于什么是Mybatis-Generator扩展自定义生成就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。