流程分析

首先,要知道mybatis调用mapper再到执行SQL,mybatis肯定做了处理,将mapper转过了,那就是jdk动态代理,来看下实际项目中的具体实现

 这里可以看到使用的是MapperProxy,这个类也在mybatis的jar包里,看下

进去这个类,看它继续做了哪些操作。

这里,如果点击按F7进入这个方法,由于框架使用了Spring,所以使用了jdk动态代理来代理这个mbatis的proxy,跳过spring的invoke方法,直接进入到MapperProxy这个类,看下

 这里会获取这个方法的getDeclaringClass,通过点击进去看,其实就是获取这个类的class

 可以看到,这个class不等于Object.class,所以走的是下面的这个分支

 到这里之后,从字面意思来看,就是从缓存的方法里获取这个MapperMethod,进入追一下

 这里大概的流程就是从methodCache拿MapperMethod,如果没有的话就新构建一个,再放入到缓存中,然后返回这个新构建的MapperMethod,之后回到刚才的方法中,执行execute

 进入追一下这个execute里面具体做了哪些操作

 调用这个execute之前已经获得了一个MapperMethod,这里的this指的就是我们刚才获得的MapperMethod,通过这个MapperMethod的command的类型,去选择需要执行分支,这里我的SQL是select类型的,所有进了select分支,之后根据select的返回类型再执行具体的

这里我返回的是一个DTO,进了这里

convertArgsToSqlCommandParams就是将入参转换放入了一个Map中,来看具体的selectOne方法

 之后你了一个拦截器,这个拦截器是在构造方法里放入的

 

 来看具体的selectOne

 

 这里的话是获取需要执行的MappedStatement,这个对象里封装了我们xml里的执行SQL以及相关一些信息

 至此,我们获取了xml中封装的相关信息,后面的话就是执行SQL,获取返回值,完成mybatis调用xml SQL的一整套流程,后面我们来梳理一下全部的流程。

总结

首先通过service调用mapper接口,而在调用之前,应用启动的时候,mybatis已经将我们的mapper进行了代码,我们实际调用的是MapperProxy,之后会尝试从缓冲中获取MethodProxy,如果没有获取到就新构建,再通过这个Method的类型去执行增删改查之类的操作,之后从Configuration中获取MappedStatement,这个对象中封装了xml查询节点中的SQL信息,之后调用数据库进行相关查询操作

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