博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MyBatis Generator生成DAO——序列化
阅读量:6852 次
发布时间:2019-06-26

本文共 10609 字,大约阅读时间需要 35 分钟。

MyBatis Generator生成DAO 的时候,生成的类都是没有序列化的。

还以为要手工加入(開始是手工加入的委屈),今天遇到分页的问题,才发现生成的时候能够加入插件。

既然分页能够有插件。序列化是不是也有呢。

果然SerializablePlugin,已经给我们提供好了。

立即高端大气了起来。每一个model对象都乖乖的带上了Serializable接口。

无奈仅仅有model对象是不够的,做分布式开发的话。Example对象也必需要序列化。

于是下载了SerializablePlugin的源代码。model能够有。Example肯定也能够有。不出所料稍作改动就加上了。

(直接用原来的源代码加入了自己的代码)

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;/** * Created by tiantao on 15-7-1. */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
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); 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); } }}

哇咔咔,太好用了。Example都加上了。

只是问题还没有完,Example里还有内部类。假设不序列化还是会报错。

这次明显更刚才的套路不一样了。没有抱太大希望。

无意间发现了还有一个插件类,也是包里自带的。

发现了宝藏,这里居然有对内部类的操作。

import java.util.List;import org.mybatis.generator.api.PluginAdapter;import org.mybatis.generator.api.IntrospectedColumn;import org.mybatis.generator.api.IntrospectedTable;import org.mybatis.generator.api.dom.java.FullyQualifiedJavaType;import org.mybatis.generator.api.dom.java.InnerClass;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.codegen.ibatis2.Ibatis2FormattingUtilities;/** * This plugin demonstrates adding methods to the example class to enable * case-insensitive LIKE searches. It shows hows to construct new methods and * add them to an existing class. *  * This plugin only adds methods for String fields mapped to a JDBC character * type (CHAR, VARCHAR, etc.) *  * @author Jeff Butler *  */public class CaseInsensitiveLikePlugin extends PluginAdapter {    /**     *      */    public CaseInsensitiveLikePlugin() {        super();    }    public boolean validate(List
warnings) { return true; } @Override public boolean modelExampleClassGenerated(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) { InnerClass criteria = null; // first, find the Criteria inner class for (InnerClass innerClass : topLevelClass.getInnerClasses()) { if ("GeneratedCriteria".equals(innerClass.getType().getShortName())) { //$NON-NLS-1$ criteria = innerClass; break; } } if (criteria == null) { // can't find the inner class for some reason, bail out. return true; } for (IntrospectedColumn introspectedColumn : introspectedTable .getNonBLOBColumns()) { if (!introspectedColumn.isJdbcCharacterColumn() || !introspectedColumn.isStringColumn()) { continue; } Method method = new Method(); method.setVisibility(JavaVisibility.PUBLIC); method.addParameter(new Parameter(introspectedColumn .getFullyQualifiedJavaType(), "value")); //$NON-NLS-1$ StringBuilder sb = new StringBuilder(); sb.append(introspectedColumn.getJavaProperty()); sb.setCharAt(0, Character.toUpperCase(sb.charAt(0))); sb.insert(0, "and"); //$NON-NLS-1$ sb.append("LikeInsensitive"); //$NON-NLS-1$ method.setName(sb.toString()); method.setReturnType(FullyQualifiedJavaType.getCriteriaInstance()); sb.setLength(0); sb.append("addCriterion(\"upper("); //$NON-NLS-1$ sb.append(Ibatis2FormattingUtilities .getAliasedActualColumnName(introspectedColumn)); sb.append(") like\", value.toUpperCase(), \""); //$NON-NLS-1$ sb.append(introspectedColumn.getJavaProperty()); sb.append("\");"); //$NON-NLS-1$ method.addBodyLine(sb.toString()); method.addBodyLine("return (Criteria) this;"); //$NON-NLS-1$ criteria.addMethod(method); } return true; }}
把原来的方法再优化一下下。

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;/** * Created by tiantao on 15-7-1. */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
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); } }}

哇咔咔。成功了。

你可能感兴趣的文章
C语言笔试题
查看>>
改进了一下这个游戏的输出及思路,是不是好玩多了??:)
查看>>
Hibernate从入门到放弃(一)----初识ORM
查看>>
OpenSSL 与 SSL 数字证书概念贴
查看>>
云时代下的开源之路 专访阿里云数据库团队
查看>>
Android的sdk、api及工程目录说明
查看>>
RHEL64 缺少ISO 9660图像 安装程序试图挂载映像#1,在硬盘上无法找到该映像
查看>>
源码安装apache
查看>>
CentOS7安装MySQL5.6.27数据库
查看>>
Data Guard Broker系列之五:数据库角色转换
查看>>
第三章_JSP
查看>>
【原创】modb 功能设计之“支持部分MySQL客户端协议”-3
查看>>
Spring中你不知道的注入方式
查看>>
导航点击选中效果重构
查看>>
手机端产生本地图形验证码
查看>>
C++设计模式之1-工厂模式
查看>>
Android自定义View 画弧形,文字,并增加动画效果
查看>>
设计模式 总揽 通过这篇随笔可以访问所需要了解的设计模式
查看>>
Java HotSpot VM中的JIT编译
查看>>
敏捷软件测试--初见
查看>>