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(日后有空會把這篇文章完善