MyBatis Generator生成DAO——序列化
Posted cxchanpin
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis Generator生成DAO——序列化相关的知识,希望对你有一定的参考价值。
MyBatis Generator生成DAO 的时候,生成的类都是没有序列化的。
还以为要手工加入(開始是手工加入的),今天遇到分页的问题,才发现生成的时候能够加入插件。
既然分页能够有插件。序列化是不是也有呢。
果然SerializablePlugin,已经给我们提供好了。
<plugin type="org.mybatis.generator.plugins.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<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); 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<String> 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<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 Generator生成DAO——序列化的主要内容,如果未能解决你的问题,请参考以下文章
Mybatis Generator生成Mybatis Dao接口层*Mapper.xml以及对应实体类
mybatis generator.xml 配置 自动生成model,dao,mapping
使用MyBatis Generator自动生成DAO以及实体类
使用MyBatis Generator自动生成实体mapper和dao层