org.apache.ibatis.jdbc.AbstractSQL<T>
org.apache.ibatis.jdbc.AbstractSQL<T> 抽象泛型類,它主要用於解決書寫SQL時經常多了或者少了and、or、where、括號等等內容問題。
實際上,它的原理說起來也簡單,就是把SQL拆分成多個部分,然后再根據語句類型來進行拼裝。
核心方法:
@Override public String toString() { StringBuilder sb = new StringBuilder(); sql().sql(sb); return sb.toString(); }
其中,第一個sql()是調用它的sql()方法,返回內部類SQLStatement的實例,再調用SQLStatement的sql(Appendable a)方法,傳入具體的Appendable實現對象StringBuilder。
實際使用
org.apache.ibatis.jdbc.SQL extends AbstractSQL<SQL> ;
構造SQL常規寫法
public String insertPersonSql() { String sql = new SQL() .INSERT_INTO("PERSON") .VALUES("ID, FIRST_NAME", "#{id}, #{firstName}") .VALUES("LAST_NAME", "#{lastName}") .toString(); return sql; }
構造SQL非常規寫法
public String insertPersonSql() { return new SQL() {{ INSERT_INTO("PERSON"); VALUES("ID, FIRST_NAME", "#{id}, #{firstName}"); VALUES("LAST_NAME", "#{lastName}"); }}.toString(); }
初步看,這種寫法與上面的寫法似乎差別也不大,但實際上差異還是很大的。
此寫法,實際上是創建了一個SQL的匿名子類,然后在內部調用類似匿名構造塊。
總結
實際上,AbstractSQL這個類單獨來看,並不能給我們構造SQL語句帶來什么方便,反而是把語句拆分特別復雜,還不如直接寫來得方便。
但是結合MyBatis的Annotation和Statement解析器,這個自動過程下,它的功能就顯得特別強大了。