前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Mybatis( 源码 纯干货)分析编写dao实现类Mybatis的执行过程 findAll流程分析

Mybatis( 源码 纯干货)分析编写dao实现类Mybatis的执行过程 findAll流程分析

原创
作者头像
韦恩少爷的背
修改2020-02-19 14:41:55
4900
修改2020-02-19 14:41:55
举报
文章被收录于专栏:SSM框架学习

以findAll为例分析编写dao实现类Mybatis的执行过程

正式开始处进入正题

前提代码:

findAll方法

代码语言:java
复制
     @Before//用于在测试方法执行方法执行之前执行
    public void init()throws Exception{
        //1.读取配置文件 目的是将SqlMapConfig.xml的信息加载进去
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.创建SqlSessionFactory工厂
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        //3.使用工厂创建dao对象
        userDao =new UserDaoImpl(factory);
    }
    /**
     * 测试查询所有
     */
    @Test
    public void testFindAll(){
        List<User> users =userDao.findAll();
        for(User user: users){
            System.out.println(user);//打印
    }
    @After//用于在方法执行之后执行
    public void destory()throws Exception{
        //提交事务
        if(sqlSession != null){
            sqlSession.commit();
            //6.释放资源
            sqlSession.close();
        }
        in.close();
    }

dao实现类(dao自己建)

代码语言:java
复制
public class UserDaoImpl implements IUserDao {
    private SqlSessionFactory factory;
    public UserDaoImpl(SqlSessionFactory factory){
        this.factory=factory;
    }
    public List<User> findAll() {
        SqlSession session = factory.openSession();
        List<User> users = session.selectList("com.bruce.dao.IUserDao.findAll");
        return users;
    }
}

配置

代码语言:java
复制
    <select id="findAll" resultType="com.bruce.domain.User">
    <!-- id(方法的名称)不能随便写名称 要写IUserDao.java里面的那个方法名称-->
    select * from user;
    </select>

少的代码前几P去看或者自己对应修改

正式开始!!!!

在UserDaoImpl和MybatisTest都打上断点进行Debug

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

下一步就可以看到 告诉了你factory

在这里插入图片描述
在这里插入图片描述

再往下得到session

在这里插入图片描述
在这里插入图片描述

虽然是进到SqlSession里去但是得找他的实现类 对SqlSession

画图
画图
Implementations
Implementations

选择DefaultSqlSession后 点击它 上方会出现路径 双击进入

DefaultSqlSession
DefaultSqlSession

这时候就可以找寻SelectList方法了 我们这里用的是第一个,只传了一个Statement,分析得实际上是最后一个

SelectList
SelectList

我们再进入到query 发现是个接口,我们需要找到executor到底是谁 打断点继续找

CachingExecutor
CachingExecutor

同理这样就可以进入(可以Ctrl+H)

进入CachingExecutor
进入CachingExecutor

找到Caching里面的方法query和上面的方法参数个数对应 打断点,确实能够进入

在这里插入图片描述
在这里插入图片描述

再跟着query进去 打断点看一下返回的到底是什么 即最后一行 同时这里的delegate是SimpleExecutor

在这里插入图片描述
在这里插入图片描述

回到Executor找到SimpleExecutor

在这里插入图片描述
在这里插入图片描述

这里进去没有query方法我们找它的extends BaseExecutor

在这里插入图片描述
在这里插入图片描述

进入后成功找到query方法

在这里插入图片描述
在这里插入图片描述

再跟着进去(就在下面)

在这里插入图片描述
在这里插入图片描述

返回的是list,跟着进queryFromDatabase

在这里插入图片描述
在这里插入图片描述

同样返回list找到doQuery

在这里插入图片描述
在这里插入图片描述

最后找到这是一个抽象方法,刚才是在BaseExecutor中 那么直接看他的子类SimpleExecutor,找到doQuery

并且有返回var9 通过打断点找到handler的类型为RoutingStatmentHandler

RoutingStatmentHandler
RoutingStatmentHandler

找到handler的接口StatementHandler 进入到RoutingStatmentHandler并找到query方法

PreparedStatementHandler
PreparedStatementHandler

此时delegate变成了PreparedStatementHandler

PreparedStatement
PreparedStatement

找到并进入

在这里插入图片描述
在这里插入图片描述

终于找到了!!!!!!!

在这里插入图片描述
在这里插入图片描述

PreparedStatement这个对象就是jdbc里面的那个对象 是个代理对象 ps就会有个execute方法 不仅查询也可以增删改(这里是查询

复习一下PreparedStatement对象的执行方法(false 图中老师笔误

在这里插入图片描述
在这里插入图片描述

此处已经执行完成,接下来的是进行封装!

最后的handlerResultSets跟进去

ResultSetsHandler
ResultSetsHandler

找到他的接口,show Diagram,只有一个DefaultResultSetHandle

DefaultResultSetHandler
DefaultResultSetHandler

进入找到handlerResultSets方法 截图截不完 它又调用了handlerResultSet 其实就已经再封装结果集了 一顿的赋值取值 rsw就是resultset封装 就是用statement获取里面的结果集 避免了上一步执行的时候报错

在这里插入图片描述
在这里插入图片描述

如果找下去的话得到的是

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

同理我们可以分析其他功能的流程

这里附一张完整的图,同样是看网课老师自己画的截图

分析编写dao实现类Mybatis的执行过程
分析编写dao实现类Mybatis的执行过程

这就是查询方法的这条路,

至少debug很熟练了哈哈哈哈哈哈

这是我们写dao的方式,找到了selectList,如果不写dao那看到selectList,后面的步骤全都是一模一样的

那么我们就可以考虑代理dao的执行过程,下一P写

这一波啊 这一波是肉蛋葱鸡

(这一P看的都头晕,不过思路很清晰,给个赞求求了)

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 以findAll为例分析编写dao实现类Mybatis的执行过程
    • 正式开始处进入正题
      • 前提代码:
      • 正式开始!!!!
        • 此处已经执行完成,接下来的是进行封装!
          • 这里附一张完整的图,同样是看网课老师自己画的截图
            • 这一波啊 这一波是肉蛋葱鸡
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档