mybatis Generator 实现与插件

PluginAdaptor 是适配器设计模式吗?

  • 首先我觉得是模板方法设计模式,用接口定义执行顺序,你可以对其中的一些方法做自定义开发
  • 从自定义开发方法,如果想在执行过程中使用,必须满足接口要求的角度,这个也算适配器模式
  • 20190311 个人理解:
    • 是适配器,统一插件的扩展接口,使其能够适配上相应的位置,正确执行

程序入口:

  • Main-Class: org.mybatis.generator.api.ShellRunner
  • 如上所示类org.mybatis.generator.api.ShellRunner   的main 方法就是我们要解读源码的入口
主函数基本逻辑
  • 1、命令行参数是否合理并解析
  • 2、读取xml配置文件并解析位内存数据以工使用
  • 3、实例化一个shell回调函数,用于执行过程中的回调
  • 4、实例化一个mybatis代码生成对象
  • 5、实例化一个过程回调函数,用于是否输出过程日志等处理(或根本不需要回调)
  • 6、调用生成方法生成代码并保存为相关文件

https://blog.csdn.net/u011781521/article/list/6 大神讲解链接

插件

  • Plugin能够用来在MyBatis Generator生成Java和XML文件过程中修改或者添加内容,Plugin必须实现org.mybatis.generator.api.Plugin接口,在这个接口中提供了非常多的方法,MBG还提供了一个适配器org.mybatis.generator.api.PluginAdapter,适配器类提供基本的插件支持,并为大多数接口方法实现无操作方法,一般情况下只需要继承这个适配器即可

自带插件举例(具体参见官网http://www.mybatis.org/generator/reference/plugins.html):

  • org.mybatis.generator.plugins.CachePlugin###
    • sqlMap文件中,开启二级缓存的作用
    • <cache 
      eviction="FIFO"  <!--回收策略为先进先出-->
      flushInterval="60000" <!--自动刷新时间60s-->
      size="512" <!--最多缓存512个引用对象-->
      readOnly="true"/> <!--只读-->

插件生命周期

  • 在代码生成过程的初始化过程中创建插件,并按顺序调用进程的不同阶段
  • Plugin 接口定义了所有的插件接口,这些接口PluginAdapter抽象类大部分都实现了默认啥也不做的方法
  • 继承PluginAdapter,然后做你想做的事情 

(第一种接口)Java客户端方法:1,2

  • 1.clientXXXMethodGenerated(Method,TopLevelClass,IntrospectedTable) - 这些方法被调用,因为生成了Java客户端实现类的每个方法。
  • 2.clientXXXMethodGenerated(Method,Interface,IntrospectedTable) - 这些方法被调用,因为生成了每个Java客户端接口的方法。
  • 3.clientGenerated(Interface,TopLevelClass,IntrospectedTable)方法调用 

(第二种接口)模型方法:1

  • 1.modelFieldGenerated,modelGetterMethodGenerated,modelSetterMethod为类中的每个字段生成
  • 2.modelExampleClassGenerated(TopLevelClass,IntrospectedTable)
  • 3.modelPrimaryKeyClassGenerated(TopLevelClass,IntrospectedTable)
  • 4.modelBaseRecordClassGenerated(TopLevelClass,IntrospectedTable)
  • 5.modelRecordWithBLOBsClassGenerated(TopLevelClass,IntrospectedTable) 

(第三种类型接口)SQL Map方法:1

  • 1.sqlMapXXXElementGenerated(XmlElement,IntrospectedTable) - 这些方法被调用,因为SQL映射的每个元素都被生成
  • 2.sqlMapDocumentGenerated(Document,IntrospectedTable)
  • 3.sqlMapDocument(GeneratedXmlFile,IntrospectedTable)
  • 4.contextGenerateAdditionalJavaFiles(IntrospectedTable)方法调用
  • 5.contextGenerateAdditionalXmlFiles(IntrospectedTable)方法调用
  • 6.contextGenerateAdditionalJavaFiles()方法调用
  • 7.contextGenerateAdditionalXmlFiles()方法调用 

详细版:

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

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

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

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

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

6.initialized方法被调用,用于初始化操作,传入IntrospectedTable;

7.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)方法调用;

8.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的结构而已;

9.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的时候调用;


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


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


--contextGenerateAdditionalJavaFiles()方法调用,同contextGenerateAdditionalJavaFiles(IntrospectedTable)方法,只是没有参数而已;


--contextGenerateAdditionalXmlFiles()方法调用,同contextGenerateAdditionalXmlFiles(IntrospectedTable)方法,只是没有提供参数;

注意:

  • 1 - 这些方法将被封装的代码生成器调用。
  • 如果您提供自定义代码生成器,则只有在自定义代码生成器调用它们时才会调用这些方法。
  •  
  • 2 - Java客户端方法只会被调用是一个Java客户端生成器被配置。
  •  
  • 3.contextXXX方法总是会被调用,而Java Client Method,Model Method和SQL Map Method是根据配置的MBG参数来选择性的执行;比如如果配置的是flat生成样式,那么modelPrimaryKeyClassGenerated(TopLevelClass, IntrospectedTable)方法就不会被调用;
  •  
  • 4.如果一个方法返回的是boolean类型的,那么,如果该方法返回false,这个方法对应生成的代码片段(JAVA或者XML)就不会被生成了,并且,如果一个plugin返回了false,就会阻止其他的plugin的相同方法的继续执行,换句话说,配置在generatorConfig.xml中的plugin元素是有序的,这点需要特别注意。如果配置了多个插件,则从方法返回false的第一个插件将导致MyBatis Generator在所有其他插件中停止调用该方法
     

转载于:https://my.oschina.net/u/3847203/blog/2243711

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值