Mybatis-generator 逆向工程 自定义PO,xml,mapper,example
1.首先在pom文件中导入依赖
版本自己定义
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.6</version>
</dependency>
2.逆向工程程序段
File configFile = new File("mybatisg.xml"); //mybatisg.xml是逆向工程的配置文件,可以自己定义
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
3.配置逆向工程配置文件(略)
4.自定义生成器
我们关注的是怎么自定义文件的生成规则
首先让我们的插件类继承Mybatis-generator提供的适配器
我们主要关注这几个重写方法
1.插入(用来生成自定义PO)的程序的入口
2.插入(自定义xml文件)的程序的入口
3.插入(自定义Example)的程序的入口
4.插入(自定义mapper接口)的程序的入口
首先看第一个,自定义我们的PO
1.我们定义的PO规则生成类,需要继承官方提供的JavaSrcGenerator,并重写generate方法
在重写的generate方法里,我们就可以对PO类为所欲为,上下其手(误
API的命名很清楚。打个点,IDE自动补全的方法很多的用法都显而易见。
2.XML文件自定义
首先,包含XML文件规则的类要先继承官方的抽象XML节点生成器
然后,在自定义插件类的这个重写方法里,把XML的根节点作为参数扔到我们的addElements方法里,我们就可以在重写的addElements方法里操作这个XML文件
其实本质是是根据传入的表信息(introspectedTable)来修改document,但是为了功能模块化,我们自定义Generator并且用addElements方法完成我们的逻辑比较好
我自己写的话是没有直接在addElements方法里直接实现规则逻辑,而是交给了又一层对象
真正的逻辑只是操作root节点
我们想在XML文件里加一个Select,这个Select的名字(也是id,也是mapper文件中对应的方法名)是selectByExampleSelectiveOptimized
意图是写出 select * from A a inner join (select id from A where col = xxx ) as b on a.id = b.id limit m,n
这样col列上有辅助索引的情况下,区别于 select * from A where col = xxx limit m,n
我们可以防止innodb在聚簇索引树上扫描一堆无用记录,充分利用内存的page缓存
效果图:
自定义逆向工程的核心思想:
其实就是在节点里加节点(XmlElement),层层嵌套
每个节点表示的是 <XXX> </XXX> 这种结构,在这个节点里加上(addElement方法)节点BBB的话就是 <XXX> <BBB> </BBB> </XXX>
节点上面可以有属性(Attribute)比如 XXX 有 aaa 属性: <XXX aaa = "" > </XXX>
还有一种节点是文本节点(TextElement),比如在XXX中插入(addElement方法)文本节点MMM :<XXX aaa = ""> <BBB> </BBB> MMM </XXX>
(BBB先插入的,所以MMM在BBB后面)
最后,把XXX节点加到根节点上。root.addElement(XXX)。 文件里就有了 <XXX aaa = ""> <BBB> </BBB> MMM </XXX> 这句话。
注意不用在root中插入MMM和BBB,因为他们附在XXX上
mapper中的参数二,一个 List<String> 类型,即param2是一个List<String>类型
这里设置all 和 removed 参数的意图是:
1.如果这两个参数都是空,则同 select * from ...
2.如果all不空,如果all中有A,B,C这些String 那么就是 select A,B,C from ...
3.如果all空,removed不空,如果表中的字段有A,B,C,D,E,F 并且removed中有A,B,C这三个字段 那么就是select D,E,F from ...
Example和Mapper的自定义规则类似上述的PO(日后有空会把这篇文章完善