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(日后有空会把这篇文章完善
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- springboot开发之thymeleaf页面公共元素的抽取
- Redis | Redis 通用命令
- python爬虫--自动下载cosplay小姐姐图片(xpath使用自定义创建文件路径)
- springboot开发之修改员工
- LeetCode | 703.数据流中的第K大元素
- springboot开发之配置自定义的错误界面和错误信息
- springboot开发之删除员工
- LeetCode | 1.两数之和
- springboot开发之配置嵌入式Servlet容器两种方式
- jvaa之初始化块
- java之匿名内部类
- springboot配置之获取配置文件中属性的第二种方法(@Value)不同于@ConfigurationProperties
- mybatis动态sql之内置参数_parameter和_databaseId
- Redis | Redis 字符串相关命令
- java之抽象类