MyBatis Generator Plugin 详解

来源:互联网 发布:苏美尔文明 知乎 编辑:程序博客网 时间:2024/05/24 03:24

MyBatis Generator可以用Plugin在生成Java和XML文件过程中修改或者添加内容;Plugin必须实现org.mybatis.generator.api.Plugin接口,MBG提供了一个适配器org.mybatis.generator.api.PluginAdapter,一般情况下只需要继承这个适配器即可。


一。Plugin 的生命周期

MBG初始化和生成的过程中,会有序的调用Plugin上不同的方法。插件的生命周期如下:

1. 使用默认构造器创建;

2. setContext方法调用,注入生成器上下文;

3. setProperties方法调用,传入在配置文件中插件的参数;

4. validate方法调用,该方法一般用于验证传给参数的正确性,如果该方法返回false,则该插件结束执行;

5. 针对context中配置的每一个table:

(1) initialized方法被调用,用于初始化操作,传入IntrospectedTable;

(2) Java Client Methods被调用(这个地方需要注意一下,这里的Java Client Method调用和下面的Model Method,SQL Map Method的调用的前提是针对该table配置是分别需要生成client,model和SQL的,如果一个table不需要生成java client,那么这个阶段就忽略,下面两个阶段同理):

  • clientXXXMethodGenerated(Method, TopLevelClass, IntrospectedTable)方法调用(比如clientCountByExampleMethodGenerated方法),这些方法其实就是对应Java DAO中生成对应方法时调用(那个TopLevelClass其实就是对Java类的DOM封装)【注意】,这些方法主要针对ibatis;
  • clientXXXMethodGenerated(Method, Interface, IntrospectedTable)方法调用(比如clientCountByExampleMethodGenerated方法),这些方法其实就是对应Java中Mapper生成对应方法时调用;通过返回true和false来代表该方法是否需要生成;-clientGenerated(Interface, TopLevelClass, IntrospectedTable)方法调用;

  • (3) Model Methods被调用:
  • 对每一个字段依次调用modelFieldGenerated, modelGetterMethodGenerated, modelSetterMethodGenerated方法
  • modelExampleClassGenerated(TopLevelClass, IntrospectedTable):用于创建XXXExample类;TopLevelClass参数同理,也是就是生成XXXExample类的DOM;
  • modelPrimaryKeyClassGenerated(TopLevelClass, IntrospectedTable):用于创建那个主键(KeyClass)类;
  • modelBaseRecordClassGenerated(TopLevelClass, IntrospectedTable):用于创建那个Record class(主Class)类;
  • modelRecordWithBLOBsClassGenerated(TopLevelClass, IntrospectedTable):用于创建包含所有BLOB列的类;如果要修改这些类的生成结果,就是去修改TopLevelClass这个DOM的结构而已;
  • (4)  SQL Map Methods:这些方法主要是在生成SQL 那个mapper.xml文件时调用;

    • sqlMapXXXElementGenerated(XmlElement, IntrospectedTable),比如sqlMapDeleteByExampleElementGenerated,其实就是在XML文件中生成对应SQL元素的时候调用该方法,我们要修改生成的SQL或者元素内容,其实就是修改那个XmlElement,XmlElement是MBG对XML文件的DOM封装;
    • sqlMapDocumentGenerated(Document, IntrospectedTable)
    • sqlMapDocument(GeneratedXmlFile, IntrospectedTable),这两个方法都是最后生成XML的时候调用;

    (5) contextGenerateAdditionalJavaFiles(IntrospectedTable)方法调用(生成额外的Java文件,MBG自己是没有实现这个方法的,提供给插件一个扩展机会);

    (6) contextGenerateAdditionalXmlFiles(IntrospectedTable)方法调用(同理,生成额外的XML文件,MBG自己是没有实现这个方法的,提供给插件一个扩展机会)

    • contextGenerateAdditionalJavaFiles()方法调用,同contextGenerateAdditionalJavaFiles(IntrospectedTable)方法,只是没有参数而已;contextGenerateAdditionalXmlFiles()方法调用,同contextGenerateAdditionalXmlFiles(IntrospectedTable)方法,只是没有提供参数;


    二。插件开发
    继承org.mybatis.generator.api.PluginAdapter,然后只扩展自己需要扩展的方法;
    实现自己的方法,可以用来修改默认的MBG生成好的代码,或者添加自己额外需要生成的代码,一般可以在插件中完成:

    • 可以使用自己的注解来辅助生成代码;
    • 可以在类上面添加一些方法来辅助生成代码;
    • 可以添加一些XML中的元素的属性配置;
    • 可以添加一些额外的XML文件或者Java文件(比如一个例子就是生成MyBatisConfig.xml文件);
    contextXXX方法总是会被调用,而Java Client Method,Model Method和SQL Map Method是根据配置的MBG参数来选择性的执行;比如如果配置的是flat生成样式,那么modelPrimaryKeyClassGenerated(TopLevelClass, IntrospectedTable)方法就不会被调用;
    特别注意,如果一个方法返回的是boolean类型的,那么,如果该方法返回false,这个方法对应生成的代码片段(JAVA或者XML)就不会被生成了,并且,如果一个plugin返回了false,就会阻止其他的plugin的相同方法的继续执行,换句话说,配置在generatorConfig.xml中的plugin元素是有序的,这点需要特别注意。


    原创粉丝点击