MBG工具类-mybatis自定义代码生成器(Generator)

         在前段工作中 使用过Mybatis的逆向工程中的Example系列操作方法,在此通过Mybatis的MBG重写一个方便于

本人现阶段使用的CRUD工具类,如下:

1.继承PluginAdapter

import java.util.List;

import org.mybatis.generator.api.CommentGenerator;
import org.mybatis.generator.api.IntrospectedColumn;
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.FullyQualifiedJavaType;
import org.mybatis.generator.api.dom.java.Interface;
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.api.dom.xml.Attribute;
import org.mybatis.generator.api.dom.xml.Document;
import org.mybatis.generator.api.dom.xml.TextElement;
import org.mybatis.generator.api.dom.xml.XmlElement;
import org.mybatis.generator.codegen.mybatis3.MyBatis3FormattingUtilities;

/**
 * @author : ShiLei
 * @time :2017年12月18日 下午7:57:23
 * @introduction : MBG工具类 
 */
public class MybatisGeneratorUtils extends PluginAdapter {

    //标识  是否继承BaseDao  默认不继承 false
    private boolean isBase=false;
    
    /**
     *  校验   无参数传递 直接返回 设置为true
     *
     */
    @Override
    public boolean validate(List<String> arg0) {
        return true;
    }
    
