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()方法