MyBatis源码学习笔记

准备阶段: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配置,核心属性:

  1. 元素<resultMap>转为Map<String, ResultMap> resultMaps,key为mapper的命名空间+"."+<resultMap>元素id,ResultMap持有多条属性List<ResultMapping> resultMappings,每条属性配置对应ResultMapping,ResultMapping保存的即是java对象和数据库表列字段的对应关系
  2. 元素<cache>转为Map<String, Cache> caches,key为mapper的命名空间+"."+<cache>元素id,用于MyBatis二级缓存
  3. 元素<sql>转为Map<String, XNode> sqlFragments,key为mapper的命名空间+"."+<sql>元素id,value为XNode对象,<sql>元素配合<include>使用
  4. 元素<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">

  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值