Mybatis 源码剖析

 

Mybatis 动态 SQL 通过XML 映射文件内,添加条件判断标签,达到动态拼接 SQL 的功能。动态sql 有 <if> 标签 <where>标签 <foreach> 标签

Mybatis 通过底层java 动态代理实现对 xml中的<insert> 、<select>等标签中的sqlText 进行 加载 、解析、最后通过Executor 执行器执行。
2: Mybatis仅支持association(一对一)关联对象和collection(一对多)关联集合对象的延迟加载。在Mybatis配置文件中,通过在sqlconfig.xml配置文件中使用<setting>标签启用延迟加载。需要将lazyLoadingEnabled属性设置为true 它的原理是,使用CGLIB创建目标对象的代理对象,当调用目标方法时,进入拦截器方法。

3:Mybatis中的Executor 执行器有:SimpleExecutor,ReuseExecutor、BatchExecutor。

  simpleExecutor 每执行一次update 或者 select 操作 就开启一个statement 对象 用完后立刻关闭。ReuseExecutor执行update或select,以sql作为key查找Statement对象,存在就使用,不存在就创建,用完后,不关闭Statement对象,而是放置于Map内,供下一次使用。简言之,就是重复使用Statement对象。BatchExecutor执行update 操作将所有的sql通过addBatch 添加到 批处理中等待统一执行。执行范围在Sqlsesstion内

4:Mybatis 的一级二级缓存都是通过Map 数据结构进行存储 一级缓存作用范围为一个SqlSesstion 二级缓是可以跨SqlSesstion  。如果有update 操作 一级二级缓存都会失效 当再次select 操作时会重新查询数据库然后将查询到的数据放入到缓存中。

5:Mybatis通过实现Intercepter 接口 调用pluginAll方法起底层通过动态代理对Executor 、StatementHandler、ParamterHandler、ResultSetHandler 四大对象进行拦截。起到一个方法增强。自定义插件分两步走:

第一步:1 自定义一个插件类并实现Interceptor 接口与此同时实现该接口中的方法

2:通过@Interceptors注解设置当前的拦截器需要拦截哪一个核心对象中的哪一个方法

    第二步:将我们自定义的插件类在sqlMapConfig.xml 文件中通过使用<plugins>标签下的子标签<plugin>进行配置

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值