zoukankan      html  css  js  c++  java
  • 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);
            }
        }
    }
    



    哇咔咔。成功了。


  • 相关阅读:
    UVA 10618 Tango Tango Insurrection
    UVA 10118 Free Candies
    HDU 1024 Max Sum Plus Plus
    POJ 1984 Navigation Nightmare
    CODEVS 3546 矩阵链乘法
    UVA 1625 Color Length
    UVA 1347 Tour
    UVA 437 The Tower of Babylon
    UVA 1622 Robot
    UVA127-"Accordian" Patience(模拟)
  • 原文地址:https://www.cnblogs.com/cxchanpin/p/6802229.html
Copyright © 2011-2022 走看看