查询最终走到PreparedStatementHandler类的query方法,执行查询后调用DefaultResultSetHandler类的handleResultSets方法
1.处理返回的普通实体类
DefaultResultSetHandler类的handleResultSets方法
继续本类的handleResultSet方法
通过 handleRowValues 方法来映射 ResultSet 结果,并将并将映射的结果从 defaultResultHandler 的 ResultList 方法中取出存入 multipleResults 中,完成映射。
继续本类的handleRowValues方法
hasNestedResultMaps:是否由嵌套映射,一般都是resumtMap标签中含有collection标签association标签才会为true
继续本类的handleRowValuesForSimpleResultMap方法
该方法通过遍历结果集挨个调用 getRowValue 方法来进行结果集的映射,这里遍历映射是因为结果集可能不止一个。
如果查询的是list的话可能会有很多条
((ResultSetImpl) ((HikariProxyResultSet) ((ResultSetLogger) ((Proxy) resultSet).h).rs).delegate).rowData
继续本类的getRowValue方法
继续本类的applyAutomaticMappings方法
typeHandler就是将jdbc类型转换为Java类型
2.处理ResultMap
<resultMap id="EmpVoMap" type="com.lzp.vhrserver.vo.EmpVo">
<id property="id" column="id" jdbcType="INTEGER"/>
<result property="name" column="name" jdbcType="VARCHAR"/>
<result property="gender" column="gender" jdbcType="CHAR"/>
<result property="birthday" column="birthday" jdbcType="DATE"/>
<result property="idCard" column="idCard" jdbcType="CHAR"/>
<result property="wedlock" column="wedlock" jdbcType="OTHER"/>
<result property="nationId" column="nationId" jdbcType="INTEGER"/>
<result property="nativePlace" column="nativePlace" jdbcType="VARCHAR"/>
<result property="politicId" column="politicId" jdbcType="INTEGER"/>
<result property="email" column="email" jdbcType="VARCHAR"/>
<result property="phone" column="phone" jdbcType="VARCHAR"/>
<result property="address" column="address" jdbcType="VARCHAR"/>
<result property="departmentId" column="departmentId" jdbcType="INTEGER"/>
<result property="jobLevelId" column="jobLevelId" jdbcType="INTEGER"/>
<result property="posId" column="posId" jdbcType="INTEGER"/>
<result property="engageForm" column="engageForm" jdbcType="VARCHAR"/>
<result property="tiptopDegree" column="tiptopDegree" jdbcType="OTHER"/>
<result property="specialty" column="specialty" jdbcType="VARCHAR"/>
<result property="school" column="school" jdbcType="VARCHAR"/>
<result property="beginDate" column="beginDate" jdbcType="DATE"/>
<result property="workState" column="workState" jdbcType="OTHER"/>
<result property="workId" column="workID" jdbcType="CHAR"/>
<result property="contractTerm" column="contractTerm" jdbcType="DOUBLE"/>
<result property="conversionTime" column="conversionTime" jdbcType="DATE"/>
<result property="notWorkDate" column="notWorkDate" jdbcType="DATE"/>
<result property="beginContract" column="beginContract" jdbcType="DATE"/>
<result property="endContract" column="endContract" jdbcType="DATE"/>
<result property="workAge" column="workAge" jdbcType="INTEGER"/>
<association property="joblevelEntity" javaType="com.lzp.vhrserver.entity.JoblevelEntity">
<id property="id" column="joblevelId"></id>
<result property="name" column="joblevelName"></result>
</association>
<association property="departmentEntity" javaType="com.lzp.vhrserver.entity.DepartmentEntity">
<id property="id" column="departmentId"></id>
<result property="name" column="departmentName"></result>
</association>
<association property="positionEntity" javaType="com.lzp.vhrserver.entity.PositionEntity">
<id property="id" column="posId"></id>
<result property="name" column="posName"></result>
</association>
<association property="politicsstatusEntity" javaType="com.lzp.vhrserver.entity.PoliticsstatusEntity">
<id property="id" column="politicId"></id>
<result property="name" column="politicName"></result>
</association>
<association property="nationEntity" javaType="com.lzp.vhrserver.entity.NationEntity">
<id property="id" column="nationId"></id>
<result property="name" column="nationName"></result>
</association>
</resultMap>
handleRowValues方法
handleRowValuesForNestedResultMap方法
getRowValue,重载的方法,处理嵌套映射
这里也是把每个result中的嵌套映射一个一个都拿到,调用applyNestedResultMappings方法。
关键类DefaultResultSetHandler,基本逻辑都是在这个类实现的。
关键类ResultSetWrapper,保存要映射的字段集合和查询出的数值的字节数组
- **1.DefaultResultSetHandler类的handleResultSets方法,先拿到需要映射的字段集合,封装在ResultSetWrapper中,然后再获取一个resultmap类型的集合,每个resultmap保存需要映射的类型,如果有resultmap标签则会封装到resultmappings属性中,
- 2.DefaultResultSetHandler类的handleResultSet方法,调用handleRowValues方法处理结果集放到multipleResults中,
- 3.DefaultResultSetHandler类的handleRowValues方法,分别处理嵌套映射和非嵌套映射
- 4.非嵌套映射,handleRowValuesForSimpleResultMap方法,遍历映射每行数据,调用getRowValue方法。没加resultmap或者resultmap中没做映射的字段调用applyAutomaticMappings方法,resultmap中映射的字段调用applyPropertyMappings方法。具体方法就是调用对应字段类型的typeHandler从字节数组中拿到数据进行转换。所有对应字段值的字节数组在ResultSetWrapper的resultset属性中。
- 5.嵌套映射,handleRowValuesForNestedResultMap方法,遍历映射每行数据,调用重载的getRowValue方法,没加resultmap或者resultmap中没做映射的字段调用applyAutomaticMappings方法,resultmap中映射的字段调用applyPropertyMappings方法,嵌套映射的字段调用applyNestedResultMappings方法。而applyNestedResultMappings会再次调用getRowValue方法解析每行数据,逻辑和非嵌套映射相同**