The Solution

MyBatis 3提供了方便的工具类来帮助解决该问题。使用SQL类,简单地创建一个实例来调用方法生成SQL语句。上面示例中的问题就像重写SQL类那样:

  1. private String selectPersonSql() {
  2. return new SQL() {{
  3. SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FULL_NAME");
  4. SELECT("P.LAST_NAME, P.CREATED_ON, P.UPDATED_ON");
  5. FROM("PERSON P");
  6. FROM("ACCOUNT A");
  7. INNER_JOIN("DEPARTMENT D on D.ID = P.DEPARTMENT_ID");
  8. INNER_JOIN("COMPANY C on D.COMPANY_ID = C.ID");
  9. WHERE("P.ID = A.ID");
  10. WHERE("P.FIRST_NAME like ?");
  11. OR();
  12. WHERE("P.LAST_NAME like ?");
  13. GROUP_BY("P.ID");
  14. HAVING("P.LAST_NAME like ?");
  15. OR();
  16. HAVING("P.FIRST_NAME like ?");
  17. ORDER_BY("P.ID");
  18. ORDER_BY("P.FULL_NAME");
  19. }}.toString();
  20. }

该例中有什么特殊之处?当你仔细看时,那不用担心偶然间重复出现的"AND"关键字,或者在"WHERE"和"AND"之间的选择,抑或什么都不选。该SQL类非常注意"WHERE"应该出现在何处,哪里又应该使用"AND",还有所有的字符串链接。