Mybatis中的org.apache.ibatis.jdbc.SQL 的两种实例化方法
1、匿名实现类+初始块
我们看一下示例:
package com.example.demo;
import org.apache.ibatis.jdbc.SQL;
/**
* @author 认知科技技术团队
* 微信公众号:认知科技技术团队
*/
public class SQLDemo {
public static void main(String[] args) {
String sql = new SQL() {
{
FROM("demo_table");
SELECT("a");
SELECT("b");
WHERE(" id > 1");
WHERE(" b > 2");
ORDER_BY("id ");
LIMIT(10);
}
}.toString();
System.out.println(sql);
sql = new SQL() {
{
FROM("demo_table");
SELECT("a");
SELECT("b");
WHERE(" id > 1");
WHERE(" b > 2");
ORDER_BY("id ");
LIMIT(10);
}
}.toString();
System.out.println(sql);
}
}
new SQL() {{}}是什么语法?
new SQL() {}其背后是生成了一个匿名类, {{}}中的 {}是java类中的初始化语法,前面加上static,即static {}就是静态初始化。
我们可以看一下编译后生成的字节码及反编译后的代码:
我们在线(https://www.javainuse.com/decomp)反编译下class文件:
new SQL() {{}}每次都会生成一个匿名类,实例化实例所使用的的class即为当前生成的匿名类。
注:反编译的有点小问题,不过我影响我们探讨其原理。
2、方法链(Method Chaining)
示例:
package com.example.demo;
import org.apache.ibatis.jdbc.SQL;
/**
* @author 认知科技技术团队
* 微信公众号:认知科技技术团队
*/
public class SQLDemo {
public static void main(String[] args) {
String sql = new SQL()
.FROM("demo_table")
.SELECT("a")
.SELECT("b")
.WHERE(" id > 1")
.WHERE(" b > 2")
.ORDER_BY("id ")
.LIMIT(10).toString();
System.out.println(sql);
sql = new SQL()
.FROM("demo_table")
.SELECT("a")
.SELECT("b")
.WHERE(" id > 1")
.WHERE(" b > 2")
.ORDER_BY("id ")
.LIMIT(10)
.toString();
System.out.println(sql);
}
}
类似Builder模式中的方法链。
SQL类中与sql有关配置的方法都返回了自身,以达到Method Chaining的效果。
public SQL getSelf() {
return this;
}
小结
本文介绍了org.apache.ibatis.jdbc.SQL的两种使用方法:
1、匿名实现类+初始块
2、方法链(Method Chaining)