BeanProcessor類
function:
匹配每一列到對應的屬性,并且將結果集轉換為對應對象的屬性。其子類一般要重寫處理鏈去實現用戶的行為。
Details:
一個Map類型,并用靜態區為8種基本類型設置默認值。
toBean方法,傳入resultSet和類類型.
這個類獲取類的屬性描述和resultSet的ResultSetMetaData.
調用mapColumsToProperties方法獲得resultSet中的列和Bean的屬性對應列表。
調用createBean方法,生成BeanObject。
toBeanList方法,循環resultSet.next()方法去createBean(),返回一個List<T>
mapColumnsToProperties方法,傳入ResultSetMetaData和PropertyDescriptor數組
通過resultSetMetaData獲取Column的label or name 去和PropertyDescriptor的name做匹配,
返回一個數組columnToProperty,數組的下標是resultSet的下表,數組的值對應的是resultSet該
值對應Bean的property的位置。
createBean方法,傳入ResultSet,Class<T>,PropertyDescirptor[], columnToProperty
先根據Class<T>調用newInstance()方法創建一個實例
遍歷columnToProperty
如果resultSet中的值在Bean中沒有對應的property,則跳過。
否則,通過columnToProperty獲得對應的屬性類型,并調用processCloumn()方法獲得屬性值。
并調用callSetter()方法,給Bean設置對應property的值
processColumn方法,傳入resultSet,index(resultSet的下表),propType屬性的類型
function:獲取resultSet某一特定列的值
根據propType類型,調用resultSet.getXXX(index)方法
callSetter()方法,傳入targetBean,prop,value
調用prop.getWriteMethod(),對應property的setter()方法
調用setter.getParameterTypes()方法獲取setter方法的輸入參數。
首先要判斷setter的params[0]的類型是否否是以下三種:(因為setter()方法一般只有一個參數)
java.sql.Date、java.sql.Time、java.sql.Timestamp
如果是 先將value的值用java.util.Data強制轉換,再用對應的類型包裝
如果不是 調用私有方法isCompatibleType去check,value和params類型是否匹配
如果匹配:
調用setter.invoke()方法。將value設置到targetObjectBean中去
isCompatibleType方法,傳入value對象和type類類型
如果value對象和type類型一致則返回true,
如果type類型是基本類型且value類型是該基本類型的包裝類型,也返回true,
否則返回false;
----------------------------------------------------------------------------------------
RowProcessor接口
function:把resultSet對象某一列轉變為某一個特殊的類
Details:
接口中的方法列表
toArray(ResultSet) --將結果集以數組形式返回
toBean(ResultSet, Class<T> <T>) --將結果集以JavaBean形式返回
toBeanList<ResultSet, Class<T> <T>) --將結果集以List<JavaBean>形式返回
toMap(ResultSet) --將結果集以Map形式返回
----------------------------------------------------------------------------------------
BasicRowProcessor方法,實現了RowProcessor接口
function:完成將某一行或多行結果集轉變為對象或對象列表
Details:
定義一個BeanProcessor convert
定義一個缺省的BeanProcessor,如果用戶傳入,最終的BeanProcessor就為用戶傳入的,否則就用缺省的。
toArray方法。
toBean方法,調用convert的toBean方法。
toBeanList方法,調用convert的toBeanList方法
toMap方法,將resultSet.getColumnName作為key
一個私有成員類CaseInsensitiveHashMap,繼承了HashMap<String, Object>
function:內部定義lowerCaseMap,做一個二級鏈表,key 存放oldKey.toLowerCase(),value存放oldKey
這個私有類的作用:數據庫不一定對大小寫的列名敏感。
----------------------------------------------------------------------------------------
ResultSet接口
function:實現這個接口,將結果集轉換成對象
Details:
handle(ResultSet rs)方法
----------------------------------------------------------------------------------------
ResultSetIterator方法,實現Iterator接口
function:包裝一個ResultSet對象成一個迭代器。
由外接傳入RowProcessor或使用內部缺省的BasicRowProcessor();
重點:
override的next()方法調用的是convert.toArray()方法