MyBatisGenerator生成数据库注释,实现分页,继承某一父类,实现Serializable,数据库列名前加上表名

来源:互联网 发布:数据库设计问题 编辑:程序博客网 时间:2024/06/05 09:18

最近做项目用到这个逆向工程,发现官方给出的配置并不符合本人要求,于是下载了源码经过分析,最终实现了本人想要的效果,现将代码及工程全贴出来,方便有需要的同志使用

帖子最后面有工本人修改后的工程源码下载地址,拿过去把配置文件换成你的数据库名称跟帐号就可以直接用了,


整体配置文件代码如下:


<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE generatorConfigurationPUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN" "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd"><generatorConfiguration><context id="testTables" targetRuntime="MyBatis3" defaultModelType="flat"><!-- 生成limit分页属性【扩展插件】--> <plugin type="mybitisPlugin.PaginationPlugin" /><!--生成的实体类实现序列化接口【扩展插件】--><plugin type="mybitisPlugin.SerializablePlugin" /> <!--生成的实体类重写toString方法--><plugin type="org.mybatis.generator.plugins.ToStringPlugin"/><!-- 生成的实体类重写hashCode和equals方法 --><plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin"/><!-- 生成数据库字段注释及自定义注释 【扩展插件】 --><commentGenerator type="mybitisPlugin.RemarksCommentGenerator"><!-- 格式化java代码 --><property name="javaFormatter" value="org.mybatis.generator.api.dom.DefaultJavaFormatter"/><!-- 格式化XML代码 -->        <property name="xmlFormatter" value="org.mybatis.generator.api.dom.DefaultXmlFormatter"/></commentGenerator> <!-- <commentGenerator>是否去除自动生成的注释 true:是 : false:否<property name="suppressAllComments" value="true" /><property name="suppressDate" value="true" /></commentGenerator> --><!--MySql数据库连接的信息:驱动类、连接地址、用户名、密码 --><jdbcConnection driverClass="com.mysql.jdbc.Driver"connectionURL="jdbc:mysql://localhost:3306/electronic" userId="root" password="123456"></jdbcConnection><!-- Oracle 数据库连接的信息 --><!-- <jdbcConnection driverClass="oracle.jdbc.OracleDriver" connectionURL="jdbc:oracle:thin:@127.0.0.1:1521:yycg" userId="yycg" password="yycg"> </jdbcConnection> --><!-- 默认false,把jdbc decimal 和 numeric 类型解析为 Integer,为 true时把jdbc decimal 和 numeric 类型解析为java.math.BigDecimal --><javaTypeResolver><property name="forceBigDecimals" value="false" /></javaTypeResolver><!-- targetProject:生成PO实体类的位置 --><javaModelGenerator targetPackage="music.struts2.model" targetProject=".\src"><!-- enableSubPackages:是否让schema作为包的后缀 --><property name="enableSubPackages" value="true" /><!-- 从数据库返回的值被清理前后的空格 --><property name="trimStrings" value="true" /></javaModelGenerator><!-- targetProject:mapper.xml映射文件生成的位置 --><sqlMapGenerator targetPackage="music.struts2.mapper" targetProject=".\src"><!-- enableSubPackages:是否让schema作为包的后缀 --><property name="enableSubPackages" value="false" /></sqlMapGenerator><!-- targetPackage:mapper接口生成的位置 --><javaClientGenerator type="XMLMAPPER" targetPackage="music.struts2.client" targetProject=".\src"><!-- enableSubPackages:是否让schema作为包的后缀 --><property name="enableSubPackages" value="true" /></javaClientGenerator><!-- 指定数据库表 --><table tableName="%" enableUpdateByExample="false" enableUpdateByPrimaryKey="false" enableInsert="false"><!-- 所有*Model的实体类继承统一父类 WebBasicModel注意这里的是*Model类而不是*Example类,*Example继承在后面会说到--> <property name="rootClass" value="music.struts2.webBasic.WebBasicModel"/></table></context></generatorConfiguration>


生成数据库注释及类注释等相关代码如下 

