mybatis中使用dao实现类的执行过程分析
断点调试和跟踪源码技能
1.在实现类和测试类中打断点
![1583310240709](https://img2020.cnblogs.com/blog/1950072/202003/1950072-20200304204408122-547948803.png)
2.启用debug调试,下一步得到实现类
![1583310384535](https://img2020.cnblogs.com/blog/1950072/202003/1950072-20200304204435680-93305924.png)
3.选中SqlSession,右键单击
![1583310492308](https://img2020.cnblogs.com/blog/1950072/202003/1950072-20200304204504948-254277014.png)
4.选中SqlSession,右键单击,选择Show Implementations显示它的所有实现,通过断点调试,我们知道选择DefaultSqlSession
![1583310654563](https://img2020.cnblogs.com/blog/1950072/202003/1950072-20200304204540626-198007968.png)
5.当我们选中DefaultSqlSession,上方会有显示,然后双击
![1583310951769](https://img2020.cnblogs.com/blog/1950072/202003/1950072-20200304204617817-1549913814.png)
6.进到DefaultSqlSession中,找到我们在findAll()
中调用的selectList,发现最终执行的是SqlSession的selectList方法,在这个方法中找到executor的query方法
![1583311599389](https://img2020.cnblogs.com/blog/1950072/202003/1950072-20200304204629209-977959470.png)
7.发现Executor又是一个接口,继续打断点,找实现类到底是哪一个
![1583311768117](https://img2020.cnblogs.com/blog/1950072/202003/1950072-20200304204640732-1107182872.png)
8.断点调试,得知Executor的实现类是CachingExecutor
9.由此通过diagram找到CachingExecutor
![1583312301701](https://img2020.cnblogs.com/blog/1950072/202003/1950072-20200304204705241-1761782683.png)
10.打开CachingExecutor,在query中打断点,调试下一步,可以进到此处。又发现一个query方法
![1583312500604](https://img2020.cnblogs.com/blog/1950072/202003/1950072-20200304204718250-439485090.png)
11.继续打断点,debug下一步进到此处
![1583312618513](https://img2020.cnblogs.com/blog/1950072/202003/1950072-20200304204727382-2029407051.png)
12.接下来在这两处打断点,继续下一步调试,发现走的第二行。
![1583312770267](https://img2020.cnblogs.com/blog/1950072/202003/1950072-20200304204744238-632905451.png)
13.由delegate找到SimpleExecutor,所以在Executor类图中选择SimpleExecutor
![1583313118916](https://img2020.cnblogs.com/blog/1950072/202003/1950072-20200304204753981-1870506662.png)
14.打开SimpleExecutor,找到queryFromDatabase方法
![1583313294884](https://img2020.cnblogs.com/blog/1950072/202003/1950072-20200304204802141-1664735936.png)
15.queryFromDatabase方法中有doQuery方法,跟进,发现这是一个抽象方法
![1583313457870](https://img2020.cnblogs.com/blog/1950072/202003/1950072-20200304204808346-2023126235.png)
所以最终执行的是SimpleExecutor的doQuery方法
❤️非常重要的一张图-分析编写dao实现类Mybatis的执行过程(在新标签中打开图片查看)
![非常重要的一张图-分析编写dao实现类Mybatis的执行过程](https://img2020.cnblogs.com/blog/1950072/202003/1950072-20200304205438188-1589960816.png)
❤️非常重要的一张图-分析代理dao的执行过程
![](https://img2020.cnblogs.com/blog/1950072/202003/1950072-20200304204903888-1430373520.png)