首页 > 代码库 > mybatis generator插件开发

mybatis generator插件开发

mybatis是目前大家普遍采用的DAO框架,mybatis generator可以根据数据库表结构,自动生成mybatis代码和配置文件,方便大家使用,当然实际的使用过程中,generator肯定有不少不尽人意的地方,好在他提供了插件的机制,方便我们做扩展。

这里讲解的插件开发依赖以下mybatis版本:

        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.2.2</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis.generator</groupId>
            <artifactId>mybatis-generator-maven-plugin</artifactId>
            <version>1.3.2</version>
        </dependency>

首先我们的插件类需要扩展PluginAdapter类,如下:

public class PaginationPlugin extends PluginAdapter {

pluginAdapter提供了所有的接口,方便我们在插件进行到某个操作的时候,做自定义的修改,这里我们主要介绍以下几类方法:

public boolean modelExampleClassGenerated(TopLevelClass topLevelClass,
                                              IntrospectedTable introspectedTable)

public boolean sqlMapSelectByExampleWithoutBLOBsElementGenerated(
            XmlElement element, IntrospectedTable introspectedTable) 

modelExampleClassGenerated方法顾名思义,就是生产modelExample类时的扩展,了解generator的都知道,他会帮你生产mapper、model、example三类java对象,其中example类是辅助我们用代码的方式来生产sql的,这个modelExampleClassGenerated方法就是在生产example的时候起效果的。


比如,原有的generator1.3.2插件不支持分页,那我们可以首先在modelExampleClassGenerated方法中,对生产的Class加上limit的参数,代码如下:

CommentGenerator commentGenerator = context.getCommentGenerator();
        Field field = new Field();
        field.setVisibility(JavaVisibility.PROTECTED);
        field.setType(FullyQualifiedJavaType.getIntInstance());
        field.setName(name);
        field.setInitializationString("-1");
        commentGenerator.addFieldComment(field, introspectedTable);
        topLevelClass.addField(field);
        char c = name.charAt(0);
        String camel = Character.toUpperCase(c) + name.substring(1);
        Method method = new Method();
        method.setVisibility(JavaVisibility.PUBLIC);
        method.setName("set" + camel);
        method.addParameter(new Parameter(FullyQualifiedJavaType
                .getIntInstance(), name));
        method.addBodyLine("this." + name + "=" + name + ";");
        commentGenerator.addGeneralMethodComment(method, introspectedTable);
        topLevelClass.addMethod(method);
        method = new Method();
        method.setVisibility(JavaVisibility.PUBLIC);
        method.setReturnType(FullyQualifiedJavaType.getIntInstance());
        method.setName("get" + camel);
        method.addBodyLine("return " + name + ";");
        commentGenerator.addGeneralMethodComment(method, introspectedTable);
        topLevelClass.addMethod(method);

如代码所示,其实我们就是定义了一个private int limitStart的属性,并添加了get和set方法。


添加完example的属性后,我们需要将这个属性加到生成的mapper xml配置文件中。这就用到sqlMapSelectByExampleWithBLOBsElementGenerated方法,当然,注意这个方法的名字,我们想修改哪个xml文件中的sql,就需要找到对应的方法来复写。


XmlElement isNotNullElement = new XmlElement("if"); //$NON-NLS-1$
        isNotNullElement.addAttribute(new Attribute("test", "limitStart != null and limitStart>-1")); //$NON-NLS-1$ //$NON-NLS-2$
        isNotNullElement.addElement(new TextElement(
                "limit ${limitStart} , ${limitEnd}"));
        element.addElement(isNotNullElement);

如上述代码,我们在生成的xml文件中,加入一个if条件判断,判断如果当前example类的limitStart和limitEnd不为-1,注意这个-1是我们在example扩展字段时候加上的默认值,如果不是默认值,那么就加上limit ${limitStart}, ${limitEnd}分页条件。


如上所述,就是这么简单,我们可以对生成的mybatis java代码、xml配置做自己的修改。


下面看一下,如何来使用该插件。我们首先需要在使用generator的工程pom文件中加入generator插件,并将我们的插件包依赖加进来,这里我们的例子是mybatis-page-plugin。

<build>
        <defaultGoal>install</defaultGoal>

        <plugins>
            <plugin>
                <groupId>org.mybatis.generator</groupId>
                <artifactId>mybatis-generator-maven-plugin</artifactId>
                <version>1.3.2</version>
                <configuration>
                    <configurationFile>generatorConfig.xml</configurationFile>
                    <verbose>true</verbose>
                    <overwrite>true</overwrite>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>mysql</groupId>
                        <artifactId>mysql-connector-java</artifactId>
                        <version>5.1.6</version>
                    </dependency>
                    <dependency>
                        <groupId>org.duoku.groom</groupId>
                        <artifactId>mybatis-page-plugin</artifactId>
                        <version>1.0-SNAPSHOT</version>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>

如配置所述,我们的插件配置文件是generatorConfig.xml,我们来看一下这个文件:

<generatorConfiguration>

    <context id="MBG" targetRuntime="MyBatis3" defaultModelType="conditional">	<!--targetRuntime 此属性用于指定生成的代码的运行目标。 -->
        <plugin type="org.mybatis.generator.plugins.EqualsHashCodePlugin" />
        <plugin type="org.duoku.groom.mybatis.plugin.PaginationPlugin"></plugin>

如上图所示,我们在plugin中,加上我们的插件,PaginationPlugin。

这样,我们就可以使用该插件了。

mybatis generator插件开发