微服務開發的入門級框架Spring Boot詳解(五)

        經過第四章的介紹,你們可能更能理解使用SpringBoot開發是多麼爽而且快捷的了。java

        好比使用SSM框架開發寫一個HelloWord,會通過如下幾個步驟:sql

  •         寫POM文件,下載依賴包。
  •         配置Spring MVC,視圖解析器等
  •         配置Spring,開啓註解掃描器等(發現配置了一大堆,還沒開始寫真正的業務邏輯
  •         寫Controller,實現HellWord
  •         配置容器
  •         應用打WAR包
  •         放到容器裏跑

        以上步驟甚是繁瑣,而使用Spring Boot呢?你只需如下幾步就能夠實現:數據庫

  •          寫POM文件,下載依賴包。
  •         寫Controller,實現HellWord
  •         啓動程序

     對比後,我來講今天真正的主題,如何使用註解寫動態SQLapp

一、動態SQL註解詳解

       寫動態SQL使用的註解再也不是:框架

    而是對應 如下四個註解:ide

  • @SelectProvider
  • @UpdateProvider
  • @DeleteProvider
  • @InsertProvider

    註解沒有太多可解釋的,說一下里面都寫的啥吧!代碼例子以下 :函數

@SelectProvider(type=Userdao.class,method="findUserByInput")
public List<UserList> selectAllUser(String Department,String RealName,Integer StartNo);

    type:聲明類。method:聲明方法。工具

    那麼聲明的是什麼類?什麼方法呢?往下看!spa

二、動態SQL實現

        其實使用註解實現動態SQL有三種方法,我只寫兩種我的比較喜歡的方式。(第三種也確實不太好).net

        2.一、第一種方式(我的感受就是拼接字符串,條件判斷,而後返回拼接好的字符串)

        在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。

        2.二、 第二種方式(推薦)

        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(String)
  • SELECT(String...)
開始或插入到 SELECT子句。 能夠被屢次調用,參數也會添加到 SELECT子句。 參數一般使用逗號分隔的列名和別名列表,但也能夠是數據庫驅動程序接受的任意類型。
  • SELECT_DISTINCT(String)
  • SELECT_DISTINCT(String...)
開始或插入到 SELECT子句, 也能夠插入 DISTINCT關鍵字到生成的查詢語句中。 能夠被屢次調用,參數也會添加到 SELECT子句。 參數一般使用逗號分隔的列名和別名列表,但也能夠是數據庫驅動程序接受的任意類型。
  • FROM(String)
  • FROM(String...)
開始或插入到 FROM子句。 能夠被屢次調用,參數也會添加到 FROM子句。 參數一般是表名或別名,也能夠是數據庫驅動程序接受的任意類型。
  • JOIN(String)
  • JOIN(String...)
  • INNER_JOIN(String)
  • INNER_JOIN(String...)
  • LEFT_OUTER_JOIN(String)
  • LEFT_OUTER_JOIN(String...)
  • RIGHT_OUTER_JOIN(String)
  • RIGHT_OUTER_JOIN(String...)
基於調用的方法,添加新的合適類型的 JOIN子句。 參數能夠包含由列命和join on條件組合成標準的join。
  • WHERE(String)
  • WHERE(String...)
插入新的 WHERE子句條件, 由AND連接。能夠屢次被調用,每次都由AND來連接新條件。使用 OR() 來分隔OR。
  • OR()
使用OR來分隔當前的 WHERE子句條件。 能夠被屢次調用,但在一行中屢次調用或生成不穩定的SQL。
  • AND()
使用AND來分隔當前的 WHERE子句條件。 能夠被屢次調用,但在一行中屢次調用或生成不穩定的SQL。由於 WHERE 和 HAVING 兩者都會自動連接 AND, 這是很是罕見的方法,只是爲了完整性才被使用。
  • GROUP_BY(String)
  • GROUP_BY(String...)
插入新的 GROUP BY子句元素,由逗號鏈接。 能夠被屢次調用,每次都由逗號鏈接新的條件。
  • HAVING(String)
  • HAVING(String...)
插入新的 HAVING子句條件。 由AND鏈接。能夠被屢次調用,每次都由AND來鏈接新的條件。使用 OR() 來分隔OR.
  • ORDER_BY(String)
  • ORDER_BY(String...)
插入新的 ORDER BY子句元素, 由逗號鏈接。能夠屢次被調用,每次由逗號鏈接新的條件。
  • DELETE_FROM(String)
開始一個delete語句並指定須要從哪一個表刪除的表名。一般它後面都會跟着WHERE語句!
  • INSERT_INTO(String)
開始一個insert語句並指定須要插入數據的表名。後面都會跟着一個或者多個VALUES() or INTO_COLUMNS() and INTO_VALUES()。
  • SET(String)
  • SET(String...)
針對update語句,插入到"set"列表中
  • UPDATE(String)
開始一個update語句並指定須要更新的代表。後面都會跟着一個或者多個SET(),一般也會有一個WHERE()。
  • VALUES(String, String)
插入到insert語句中。第一個參數是要插入的列名,第二個參數則是該列的值。

        這篇文章我的感受寫的不是特別清楚,但我已經將所有代碼貼出,只要照貓畫虎就能夠,若是有什麼不懂的或者文章有什麼錯誤,都歡迎在評論指出!!

相關文章
相關標籤/搜索