MyBatis(九)工作原理 之 MyBatis原理总结

  MyBatis 简单案例:

    @Test
     public void test() throws IOException {
          //1、获取 sqlSessionFactory
          SqlSessionFactory sqlSessionFactory = getsqlSessionFactory();

          //2、获取 sqlSession 实例,能直接执行已经映射的 SQL 语句
          SqlSession sqlSession = sqlSessionFactory.openSession();

          try {
               //3、获取接口的实现类对象
               /**
                * 推荐使用
                * 会为接口自动的创建一个代理对象,代理对象去执行增删改查方法
                */
               EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
               System.out.println(employeeMapper);
               System.out.println(employeeMapper.getClass());
               Employee emp = employeeMapper.getEmpById(1);
               System.out.println(emp);
          } finally {
               sqlSession.close();
          }
     }

  实现流程

    (1)获取 sqlSessionFactory 对象

      解析文件的每一个信息保存在Configuration中,返回包含Configuration的DefaultSqlSessionFactory

      注意:MappedStatement:代表一个增删改查的详细信息

    (2)获取 sqlSession 对象

      返回一个DefaultSqlSession对象,包含Executor 和Configuration;这一步会创建Executor对象。

    (3)获取接口的代理对象(MapperProxy)

      getMapper,使用 MapperProxyFactory 创建一个MapperProxy的代理对象

      代理对象里面包含了,DefaultSqlSession(Executor)

    (4)执行增删改查方法;

  总结

    (1)根据配置文件(包括全局,SQL映射)初始化Configuration对象

    (2)创建一个DefaultSQLSession对象,它里面包含了Configuration以及Executor(根据全局配置文件中的 defaultExecutorType创建出对应的Executor)

    (3)DefaultSQLSession.getMapper(),拿到 Mapper接口对应的MapperProxy

    (4)MapperProxy 里面有(DefaultSqlSession)

    (5)执行增删改查方法:

      ① 调用 DefaultSqlSession 的增删改查,Executor;

      ② 会创建一个 StatementHandler 对象,(同时也创建出ParameterHandler和 ResultSetHandler)

      ③ 调用 StatementHandler 的预编译参数及设置参数值;使用ParameterHandler来给SQL设置参数;

      ④ 调用 StatementHandler 的增删改查方法;

      ⑤ ResultSetHandler 封装结果;

  注意:四大对象每个创建的时候都会有一个 interceptorChain.pluginAll(parameterHandler);

原文地址:https://www.cnblogs.com/niujifei/p/15262171.html