經過第四章的介紹,你們可能更能理解使用SpringBoot開發是多麼爽而且快捷的了。java
好比使用SSM框架開發寫一個HelloWord,會通過如下幾個步驟:sql
以上步驟甚是繁瑣,而使用Spring Boot呢?你只需如下幾步就能夠實現:數據庫
對比後,我來講今天真正的主題,如何使用註解寫動態SQLapp
寫動態SQL使用的註解再也不是:框架
而是對應 如下四個註解:ide
註解沒有太多可解釋的,說一下里面都寫的啥吧!代碼例子以下 :函數
@SelectProvider(type=Userdao.class,method="findUserByInput") public List<UserList> selectAllUser(String Department,String RealName,Integer StartNo);
type:聲明類。method:聲明方法。工具
那麼聲明的是什麼類?什麼方法呢?往下看!spa
其實使用註解實現動態SQL有三種方法,我只寫兩種我的比較喜歡的方式。(第三種也確實不太好).net
在DAO層的接口中定義一個內部類,代碼以下:
package cn.yy.dao; @Mapper public interface UserDao { class Userdao{ public String findUserNumByInput(String Department,String RealName) { String sql="SELECT COUNT(*) from users"+"" ; if(Department != null && RealName != null){ sql += " where Department='"+Department+"' and RealName like '%"+RealName+"%';"; return sql; }else if( Department != null ){ sql += " where Department = '"+Department; return sql; } else if( RealName != null){ sql += " where RealName like '%"+RealName+"%'"; return sql; } return sql; } }
以上這個叫Userdao的內部類的類名就是上一節Type對應的值,上節method中的方法就是次內部類中要調用的方法。
解釋一下方法中參數和代碼的含義:
方法中傳入的參數就是從Service層傳來的參數(能夠理解爲你要查詢的所有條件)。
定義的String對象寫的字符串內容是你SQL公用的部分(其實就是拼接SQL語句的字符串)。
if判斷你的哪些條件爲空,而後拼接成你想要的語句。
最後把拼接好的字符串return回去 。
這就是第一種實現方式,貼一個完整代碼:
package cn.yy.dao; @Mapper public interface UserDao { @SelectProvider(type=Userdao.class,method="findUserNumByInput") public Integer selectUserNum(String Department,String RealName); class Userdao{ public String findUserNumByInput(String Department,String RealName) { String sql="SELECT COUNT(*) from users"+"" ; if(Department != null && RealName != null){ sql += " where Department='"+Department+"' and RealName like '%"+RealName+"%';"; return sql; }else if( Department != null ){ sql += " where Department = '"+Department; return sql; } else if( RealName != null){ sql += " where RealName like '%"+RealName+"%'"; return sql; } return sql; } }
注意:@SelectProvide中type參數指定的Class類,必需要可以經過無參的構造函數來初始化。
@SelectProvide中method參數指定的方法,必須是public的,返回值必須爲String,能夠爲static。
MyBatis 3提供了方便的工具類。使用SQL類建立一個實例來調用方法生成SQL語句。比起第一種方式來講減小了重複的SQL字符串的拼接。完整代碼以下:
package cn.yy.dao; public class UserDao { @SelectProvider(type=Userdao .class,method="selectPersonLike") public List<Person> selectPerson(String id,String firstName,String lastName); clas Userdao{ public String selectPersonLike(final String id, final String firstName, final String lastName) { return new SQL() {{ SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FIRST_NAME, P.LAST_NAME"); FROM("PERSON P"); if (id != null) { WHERE("P.ID like #{id}"); } if (firstName != null) { WHERE("P.FIRST_NAME like #{firstName}"); } if (lastName != null) { WHERE("P.LAST_NAME like #{lastName}"); } ORDER_BY("P.LAST_NAME"); }}.toString(); } } }
注意:方法的返回值也必須爲String
selectPersonLike方法中的「SELECT」「FROM」「WHERE」等,均爲方法!!!具體解釋以下:
方法 | 描述 |
---|---|
|
開始或插入到 SELECT子句。 能夠被屢次調用,參數也會添加到 SELECT子句。 參數一般使用逗號分隔的列名和別名列表,但也能夠是數據庫驅動程序接受的任意類型。 |
|
開始或插入到 SELECT子句, 也能夠插入 DISTINCT關鍵字到生成的查詢語句中。 能夠被屢次調用,參數也會添加到 SELECT子句。 參數一般使用逗號分隔的列名和別名列表,但也能夠是數據庫驅動程序接受的任意類型。 |
|
開始或插入到 FROM子句。 能夠被屢次調用,參數也會添加到 FROM子句。 參數一般是表名或別名,也能夠是數據庫驅動程序接受的任意類型。 |
|
基於調用的方法,添加新的合適類型的 JOIN子句。 參數能夠包含由列命和join on條件組合成標準的join。 |
|
插入新的 WHERE子句條件, 由AND連接。能夠屢次被調用,每次都由AND來連接新條件。使用 OR() 來分隔OR。 |
|
使用OR來分隔當前的 WHERE子句條件。 能夠被屢次調用,但在一行中屢次調用或生成不穩定的SQL。 |
|
使用AND來分隔當前的 WHERE子句條件。 能夠被屢次調用,但在一行中屢次調用或生成不穩定的SQL。由於 WHERE 和 HAVING 兩者都會自動連接 AND, 這是很是罕見的方法,只是爲了完整性才被使用。 |
|
插入新的 GROUP BY子句元素,由逗號鏈接。 能夠被屢次調用,每次都由逗號鏈接新的條件。 |
|
插入新的 HAVING子句條件。 由AND鏈接。能夠被屢次調用,每次都由AND來鏈接新的條件。使用 OR() 來分隔OR. |
|
插入新的 ORDER BY子句元素, 由逗號鏈接。能夠屢次被調用,每次由逗號鏈接新的條件。 |
|
開始一個delete語句並指定須要從哪一個表刪除的表名。一般它後面都會跟着WHERE語句! |
|
開始一個insert語句並指定須要插入數據的表名。後面都會跟着一個或者多個VALUES() or INTO_COLUMNS() and INTO_VALUES()。 |
|
針對update語句,插入到"set"列表中 |
|
開始一個update語句並指定須要更新的代表。後面都會跟着一個或者多個SET(),一般也會有一個WHERE()。 |
|
插入到insert語句中。第一個參數是要插入的列名,第二個參數則是該列的值。 |
這篇文章我的感受寫的不是特別清楚,但我已經將所有代碼貼出,只要照貓畫虎就能夠,若是有什麼不懂的或者文章有什麼錯誤,都歡迎在評論指出!!