源码地图:http://coderead.cn/p/mybatis/map/file/%E7%BB%93%E6%9E%9C%E9%9B%86%E5%A4%84%E7%90%86.map
预处理(建立数据库连接):java.sql.Connection
执行查询:java.sql.PreparedStatement.execute()
1、查询数据库
1.1、预处理
建立与数据库的连接
1.1.1、构建Statement
1.1.2、设置参数
2、执行查询
2.1、获取结果集
2.2、处理结果集
是否有自定义结果集处理器,如果没有就会采用默认的 DefaultResultHandler
2.2.1、处理结果行
是否有嵌套结果映射,有就走嵌套结果集处理,没有就走简单结果集处理
2.2.1.1、遍历结果行
调用resultSet.next()遍历行, 并且基于上文判断是否要继续往下读取
2.2.1.1.1、跳过指定行
用于分页
2.2.1.1.2、封装行对象
基于当前结行,创建结果对象 并为其填充属性值
2.2.1.1.3、暂存结果对象
即保存至 DefaultResultHandler.list 中
2.2.1.1.2.1、设置懒加载代理
创建对象,然后判断是否存在懒加载子查询,并为其GET方法设置懒加载代理
2.2.1.1.2.1.1、创建结果对象
有四种情况: 1.原始类型创建如String、Integer 等 2.基于构造参数映射 创建 3.返回结果为接口,或存在无参构造方法,基于ObjectFatory创建 4.基于自动映射,自动依次查找型是否与指定构造方法匹配,如果有就自动创建。
2.2.1.1.2.2、填充属性 (自动映射)
填充自动映射填充属性
2.2.1.1.2.2.1、自动创建结果映射集
基于JAVA Class Type自动创建结果集映射
2.2.1.1.2.2.2、读取字符串列
2.2.1.1.2.3、填充属性 (手动映射)
基于ResultMapping 获取属性的值
2.2.1.1.2.3.1、获取属性值
1.基于子查询获取值 2.基于指定结果集(多结果集) 3.普通的属性值获取
2.2.1.1.2.3.1.1、读取字符串列
2.2.1.1.2.3.1.2、读取Integer列