1. 程式人生 > >撩課-JavaWeb之抽取DQL

撩課-JavaWeb之抽取DQL

抽取DQL

抽取之前的程式碼

抽取之後程式碼

遺留問題
查詢的時候,只能查詢學生
 可以使用泛型解決
處理結果集的時候
 每一個都封裝成了student物件, 這寫死了
 原因
	 知道封裝成什麼型別的物件
	 就不應該處理結果集
 解決辦法
	 把處理結果集的行為交給每個DAO
	 為了規範每個DAO的處理結果集,大家都叫同樣的名字,這樣在模板中就可以呼叫同一個名稱
	 定義一個處理結果集的介面
程式碼實現:

1.定義一個介面

 宣告一個處理結果集方法

2.在具體DAO當中實現介面

實現處理結果集方法

3.建立一個介面實現物件傳給查詢方法

4.在查詢方法當中呼叫處理結果集方法

總流程圖

處理結果集泛型

1.直接定義為T

 處理所有結果集都必須得要返回List
 有的時候沒有必要返回List,想要查詢的僅僅是一個結果整數,此時還必須得要從List當中出來

2.有呼叫者自己來決定返回什麼內容

 統一規定返回型別為T型別,呼叫者使用時去決定是什麼型別

3.實現類當中實現介面時,要指定返回什麼型別

4.宣告方法時,宣告返回值為一個泛型型別,具體是什麼型別,有引數來指定

整體示意圖

獲取總人數

結果集處理器
 存在的問題
	 該類只能將結果集中的一行資料封裝成一個Student物件
	 我們如果有多個domain,就得提供多個結果集處理器
 想法
	 自動的把一行行資料封裝成物件,自動設定屬性,結果集處理器
	 處理不同表時,乾的事都一樣
		   1.給我一個要封裝的類
		   2.自動設定屬性
規定
 1.表中的列名必須和物件中的屬性名相同
 2.規定表中的型別必須和Java中的型別匹配
想要完成此項工作,就要使用內省機制
編寫
 1.建立一個類實現結果集處理器
	 實現的時候也不知道是什麼型別,所以也可以指定為一個泛型
 2.提供一個欄位,表示要封裝成物件的型別
 3.提供一個構造器,在建立時,就指定是什麼型別
 4.在實現方法當中,通過內省機制獲取所有屬性名稱,做為列名
 5.通過傳入的類位元組碼建立物件
 6. 通過內省獲取位元組碼中所有的資訊
 7.獲取所有的屬性描述器
 8.遍歷屬性描述器,獲取物件的屬性名稱 ,規定的屬性名和列名相同
 9.通過列名獲取結果集中的值
 10.呼叫屬性的set方法把屬性的值設定進去