SqlBuilder 和 SelectBuilder (已经废弃)

在版本 3.2 之前,我们的实现方式不太一样,我们利用 ThreadLocal 变量来掩盖一些对 Java DSL 不太友好的语言限制。现在,现代 SQL 构建框架使用的构建器和匿名内部类思想已被人们所熟知。因此,我们废弃了基于这种实现方式的 SelectBuilder 和 SqlBuilder 类。

下面的方法仅仅适用于废弃的 SqlBuilder 和 SelectBuilder 类。

方法 描述
BEGIN() / RESET() 这些方法清空 SelectBuilder 类的 ThreadLocal 状态,并准备好构建一个新的语句。开始新的语句时,BEGIN() 是最名副其实的(可读性最好的)。但如果由于一些原因(比如程序逻辑在某些条件下需要一个完全不同的语句),在执行过程中要重置语句构建状态,就很适合使用 RESET()。
SQL() 该方法返回生成的 SQL() 并重置 SelectBuilder 状态(等价于调用了 BEGIN() 或 RESET())。因此,该方法只能被调用一次!

SelectBuilder 和 SqlBuilder 类并不神奇,但最好还是知道它们的工作原理。 SelectBuilder 以及 SqlBuilder 借助静态导入和 ThreadLocal 变量实现了对插入条件友好的简洁语法。要使用它们,只需要静态导入这个类的方法即可,就像这样(只能使用其中的一条,不能同时使用):

1. import static org.apache.ibatis.jdbc.SelectBuilder.*;
1. import static org.apache.ibatis.jdbc.SqlBuilder.*;

然后就可以像下面这样创建一些方法:

1. /* 已被废弃 */
2. public String selectBlogsSql() {
3. BEGIN(); // 重置 ThreadLocal 状态变量
4. SELECT("*");
5. FROM("BLOG");
6. return SQL();
7. }
1. /* 已被废弃 */
2. private String selectPersonSql() {
3. BEGIN(); // 重置 ThreadLocal 状态变量
4. SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FULL_NAME");
5. SELECT("P.LAST_NAME, P.CREATED_ON, P.UPDATED_ON");
6. FROM("PERSON P");
7. FROM("ACCOUNT A");
8. INNER_JOIN("DEPARTMENT D on D.ID = P.DEPARTMENT_ID");
9. INNER_JOIN("COMPANY C on D.COMPANY_ID = C.ID");
10. WHERE("P.ID = A.ID");
11. WHERE("P.FIRST_NAME like ?");
12. OR();
13. WHERE("P.LAST_NAME like ?");
14. GROUP_BY("P.ID");
15. HAVING("P.LAST_NAME like ?");
16. OR();
17. HAVING("P.FIRST_NAME like ?");
18. ORDER_BY("P.ID");
19. ORDER_BY("P.FULL_NAME");
20. return SQL();
21. }