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. }