MyBatis Generator系列(四)----MyBatis Generator Plugin插件详解

来源:互联网 发布:python mock 编辑:程序博客网 时间:2024/05/24 03:36

一、MyBatis Generator插件简介


(A)MyBatis Generator插件有什么用


1.可以使用自己的注解来辅助生成代码;

2.可以在类上面添加一些方法来辅助生成代码;

3.可以添加一些XML中的元素的属性配置;

4.可以添加一些额外的XML文件或者Java文件(比如一个例子就是生成MyBatisConfig.xml文件);


(B)Plugin接口


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





Plugin接口中有以下一些方法:





其中主要的有ClientXXX,ModelXXX,SQLMapXXX。


(C)内置的插件


内置的一些插件在org.mybatis.generator.plugins包下,有以下一些插件:




1.org.mybatis.generator.plugins.CachePlugin###

这个插件是一个挺有用的插件,用来生成在XML中的<cache>元素(这个插件只针对MyBatis3/MyBatis3Simple有效哈),这个插件需要一些配置,支持的配置属性有:cache_eviction,cache_flushInterval,cache_readOnly,cache_size,cache_type,和cache元素的属性一一对应,很好的一点,在<table>元素中,可以通过定义property元素,来覆盖<plugin>元素中提供的默认值;


2.org.mybatis.generator.plugins.CaseInsensitiveLikePlugin###

这个插件用来在XXXExample类中生成大小写敏感的LIKE方法(插件本身用处不大,但是我们可以通过这个插件学习给XXXExample类添加额外的方法)


3.org.mybatis.generator.plugins.EqualsHashCodePlugin###

这个插件用来给Java模型生成equals和hashcode方法;注意下,如果Domain类有rootClass,需要重新处理下生成的代码(因为MBG是不会考虑rootClass相关内容的,甚至都不会加载rootClass,可以参考配置文件中rootClass相关说明);


4.org.mybatis.generator.plugins.FluentBuilderMethodsPlugin###


生成带有fluent风格的model代码。


6.org.mybatis.generator.plugins.MapperConfigPlugin###

比较有用的一个插件,可以用来帮助生成一个默认的MapperConfig.xml文件骨架,在这个骨架文件中完成了本次生成的mapper.xml文件的配置;


该插件支持的配置属性有:

fileName:配置文件名称,默认为MapperConfig.xml;
targetPackage:配置文件所在的包,同MBG配置文件中的所有targetPackage配置;
targetProject:配置文件所在目录,同MBG配置文件中的所有targetProject配置;


7.org.mybatis.generator.plugins.RenameExampleClassPlugin###

这个插件可以使用正则表达式的方式来重命名生成的XXXExample类,通过配置 searchString和replaceString属性来完成(这个实现原理请参考MBG配置文件中的columnRenamingRule元素),
一个例子,比如要xxxExample改成xxxCriteria,只需要配置:

<property name="searchString" value="Example$" /><property name="replaceString" value="Criteria" />


8.org.mybatis.generator.plugins.RowBoundsPlugin###

这个插件可以生成一个新的selectByExample方法,这个方法可以接受一个RowBounds参数,主要用来实现分页(当然,我们后面会生成我们自己的分页查询函数),这个插件只针对MyBatis3/MyBatis3Simple有效;


9.org.mybatis.generator.plugins.SerializablePlugin###

这个插件主要用来为生成的Java模型类添加序列化接口,并生成serialVersionUID字段;


有两个配置项:

addGWTInterface:这个是针对GWT的,我们忽略;suppressJavaInterface:这个参数是必须要填的,我们设置为false就可以了;


10.org.mybatis.generator.plugins.SqlMapConfigPlugin###

这个插件生成一个SqlMapConfig文件,包含sqlMap条目所有生成的SQL映射。这演示了hooking生成生命周期并生成额外的XML文件。


11.org.mybatis.generator.plugins.ToStringPlugin###

为生成的Java模型创建一个toString方法


12.org.mybatis.generator.plugins.VirtualPrimaryKeyPlugin

此插件可用于指定充当主键的列,即使它们没有严格定义为数据库中的主键。


详细请参考官方文档:http://www.mybatis.org/generator/reference/plugins.html


二、插件生命周期


在代码生成过程的初始化过程中创建插件,并按顺序调用进程的不同阶段。


简单版:


1.通过默认构造函数创建的插件
2.setContext方法调用
3.setProperties方法调用验证方法调用,如果此方法返回false,那么插件中没有其他方法将被调用
3.对于配置中的每个表,初始化方法调用


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


官方文档地址:http://www.mybatis.org/generator/reference/pluggingIn.html#


详细版:


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在所有其他插件中停止调用该方法


参考:http://www.jianshu.com/p/1b826d43dbaf




阅读全文
0 0