Mybatis的执行过程简单总结

        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory(); 
        // 获得Sqlsession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //获得mapper代理对象
        DepartmentMapper mapper = sqlSession.getMapper(DepartmentMapper.class);
        // 执行方法
        Department departmentById = mapper.getDepartmentById(1);

第一步,获得工厂

    1、加载主配置文件,将配置信息封装到Confgtion当中
    2、解析所有xxxxmapper.xml
    3、将xxxMapper.xml信息当中所有SQL语句信息封装成一个StatementMapper,也添加到Configution当中
    4、返回一个包含所有配置信息的DefaultSqlSessionFactory
    //Configution当中包含全局配置信息

第二步,获得SqlSession

    1、根据Exector类型创建出Executor 默认是SIMPLE
    2、判断是否开启二级缓存;如果开启将其包装成CachingExecutor
    	二级缓存的Executor执行器,执行之前会先从缓存中获取
    3、执行插件的plugnAll方法;内部就是遍历所有interceptor#plugin方法
    4、返回 new DefaultSqlSession(configuration, executor, autoCommit)
    5、创建成功

第三步,创建mapper代理对象

    //sqlSession中包含executor configuration
    1、MapperRgistry.getMapper(type,sqlSession)
    2、 mapperProxyFactory.newInstance(sqlSession)内部就是基于jdk的动态代理的创建
    3、返回一个MapperProxy动态代理 

第四步,代理对象执行目标方法

    1、mapperMethod执行excute方法
    2、判断语句的类型INSERT|UPDATE|DELETE|SELECT
    //以为目标语句是select * form .....
    3、执行SELECT操作;并且判断用什么类型的结果集来接收
    	//method.convertArgsToSqlCommandParam(args);
    	1、将参数转换成sql类型的参数。//(@param stirng username ,@param int age , String  hight )
    	封装到map当中:第一种{username=arg[0],age=arg[1],2=arg[2]}
    				 第二种{param1=arg[0],param2=arg[1],param3=arg[3]}
    				 返回param的map集合
       2、如果是就是一个参数 那么直接返回,不用封装
    4、执行原生的selectOne(command.getName(), param)操作
    5this.<T>selectList(statement, parameter)//查询一个 也是查询所有,取出第一个数据
    6、执行executor.query()方法
    7、执行query()方法
    	1、先从缓存中获取
    	2、缓存中没有,调用SimpleExexutor
    8、 queryFromDatabase从数据库中查询 执行查询方法  //实际是执行doQuery方法
    	1、获得configuration//全局配置信息
    	2、创建StatementHandler;同时实例化也会创建parameterHandler,ResultSetHandler
    	//调用pluginAll 其中parameterHandler,进行sql语句的预编译 也就是将参数位置用?代替
    	3、获得原生prepareStatement
    		1、获得原生的connection 
    		2、原生方式获得prepareStatement
    		3、handler.parameterize(stmt);//解析参数
    			DefaultparamerHandler.setParameters//进行参数设置typeHandler.setParameter();
    	4、handler.<E>query(stmt, resultHandler)原生jdbc进行查询,并且返回结果 
        //结果集合通过 resultSetHandler封装  
    9、将查询出来的结果放置到缓存当中;并添加到一级缓存当中,返回查询出来的结果
发布了98 篇原创文章 · 获赞 44 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_43732955/article/details/99684965
今日推荐