费话不多少先上图,我只喜欢画图分析,看图片:
有两个问题:
问题1: 我们一直在写Mapper/DAO只写了接口,没有写具体的实现吧?
【是的】
问题2: 没有写实现类就没办法实例化执行后续的操作,那么又怎么去访问了数据库,并且拿到了数据呢?
虽说我们没有亲自去写实现类,但是mybatis通过动态字节码技术,也就是动态代理帮我们去生成了代理实现类,比如:我们在UserMapper.java
接口里写了一个insertUser(String username, String passwd, Date
birthday),动态代理会根据这个接口生成具体的实现类,也就是代理了UserMapper.java这个接口,解析参数,然后通过调用SqlSession.select()方法,传入相应的参数,然后由SqlSession去执行后续的操作,比如:调用Executor、StatementHandler等一系列操作。
请先生/公主看源码:
注:远程一切的RPC几乎也都是通过代理去实现方法的调用,调用其实就是跨虚拟机同步参数、方法状态的,并不是把另一个虚拟机的方法拿回本地调用哦,还是基于动态代理实现的。
【jdk的动态代理大家一定要提前弄清楚,里面源码里面有涉及,程序员使用mybatis就是面向接口的编程,我们在使用时也都是调用接口xxxMapper.java,然后通过唯一namespace匹配到唯一xxxMapper.xml,然后交由mybatis的核心组件执行后续的操作。】
一条SQL的执行流程是不是很清晰了,还不够清晰的话看看下面的执行链路图
跟踪链路如下:
大家在看源码的时候可以从SqlSession入手跟踪,注意Configuration、MappedStatement、StatementHandler之间相互引用的关系,你中有我,我中有你的类与类之间的关系。