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