MyBatis3源码的一点笔记

#解析每一条<select><update><delete><insert>
#list 是 每个xml 文件中所有的
[<insert keyProperty="id" useGeneratedKeys="true" id="addOs">
  	insert into os(name,version,maker) values(#{name},#{version},#{maker})
  </insert>
, <delete parameterType="int" id="deleteOs">
  		delete from os where id=#{id}
  </delete>
, <select resultType="os" parameterType="int" id="selectOneOs">
  	select * from os where id=#{id}
  </select>
, <select resultType="os" id="findAllOs">
  	select id,name,version,maker,s1,s2 from os 
  </select>
, <update id="updateOs">
  	update os set name=#{name},maker=#{maker},version=#{version} where id=#{id}
  </update>
]
#

org.apache.ibatis.builder.xml.XMLMapperBuilder.buildStatementFromContext(List<XNode>, String)


在 org.apache.ibatis.builder.xml.XMLStatementBuilder.parseStatementNode() 中的
Class<?> resultTypeClass = resolveClass(resultType);
得到 resultTypeClass


#org.apache.ibatis.parsing.XNode#中的body 就是每条sql,例如
  	update os set name=#{name},maker=#{maker},version=#{version} where id=#{id}
	
	
#这个OBJ参数就是sql的参数#	
#下面变量#metaObject中的originalObject 就是转化的目标类型 
final MetaObject metaObject =  org.apache.ibatis.session.Configuration.newMetaObject(Object)	


#在这里进行 列名 的汇总#
ResultSetWrapper 中 存储的是 所有的列和值

org.apache.ibatis.executor.resultset.ResultSetWrapper.loadMappedAndUnmappedColumnNames(ResultMap, String)
for (String columnName : columnNames) {
	 //columnName.toUpperCase 把列名转为大写 是为了得到数据库中该列的列名,sql中数据库的字段要写成大写
      final String upperColumnName = columnName.toUpperCase(Locale.ENGLISH);
      if (mappedColumns.contains(upperColumnName)) {
        //存储列名
		mappedColumnNames.add(upperColumnName);
      } else {
        //存储未匹配到的列名(非大写的)  ,也不一定是属性名,因为可能select返回的column多余bean中定义的属性
		unmappedColumnNames.add(columnName);
      }
}



org.apache.ibatis.executor.resultset.DefaultResultSetHandler.handleResultSets(Statement)
这里的rsw中 包含了 
columnNames 所有的列名
classNames 列所对应的类型
jdbcTypes 列对应的JDBC类型

ResultSetWrapper rsw = getFirstResultSet(stmt);



org.apache.ibatis.executor.resultset.DefaultResultSetHandler  line 412

#这个方法 是从ResultSetWrapper#中取出数据 到 bean
org.apache.ibatis.executor.resultset.DefaultResultSetHandler.getRowValue(ResultSetWrapper, ResultMap)



#在这里进行 列名-属性的 映射#
org.apache.ibatis.executor.resultset.DefaultResultSetHandler.applyAutomaticMappings(ResultSetWrapper, ResultMap, MetaObject, String)
 #这里就是我要的入口,下面的判断需要修改一下,  metaObject.hasSetter(property) 直接把bean中没有的列给屏蔽了
 if (property != null && metaObject.hasSetter(property)) {
 #在这里增强时,同时也需要增强 MetaObject 对象,让metaObject给目标类型的map填充
 
 #line 417 处 有个 configuration.isCallSettersOnNulls()这里可能有个坑. http://www.tuicool.com/articles/NNfIJne

 
 
 MetaClass

 可以看下 org.apache.ibatis.submitted.custom_collection_handling.CustomObjectWrapper
 
 

#BoundSql#是个好类,包含了这一个Statement的sql和参数
private List<ParameterMapping> parameterMappings;
private Object parameterObject;
private Map<String, Object> additionalParameters;
private MetaObject metaParameters;
private String sql;



你可能感兴趣的:(MyBatis3源码的一点笔记)