• 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);
            }
        }
    }
    



    哇咔咔。成功了。


  • 相关阅读:
    Weak Event模型
    Dispatcher Queue性能分析
    WPF中ControlTemplate,ItemsPanelTemplate ,DataTemplate
    事件与委托
    DataGrid: 数据项更新并保持多选
    【C#学习笔记】using 三种使用方式
    Python快捷键
    比特率和波特率
    c#winform程序退出的方法
    C#socket通信-----多线程
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/6802229.html
Copyright © 2020-2023  润新知