准备阶段:MyBatis将解析后的Xml转为Configuration的属性进行存储
关键代码入口:
org.apache.ibatis.builder.xml.XMLConfigBuilder#parseConfiguration解析xml元素入口
org.apache.ibatis.builder.xml.XMLMapperBuilder#parse 解析mapper配置入口
org.apache.ibatis.builder.xml.XMLStatementBuilder#parseStatementNode解析select|insert|update|delete元素入口,MyBatis源码核心内容之一
====================================================================
解析mapper配置,核心属性:
- 元素<resultMap>转为Map<String, ResultMap> resultMaps,key为mapper的命名空间+"."+<resultMap>元素id,ResultMap持有多条属性List<ResultMapping> resultMappings,每条属性配置对应ResultMapping,ResultMapping保存的即是java对象和数据库表列字段的对应关系
- 元素<cache>转为Map<String, Cache> caches,key为mapper的命名空间+"."+<cache>元素id,用于MyBatis二级缓存
- 元素<sql>转为Map<String, XNode> sqlFragments,key为mapper的命名空间+"."+<sql>元素id,value为XNode对象,<sql>元素配合<include>使用
- 元素<select|insert|update|delete>转为Map<String, MappedStatement> mappedStatements,key为mapper的命名空间+"."+<select|insert|update|delete>元素id
- 元素<select|insert|update|delete>解析步骤:
- 元素属性(重点属性):
- statementType:根据元素属性statementType获取sql的statement类型(STATEMENT|PREPARED|CALLABLE),默认PREPARED,对应sql以后需要PreparedStatement执行
- sqlCommandType :根据元素nodename为SqlCommandType赋值,取值范围(UNKNOWN | INSERT | UPDATE | DELETE | SELECT | FLUSH),用于路由增删改查方法
- 元素子节点<include>解析
- 如果元素中包含子元素<include>, 将<include>元素替换为<sql>元素,<include>元素refid属性对应<sql>元素属性id,从Configuration对象Map<String, XNode> sqlFragments获取<sql>元素node对象
举例说明:
- 原始内容:
<sql id="userColumns"> id,username </sql>
<select id="selectUser" resultType="com.mybatis.example.User">
select <include refid="userColumns"></include> from user where id = #{id}
</select>
- 第一步<include>替换<sql>
<select id="selectUser" resultType="com.mybatis.example.User">
select <sql id="userColumns"> id,username </sql> from user where id = #{id}
</select>
- 第二步将<sql>的内容插入到<sql>前面
<select id="selectUser" resultType="com.mybatis.example.User">