Mybatis架构图,运行流程

ε祈祈猫儿з 提交于 2020-01-14 02:41:31

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操作数据库。(接口层不是真正实现的地方,只是用来与程序员做交互的)。
  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());
    }
}

层次结构图
在这里插入图片描述

  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命令声明在注解中
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!