为什么要生成自定义SQL
在文章动态SQL语句中,为了防止被拖库,有一句判断
1 | <if test="id == null and username == null" > |
用来判断所有参数为null的情况,这就会引出一个问题: 如果我有10个参数怎么办?
手动写10个 if判断 和 xx==null 和 and 岂不是要累死爹了。。。
自定义SQL插件
通过自定义SQL插件,我们可以对不同的表格产生具有相同的逻辑的SQL语句
如何自定义SQL插件
MyBatisGenerate提供了一个PluginAdapter的接口来完成自定义SQL语句操作
1 | public class SelectPlugin extends PluginAdapter { |
首先要有两个函数
- 一个构造函数
- 重写validate返回为true,如果为false,说明验证不通过,该插件就不会生成对应的SQL方法和XML映射
然后可以声明一个常量当作自定义接口函数名 METHOD_NAME
三个映射方法
根据文章MyBatis的核心思想我们知道MyBatis主要是3个映射,所以PluginAdapter就有3个函数分别控制三个映射的生成
1 | //DO模型生成控制函数,一般模型生成不用自定义所以可以不用重写 |
具体的函数调用生命周期(顺序)可以参考MyBatisGenerate中文网,但是里面讲的不够具体,具体的可以去参考MyBatisGenerate源码GitHub中 mybatis-generator-core模块 的 org.mybatis.generator.plugins 包
看我的看不懂的话,强烈推荐去读源码,因为网上教材没有全的
自定义接口函数
这里Method并不是Java源生的反射类,而是处于 import org.mybatis.generator.api.dom.java.* 下的类
1 | private Method generateSelectMethod(IntrospectedTable introspectedTable) { |
自定义XML的SQL语句
同自定义接口函数里的Mthod,这里的大部分类也都是由 import org.mybatis.generator.api.dom.xml.* 提供的
1 | private XmlElement generateSelectMapper(IntrospectedTable introspectedTable) { |
更多的自定义方法
除了本文中trim…if的举例外,另一篇文章多参数的MyBatisGenerate自定义插件 讲解了更复杂的例子,可以做到对模型内参数的具体控制
核心思想是: 拼接XML字符串时可以使用param1代表第一个入参,并且通过param1.id字符串进行参数Getter