    /**
     *
     *  生成DAO 每个DAO继承基类DAO,同时向DAO中添加自定义方法(也可将其放入BaseDao)
     *
     */
    @Override
    public boolean clientGenerated(Interface interfaze,TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {   
        if (isBase) {
            FullyQualifiedJavaType fqjt = new FullyQualifiedJavaType("BaseDao<"+introspectedTable.getBaseRecordType()+">");  
            FullyQualifiedJavaType imp = new FullyQualifiedJavaType("com.sl.api.common.base.BaseDao");  
            interfaze.addSuperInterface(fqjt);// 添加 extends BaseDao<User>  
            interfaze.addImportedType(imp);// 添加import common.BaseDao;  
            interfaze.getMethods().clear();
        }else {
            interfaze.addImportedType(new FullyQualifiedJavaType("org.apache.ibatis.annotations.Param"));
            // 在DAO中添加自定义方法(一) 逻辑批量删除
            interfaze.addMethod(delRecordsByLogic(introspectedTable));
            // 在DAO中添加自定义方法(二) 真实批量删除
            interfaze.addMethod(delRecords(introspectedTable));
        }
        return super.clientGenerated(interfaze, topLevelClass, introspectedTable);
    }
    
    /**
     *
     *  生成的实体类Model 加入serialVersionUID值
     *
     */
    @Override
    public boolean modelBaseRecordClassGenerated(TopLevelClass topLevelClass,
            IntrospectedTable introspectedTable) {
        //根据需要选择使用 --使用时有个美中不足之处请指出!
        //addSerialVersionUID(topLevelClass, introspectedTable);
        return super.modelBaseRecordClassGenerated(topLevelClass, introspectedTable);
    }
    
    /**
     *
     *  向mapping中添加自定义信息
     *
     */
    @Override
    public boolean sqlMapDocumentGenerated(Document document,
            IntrospectedTable introspectedTable) {
        
        //添加自定义sql
        sqlXMLGenerated(document, introspectedTable);
        //添加自定义方法(一)
        methodXMLGenerated_one(document, introspectedTable);
        //添加自定义方法(二)
        methodXMLGenerated_two(document, introspectedTable);
        //添加自定义方法(三)
        methodXMLGenerated_three(document, introspectedTable);
        //添加自定义方法(四)
        methodXMLGenerated_four(document, introspectedTable);
        
        return true;
    }
    
    
    
    
    
    // 对应于xml文件中的自定义方法  在DAO中添加自定义方法(一)   逻辑批量删除
    private Method delRecordsByLogic(IntrospectedTable introspectedTable) {  
        Method m = new Method("delRecordsByLogic");  
        m.setVisibility(JavaVisibility.PRIVATE);  
        m.setReturnType(FullyQualifiedJavaType.getIntInstance());  
        m.addParameter(new Parameter(new FullyQualifiedJavaType("Integer"), "delFlag", "@Param(\"delFlag\")"));  
        m.addParameter(new Parameter(new FullyQualifiedJavaType("String"), "ids", "@Param(\"ids\")"));  
        context.getCommentGenerator().addGeneralMethodComment(m, introspectedTable);  
        return m;  
    }
    
    // 对应于xml文件中的自定义方法  在DAO中添加自定义方法(二)   真实批量删除
    private Method delRecords(IntrospectedTable introspectedTable) {  
        Method m = new Method("delRecords");  
        m.setVisibility(JavaVisibility.PRIVATE);  
        m.setReturnType(FullyQualifiedJavaType.getIntInstance());  
        m.addParameter(new Parameter(new FullyQualifiedJavaType("String"), "ids", "@Param(\"ids\")"));  
        context.getCommentGenerator().addGeneralMethodComment(m, introspectedTable);  
        return m;  
    }
    
    //为生成的实体类中添加自定义属性(序列化版本号)
    private void addSerialVersionUID(TopLevelClass topLevelClass, IntrospectedTable introspectedTable) {
        CommentGenerator commentGenerator = context.getCommentGenerator();  
        Field field = new Field();  
        field.setVisibility(JavaVisibility.PRIVATE);  
        field.setType(new FullyQualifiedJavaType("long"));  
        field.setStatic(true);  
        field.setFinal(true);  
        field.setName("serialVersionUID");  
        field.setInitializationString("1L");
        //设置注释
        field.addJavaDocLine("//序列化版本号");
        commentGenerator.addFieldComment(field, introspectedTable);  
        topLevelClass.addField(field);
        //添加 对应的getter方法 不存在对应的setter方法
        Method m = new Method("getSerialversionuid");
        m.addJavaDocLine("//获取:序列化版本号");
        m.setVisibility(JavaVisibility.PUBLIC);  
        m.setReturnType(new FullyQualifiedJavaType("long"));
        m.setStatic(true); 
        m.addBodyLine("return serialVersionUID;");
        topLevelClass.addMethod(m);  
    } 
    
    //生成mapping 添加自定义sql Base_Where_List
    public boolean sqlXMLGenerated(Document document,IntrospectedTable introspectedTable) {
            XmlElement parentElement = document.getRootElement();
            XmlElement sql = new XmlElement("sql");  
            sql.addAttribute(new Attribute("id", "Base_Where_List"));  
            XmlElement where = new XmlElement("where");
            // 加入 逻辑删除 del_flag标识 根据选择是否添加
            where.addElement(new TextElement(" DEL_FLAG != 1 "));
            StringBuilder sb = new StringBuilder();  
            for (IntrospectedColumn introspectedColumn : introspectedTable.getNonPrimaryKeyColumns()) {  
                XmlElement isNotNullElement = new XmlElement("if");  
                sb.setLength(0);  
                sb.append(introspectedColumn.getJavaProperty()+" != null");
                sb.append(" and ");
                sb.append(introspectedColumn.getJavaProperty()+" != ''");
                isNotNullElement.addAttribute(new Attribute("test", sb.toString()));  
                where.addElement(isNotNullElement);  
      
                sb.setLength(0);  
                sb.append(" and ");  
                sb.append(MyBatis3FormattingUtilities.getEscapedColumnName(introspectedColumn));  
                sb.append(" = "); //$NON-NLS-1$  
                sb.append(MyBatis3FormattingUtilities.getParameterClause(introspectedColumn));  
                isNotNullElement.addElement(new TextElement(sb.toString()));  
            }  
            sql.addElement(where);  
            parentElement.addElement(sql);
        return super.sqlMapDocumentGenerated(document, introspectedTable);
    }
    
    //生成mapping 添加自定义方法(一) 条件查询列表记录   findRecords
    public boolean methodXMLGenerated_one(Document document,IntrospectedTable introspectedTable) {
        XmlElement parentElement = document.getRootElement(); 
        XmlElement select = new XmlElement("select");  
        select.addAttribute(new Attribute("id", "findRecords"));  
        select.addAttribute(new Attribute("resultMap", "BaseResultMap"));  
        select.addAttribute(new Attribute("parameterType", introspectedTable.getBaseRecordType()));  
        select.addElement(new TextElement(" select "));
        XmlElement include1 = new XmlElement("include");
        include1.addAttribute(new Attribute("refid", "Base_Column_List"));
        select.addElement(include1);
        select.addElement(new TextElement(" from "+ introspectedTable.getFullyQualifiedTableNameAtRuntime()));  
          
        XmlElement include2 = new XmlElement("include");  
        include2.addAttribute(new Attribute("refid", "Base_Where_List"));  
        select.addElement(include2);  
        select.addElement(new TextElement(
        "ORDER BY ID DESC <if test=\"pageSize!=-1\"> LIMIT #{pageNo,jdbcType=INTEGER}, #{pageSize,jdbcType=INTEGER}</if>"));
        parentElement.addElement(select);
        return super.sqlMapDocumentGenerated(document, introspectedTable);
    }
    
    //生成mapping 添加自定义方法(二)条件查询列表记录总数  findRecordsCount
    public boolean methodXMLGenerated_two(Document document,IntrospectedTable introspectedTable) {
        XmlElement parentElement = document.getRootElement();
        XmlElement selectCount = new XmlElement("select");  
        selectCount.addAttribute(new Attribute("id", "findRecordsCount"));  
        selectCount.addAttribute(new Attribute("resultType", "java.lang.Long"));  
        selectCount.addAttribute(new Attribute("parameterType", introspectedTable.getBaseRecordType()));  
        selectCount.addElement(new TextElement(
               "select count(1) from "+ introspectedTable.getFullyQualifiedTableNameAtRuntime()));  
          
        XmlElement include = new XmlElement("include");  
        include.addAttribute(new Attribute("refid", "Base_Where_List"));  
        selectCount.addElement(include);  
        parentElement.addElement(selectCount);  
        return super.sqlMapDocumentGenerated(document, introspectedTable);
    }
    
    //生成mapping 添加自定义方法(三) 真实批量删除
    public boolean methodXMLGenerated_three(Document document,IntrospectedTable introspectedTable) {
        XmlElement parentElement = document.getRootElement();
        XmlElement deleteByIds = new XmlElement("delete");
        deleteByIds.addAttribute(new Attribute("id", "delRecords"));  
        deleteByIds.addAttribute(new Attribute("parameterType", "java.lang.String"));
        deleteByIds.addElement(new TextElement(
              "delete from "+ introspectedTable.getFullyQualifiedTableNameAtRuntime()+" where id IN(${ids})"));  
        parentElement.addElement(deleteByIds);
        return super.sqlMapDocumentGenerated(document, introspectedTable);
    }
    
    //生成mapping 添加自定义方法(四) 逻辑批量删除
    public boolean methodXMLGenerated_four(Document document,IntrospectedTable introspectedTable) {
        XmlElement parentElement = document.getRootElement();
        XmlElement deleteByIds = new XmlElement("update");
        deleteByIds.addAttribute(new Attribute("id", "delRecordsByLogic"));  
        deleteByIds.addAttribute(new Attribute("parameterType", "java.lang.String"));
        deleteByIds.addElement(new TextElement(
        "update "+ introspectedTable.getFullyQualifiedTableNameAtRuntime()
                +"set DEL_FLAG=#{delFlag,jdbcType=INTEGER} where id IN(${ids})"));  
        parentElement.addElement(deleteByIds);
        return super.sqlMapDocumentGenerated(document, introspectedTable);
    }
    
}


2.配置generatorConfig.xml

<context id="DB2Tables" targetRuntime="MyBatis3">
   <plugin type="com.sl.api.common.base.MybatisGeneratorUtils" />
    .
    .
</context>

深入了解:  http://www.cnblogs.com/dogdogwang/p/7470861.html

 

      

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值