Mybatis架构图,运行流程

MyBatis本质

就是代理模式体现;MyBatis作者思想认为JDBC开发流程中所有的步骤都是次要业务,认为SQL编写主要任务。开发人员专注于SQL编写应该忽略JDBC开发流程,轻度体现ORM思想。

MyBatis与Hibernate比较

  1. Hibernate:杜绝开发人员亲自使用JDBC,杜绝亲自编写用sql命令,Hibernate无法SQL优化,Hiberante缓存依赖程度过大,一级缓存如何同步二级缓存
  2. MyBatis:杜绝开发人员亲自使用JDBC,认为开发人员专注于sql优化,MyBatis对于缓存依赖轻

MyBatis架构图

Mybatis架构图,运行流程_第1张图片

mybatis大体上分为三层:

  1. 第一层接口层,提供给开发人员用于操作的接口,要求mybatis操作数据库。(接口层不是真正实现的地方,只是用来与程序员做交互的)。
  2. 第二层 数据处理层:其中共有四个模块
    1)参数映射:怎么将参数映射到相应的sql占位符上
    2)sql解析:怎么将配置文件中的sql命令与当前的接口做关联
    3)sql执行:判断是何种sql,完成sql调用
    4)结果映射:利用反射机制将查询结果将某个实例做个相关的关联
  3. 支撑层:连接管理,事务,缓存等管理,配置信息的加载

大体执行流程

代码如下

public class Main {
    public static void main(String[] args) throws IOException {
        SqlSession session;
        InputStream is = Resources.getResourceAsStream("myBatis-config.xml");
        
        SqlSessionFactory factory =   new SqlSessionFactoryBuilder().build(is);
        session = factory.openSession();
        
        DeptDao dao =  session.getMapper(DeptDao.class);
        Dept dept = dao.findByDeptNo(10);
        System.out.println(dept.getDname());
    }
}

层次结构图
Mybatis架构图,运行流程_第2张图片

  1. 开发人员首先拿到的是一个SqlSession的对象,SqlSession是个代理对象,其自身是没能力实现相应服务的。则会请求与Executor
  2. Executor,负责JDBC运行时这个Connect是怎么来的,是从连接池中来,还是创建一个。并且决定数据库操作对象Statement和PreparedStatement的管理方式。
    1)Statement或者PreparedStatement干完活就干掉,用过一次就销毁。
    2)建一个map集合,key是sql语句,value是PreparedStatement,当再得到一个相同的sql命令时就会从里面获得
    3)将多个PreparedStatement放到一个PreparedStatement做批处理
  3. StatementHandler,决定当前PreparedStatement走executeQuery,executeUpdate等。其工作时需要借助其他两个模块
    1)ParameterHandle:Sql中有占位符号,将参数通过setInt,setString赋值,生成sql语句。
    2)ResultSetHandle:将结果集中的内容,通过反射机制,将结果集与相应的bean进行关联。其中需要借助TypeHandler
        1)mysql中的类型跟java中的类型进行配对。
    StatementHandler拿到ParameterHandle生成好的sql语句推送到数据库执行会得到一个结果

MyBatis框架使用方式

  1. 基于XML配置文件: SQL命令声明在XML配置文件中
  2. 基于注解方式:SQL命令声明在注解中

你可能感兴趣的:(Mybatis)