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
- MyBatisGenerator生成数据库注释,实现分页,继承某一父类,实现Serializable,数据库列名前加上表名
- 数据库的分页实现
- 用数据库实现分页
- 数据库分页实现方式
- 分页 数据库实现
- 数据库的分页实现
- 数据库实现分页
- 数据库分页实现
- 实现数据库分页
- Oracle数据库实现分页
- 常见数据库分页实现
- 存储过程实现给所有的数据库运行一条操作语句,自动根据tc_截取,在表前面加上数据库名
- PHP实现数据库的分页类
- 创建Oracle数据库表时候加上注释(转)
- ext grid 数据库分页实现
- derby数据库分页的实现
- 实现JSP分页显示数据库
- oracle数据库实现分页查询
- 内部类Handler引发的内存泄漏问题
- Neutron总结-图文并茂理解iptables
- Linux 文件描述符及FILE结构体
- ios app安装的四种方式
- 搭建服务器
- MyBatisGenerator生成数据库注释,实现分页,继承某一父类,实现Serializable,数据库列名前加上表名
- Linux——守护进程(精灵进程)创建fork一次.两次的区别
- (四)请求调度、钩子
- POJ水题
- 怎样用css3设计出向上向下的小箭头
- MAC rabbitmq 安装guest登录失败
- 2017 华东师范大学网赛 G. 铁路修复计划(二分+最小生成树)
- java网络编程(tcp)
- WebStorm 激活