package mybitisPlugin;import java.text.SimpleDateFormat;import java.util.Date;import java.util.List;import org.mybatis.generator.api.IntrospectedColumn;import org.mybatis.generator.api.IntrospectedTable;import org.mybatis.generator.api.dom.java.Field;import org.mybatis.generator.api.dom.java.TopLevelClass;import org.mybatis.generator.internal.DefaultCommentGenerator;import org.mybatis.generator.internal.util.StringUtility;/** * 生成数据库字段注释 * 类名前加自定义注释 * 注释增加数据字段是否为必填项 * 注释增加数据字段是否有默认值 * 注释增加属性是否为主健 */public class RemarksCommentGenerator extends DefaultCommentGenerator {    @Override    public void addModelClassComment(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {        topLevelClass.addJavaDocLine("/**");        topLevelClass.addJavaDocLine(" * @数表名称 "+introspectedTable.getFullyQualifiedTable());        topLevelClass.addJavaDocLine(" * @开发日期 "+new SimpleDateFormat("yyyy-MM-dd").format(new Date()));        topLevelClass.addJavaDocLine(" * @开发作者 by:long ");        topLevelClass.addJavaDocLine(" */");    }    public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {        String remark = introspectedColumn.getRemarks();        String columnName = introspectedColumn.getActualColumnName();        List<IntrospectedColumn> primaryKey = introspectedTable.getPrimaryKeyColumns();        for (IntrospectedColumn pk : primaryKey) {        if(columnName.equals(pk.getActualColumnName())){        remark +=" (主健ID)";        continue;//主健属性上无需生明可选项跟必填项介绍        }        if (StringUtility.stringHasValue(remark)) {        remark += introspectedColumn.isNullable() ? "(可选项)" : "(必填项)";        }}        String defaultValue = introspectedColumn.getDefaultValue();        remark += null != defaultValue ? "  (默认值为: "+defaultValue+")" : " (无默认值)";        field.addJavaDocLine("/** "+ remark+" */");    }}

扩展自定义插件需要自定义一个类难后再继承官方指定的类,再重写里面的相关方法,该配置最后生成的代码效果如下图






实现分布功能代码如下

package mybitisPlugin;import java.util.List;import org.mybatis.generator.api.CommentGenerator;import org.mybatis.generator.api.IntrospectedTable;import org.mybatis.generator.api.PluginAdapter;import org.mybatis.generator.api.dom.java.Field;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.PrimitiveTypeWrapper;import org.mybatis.generator.api.dom.java.TopLevelClass;import org.mybatis.generator.api.dom.xml.Attribute;import org.mybatis.generator.api.dom.xml.TextElement;import org.mybatis.generator.api.dom.xml.XmlElement;/** * @author 江西DJ烟仔 *@time 2017年5月13日 :下午3:14:02 *  描述:扩展插件: *  生成limit分页属性 page跟pageSize *  修改分页属性page的get方法生成方为 (page-1)*pageSize *  同时继承指定父类 */public class PaginationPlugin extends PluginAdapter{@Override      public boolean modelExampleClassGenerated(TopLevelClass topLevelClass,IntrospectedTable introspectedTable) {          addLimit(topLevelClass, introspectedTable, "page");          addLimit(topLevelClass, introspectedTable, "pageSize");          addSuperClass(topLevelClass,introspectedTable);        return super.modelExampleClassGenerated(topLevelClass,  introspectedTable);      }  @Override      public boolean sqlMapSelectByExampleWithoutBLOBsElementGenerated(          XmlElement element, IntrospectedTable introspectedTable) {          XmlElement isNotNullElement = new XmlElement("if");        isNotNullElement.addAttribute(new Attribute("test", "null != page  and pageSize>=0"));        isNotNullElement.addElement(new TextElement("limit #{page} , #{pageSize}"));          element.addElement(isNotNullElement);          return super.sqlMapUpdateByExampleWithoutBLOBsElementGenerated(element,introspectedTable);      }          private void addLimit(TopLevelClass topLevelClass,IntrospectedTable introspectedTable, String name) {          CommentGenerator commentGenerator = context.getCommentGenerator();          Field field = new Field();          field.setVisibility(JavaVisibility.PROTECTED);          field.setType(PrimitiveTypeWrapper.getIntegerInstance());          field.setName(name);          commentGenerator.addFieldComment(field, introspectedTable);          topLevelClass.addField(field);          char c = name.charAt(0);          String camel = Character.toUpperCase(c) + name.substring(1);          Method method = new Method();          method.setVisibility(JavaVisibility.PUBLIC);          method.setName("set" + camel);          method.addParameter(new Parameter(PrimitiveTypeWrapper.getIntegerInstance(), name));          if(name.equals("page")){          method.addBodyLine("this." + name + "= (page-1) * pageSize;");        }else{        method.addBodyLine("this." + name + "=" + name + ";");          }        commentGenerator.addGeneralMethodComment(method, introspectedTable);          topLevelClass.addMethod(method);          method = new Method();          method.setVisibility(JavaVisibility.PUBLIC);          method.setReturnType(PrimitiveTypeWrapper.getIntegerInstance());          method.setName("get" + camel);          method.addBodyLine("return " + name + ";");          commentGenerator.addGeneralMethodComment(method, introspectedTable);          topLevelClass.addMethod(method);      }          //xxxExample类全部继承WebBasicExample    public void addSuperClass(TopLevelClass topLevelClass,IntrospectedTable introspectedTable) {topLevelClass.setSuperClass("WebBasicExample");        topLevelClass.addImportedType("music.struts2.webBasic.WebBasicExample");  }    public boolean validate(List<String> warnings) {          return true;      }  }



生成后的代码效果如下:




为*.Model跟*Example都实现序列化接口代码如下:


package mybitisPlugin;import org.mybatis.generator.api.IntrospectedTable;  import org.mybatis.generator.api.PluginAdapter;  import org.mybatis.generator.api.dom.java.*;    import java.util.List;  import java.util.Properties;  /** * 扩展 myBatis generator 插件, * 用于生成*Mode l跟 *Example 类都实现序列化接口 */public class SerializablePlugin extends PluginAdapter {        private FullyQualifiedJavaType serializable;      private FullyQualifiedJavaType gwtSerializable;      private boolean addGWTInterface;      private boolean suppressJavaInterface;        public SerializablePlugin() {          super();          serializable = new FullyQualifiedJavaType("java.io.Serializable"); //$NON-NLS-1$          gwtSerializable = new FullyQualifiedJavaType("com.google.gwt.user.client.rpc.IsSerializable"); //$NON-NLS-1$      }        public boolean validate(List<String> warnings) {          // this plugin is always valid          return true;      }        @Override      public void setProperties(Properties properties) {          super.setProperties(properties);          addGWTInterface = Boolean.valueOf(properties.getProperty("addGWTInterface")); //$NON-NLS-1$          suppressJavaInterface = Boolean.valueOf(properties.getProperty("suppressJavaInterface")); //$NON-NLS-1$      }        @Override      public boolean modelBaseRecordClassGenerated(TopLevelClass topLevelClass,IntrospectedTable introspectedTable) {        makeSerializable(topLevelClass, introspectedTable);                  return true;      }        @Override      public boolean modelPrimaryKeyClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {          makeSerializable(topLevelClass, introspectedTable);          return true;      }        @Override      public boolean modelRecordWithBLOBsClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {          makeSerializable(topLevelClass, introspectedTable);          return true;      }        /**      * 添加给Example类序列化的方法      * @param topLevelClass      * @param introspectedTable      * @return      */      @Override      public boolean modelExampleClassGenerated(TopLevelClass topLevelClass,IntrospectedTable introspectedTable){          makeSerializable(topLevelClass, introspectedTable);            for (InnerClass innerClass : topLevelClass.getInnerClasses()) {              if ("GeneratedCriteria".equals(innerClass.getType().getShortName())) { //$NON-NLS-1$                  innerClass.addSuperInterface(serializable);              }              if ("Criteria".equals(innerClass.getType().getShortName())) { //$NON-NLS-1$                  innerClass.addSuperInterface(serializable);              }              if ("Criterion".equals(innerClass.getType().getShortName())) { //$NON-NLS-1$                  innerClass.addSuperInterface(serializable);            }          }        return true;      }        protected void makeSerializable(TopLevelClass topLevelClass,                                      IntrospectedTable introspectedTable) {          if (addGWTInterface) {              topLevelClass.addImportedType(gwtSerializable);              topLevelClass.addSuperInterface(gwtSerializable);          }            if (!suppressJavaInterface) {              topLevelClass.addImportedType(serializable);              topLevelClass.addSuperInterface(serializable);                Field field = new Field();              field.setFinal(true);              field.setInitializationString("1L"); //$NON-NLS-1$              field.setName("serialVersionUID"); //$NON-NLS-1$              field.setStatic(true);              field.setType(new FullyQualifiedJavaType("long")); //$NON-NLS-1$              field.setVisibility(JavaVisibility.PRIVATE);              context.getCommentGenerator().addFieldComment(field, introspectedTable);                topLevelClass.addField(field);          }      }  }  


数据库列名前加上表名,此处有点复杂,需要修改源码,

通过源码分析找到如下类为mybatis生成xml文件中数据库列名即数据库字段对应的sql片段代码,那么接下来我们就可以对他进行操作了

但.jar包都是编译后的字节码.class文件,对这些文件我们只能看却不能修改,所以需要处已从官方或其它地方下载你逆向工程所对应的源码工程文件,

将它导入myEclipse或其它ide中进行编辑,导入源码工程后,[记住是以项目的形式导入而不是叫你增加源码,查看因为我们现在要修改它]


源码工程导入完后我们就可以修改它了,因为源码都是.java文件,跟我们平时新建的.java类没任何区别,接下来找到以下类,

背景为蓝色的地方为自已加上去增加表名代码,如下图:





接下来以架包的形式将我们修改过的类导出成.jar文件,因为我们只修改了这一个地方所以只导出它一个就行了,没必要将项目都导成.jar

右健选择类,选择菜单上的Export 选择java 再选择jar file 点next 操作如下图 






经过上面两部在我们指定的目录里就有一个修改源码.jar的文件了,双击解压它展开目录依次后找到导成架包编译后的.class文件,如下图




接下来做最关健的一部,找到你项目引入.jar包将我们修改并编译好的.class源码替换换原项目那个.class文件,如下图:



找到目录中的那个文件,将我们的文件拖进去点替换按钮 [注意,位置一定要找准,不要随便把它拖到其它不相关的目录] 如下图



到这里就大功告成了,刷新一下项目,最好是重启一下开发工具,然后再运行一下逆向工程,效果如下图,全部乖乖的加上了表名:效果如下图





好了今天就到这里,有不懂的地方也可以加我qq 554911540 

 若你不想那么麻烦的去折腾话,也可以下载本人修改好的,拿过去直接用吧,[记得修改一下数据库名跟帐号密码就行了]


修改后的工程下载

链接:http://pan.baidu.com/s/1nvv52R3 密码:piej








0 0