mybatis generator 修改

修改目标

mybatis配置spring使用时, 原生的generator 不能满足需求 , 生成后需要修改代码, 增加和删除字段会比较烦琐, 因此需要对generator进行修改, 达到一键生成的效果.

  • 去除烦人的注释, 只显示数据库中的注释
  • Mapper类增加@Mapper注解
  • 实体类继承基类,并且不覆盖基类中的成员(比如id)
  • 实体类增加序列化字段serialVersionUID

下载源码

git clone https://github.com/mybatis/generator.git

注释修改

在core/mybatis-generator-core/src/main/java/org/mybatis/generator/internal中增加一个自定义类, 继承默认注释类DefaultCommentGenerator, 对其中的方法进行重写, 达到去除烦人注释的目的.

public class ShortCommentGenerator extends DefaultCommentGenerator {
    private boolean suppressAllComments;

    /** If suppressAllComments is true, this option is ignored. */
    private boolean addRemarkComments;

    @Override
    public void addConfigurationProperties(Properties properties) {
        super.addConfigurationProperties(properties);
        suppressAllComments = isTrue(properties
                .getProperty(PropertyRegistry.COMMENT_GENERATOR_SUPPRESS_ALL_COMMENTS));

        addRemarkComments = isTrue(properties
                .getProperty(PropertyRegistry.COMMENT_GENERATOR_ADD_REMARK_COMMENTS));
    }

    /**
     * Adds a suitable comment to warn users that the element was generated, and when it was generated.
     *
     * @param xmlElement the xml element
     */
    @Override
    public void addComment(XmlElement xmlElement) {

    }

    @Override
    public void addEnumComment(InnerEnum innerEnum,
                               IntrospectedTable introspectedTable) {

    }

    @Override
    public void addFieldComment(Field field, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {
        if (suppressAllComments) {
            return;
        }

        String remarks = introspectedColumn.getRemarks();
        if (addRemarkComments && StringUtility.stringHasValue(remarks)) {
            field.addJavaDocLine("/**");
            String[] remarkLines = remarks.split(System.getProperty("line.separator"));
            for (String remarkLine : remarkLines) {
                field.addJavaDocLine(" *  " + remarkLine);
            }
            field.addJavaDocLine(" */");
        }
    }

    @Override
    public void addFieldComment(Field field, IntrospectedTable introspectedTable) {

    }

    @Override
    public void addGeneralMethodComment(Method method,
                                        IntrospectedTable introspectedTable) {

    }

    @Override
    public void addGetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {

    }

    @Override
    public void addSetterComment(Method method, IntrospectedTable introspectedTable, IntrospectedColumn introspectedColumn) {

    }
}

在使用时, 配置注释为自定义的注释器就可以了:

<commentGenerator type="org.mybatis.generator.internal.ShortCommentGenerator">
            <property name="suppressAllComments" value="false"/>
            <property name="addRemarkComments" value="true"/>
        </commentGenerator>

Mapper类增加@Mapper注解

修改JavaMapperGenerator 在 getCompilationUnits 函数中增加一段代码:

interfaze.addAnnotation("@Mapper");
interfaze.addImportedType(new FullyQualifiedJavaType("org.apache.ibatis.annotations.Mapper"));

基类设置

为了让rootClass可以被generator访问到, 将自定义的基类复制到core/mybatis-generator-core/src/main/java/目录下(注意带上包名路径)
自定义基类可以做一些修改, 只要保留字段和其Getter/Setter就可以了, generator会做检查,如果基类中有字段了,就不会在实体类中重新添加.
示例基类:

package cn.com.xxx.common.db; //注意包名要和业务代码中一致
import java.io.Serializable;
public class BaseEntity implements Serializable {
    private Long id;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }
}

使用时,这样配置

<javaModelGenerator targetPackage="cn.com.xxx.timer.data.model"
                            targetProject="service/src/main/java">
        <property name="rootClass" value="cn.com.xxx.common.db.BaseEntity"/>
</javaModelGenerator>

增加序列化字段serialVersionUID

因为基类继承了Serializable, 所以要增加这个变量, 主要是修改BaseRecordGenerator, 在getCompilationUnits中增加一段代码:

//...

        //add serialVersionUID
        Field field = new Field();
        System.out.println("root class is : "+rootClass);
        if(rootClass!=null){
            try {
                Class rootClazz=Class.forName(rootClass);
                if (rootClazz.newInstance() instanceof Serializable) {
                    field.setType(new FullyQualifiedJavaType("long"));
                    field.setName("serialVersionUID");
                    field.setVisibility(JavaVisibility.PRIVATE);
                    field.setFinal(true);
                    field.setStatic(true);
                    field.setInitializationString(new Random().nextLong() + "L");
                    topLevelClass.addField(field);
                    topLevelClass.addImportedType(field.getType());
                }
            } catch (Exception e) {
               System.out.println("can not load rootClass");
            }
        }

// ...

打包

在~/code/generator/core/mybatis-generator-core目录下执行:
mvn package
完了会在当前目录/target目录下生成包: mybatis-generator-core-1.3.7-SNAPSHOT.jar
使用这个包来生成代码,就能实现想要的功能了.

附一个简单generator配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
        PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
        "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">

<generatorConfiguration>
    <classPathEntry location="mysql-connector-java-6.0.5.jar"/>
    <context id="MysqlTables" defaultModelType="flat" targetRuntime="MyBatis3">
        <commentGenerator type="org.mybatis.generator.internal.ShortCommentGenerator">
            <property name="suppressAllComments" value="false"/>
            <property name="addRemarkComments" value="true"/>
        </commentGenerator>

        <jdbcConnection driverClass="com.mysql.jdbc.Driver"
                        connectionURL="jdbc:mysql://192.168.1.22:13000/timer?nullCatalogMeansCurrent=true
                            &amp;useUnicode=true
                            &amp;characterEncoding=utf8
                            &amp;serverTimezone=Asia/Shanghai"
                        userId="xxx"
                        password="123456">
        </jdbcConnection>

        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>

        <javaModelGenerator targetPackage="cn.com.xxx.timer.data.model"
                            targetProject="service/src/main/java">
            <property name="rootClass" value="cn.com.sjfx.common.db.BaseEntity"/>
        </javaModelGenerator>

        <sqlMapGenerator targetPackage="mapper" targetProject="service/src/main/resources">

        </sqlMapGenerator>

        <javaClientGenerator type="XMLMAPPER" targetPackage="cn.com.xxx.timer.data.dao"
                             targetProject="service/src/main/java">

        </javaClientGenerator>

        <table tableName="task_info" domainObjectName="TaskInfo" >
        </table>
    </context>
</generatorConfiguration>

修改后的代码

https://github.com/crazyman2010/generator

参考

http://www.mybatis.org/generator/index.html
<<MyBatis 从入门到精通 >> 刘增辉

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值