今天看了一篇有关Mybatis非常好的文章,顺便写了一下学习心得。

原文地址:https://blog.csdn.net/u010349169/article/details/40422941

一。Mybatis的框架设计

Mybatis框架大致可以分为四个部分:

(1)接口层:用于实现和数据库的交互 ---- 可以通过两种方式来调用:Mapper接口绑定  或   Mapper.xml配置(基于StatementID,即<mapper标签中的>namespace值 + sql标签中的id值)

(2)数据处理层:Mybatis的核心  主要

              a.动态SQL的创建  ---  一个语句(一个<select>/<delete>等标签对对应一个Statement对象)

              b.SQL语句执行

              c.封装查询结果集为List<E>

(3)框架支持层:a.事务管理机制  ---  如JDBC原生事务管理的commit(),rollback(),close()   ---  用SqlSession对象执行

        b.数据库连接池管理机制  ---  如<dataSource>标签中的type='POOLED'即为使用数据库连接池   ---  多个数据库连接对象(即Connection对象),已被占用的状态为(active),未被占用的为(idle)

        c.缓存机制  ---  为减小服务器和数据库的压力和提升效率  --- 如SqlSession(一级缓存)、SqlSessionFactory(二级缓存)  ----  每一个Statement对象有一个自己对应的缓存

        d.SQL语句的配置  ---  Mapper.xml文件配置  和  注解配置(通过注解传入参数 @param Object obj)

(4)引导层:引导层是配置和启动Mybatis配置信息的方式。我使用的是mybatis.xml配置方式

二。Mybatis的一些核心组件

该图来源于原博客:https://blog.csdn.net/u010349169/article/details/40422941

博主主页:http://blog.csdn.net/luanlouis/

Mybatis初始化加载时-->Configuration-->根据Mybatis.xml和Mapper.xml配置文件创建一个或多个MappedStatement对象-->

将每个对象以key-value的形式存储到Configuration的一个Map中,其中key为(Statement ID)也就是namespace+id,value为对应的MappedStatement对象

    可通过SqlSession.getConfiguration()获得Configuration对象

创建SqlSession-->根据Statement ID获得Configuration中对应的MappedStatement对象-->Executor根据SqlSession传递的参数执行query()方法-->创建StatementHandler,并让该对象根据参数执行数据库相关操作,获得返回结果

Executor的作用:(1)根据传递的参数,通过生成BoundSql对象,完成SQL语句的动态解析,以便StatementHandler使用

        (2)为查询创建缓存,以提高性能。(这里应该是每次查询,先看是否有相应缓存,没有缓存再去数据库中执行sql语句查找

        (3)创建JDBC的Statement连接对象,传递给StatementHandler对象,返回List查询结果

StatementHandler对象主要工作:

        (1)对于JDBC的PreparedStatement对象,会对其占位符?进行设置。(通过ParameterHandler对象)

        (2)通过List<E> query(Statement statement, ResultSetHandler resultSetHandler)方法执行Statement,并将返回结果resultSet封装成List

Mybatis的原理相关的更多相关文章

  1. Mybatis插件原理分析(二)

    在上一篇中Mybatis插件原理分析(一)中我们主要介绍了一下Mybatis插件相关的几个类的源码,并对源码进行了一些解释,接下来我们通过一个简单的插件实现来对Mybatis插件的运行流程进行分析. ...

  2. 【转】MaBatis学习---源码分析MyBatis缓存原理

    [原文]https://www.toutiao.com/i6594029178964673027/ 源码分析MyBatis缓存原理 1.简介 在 Web 应用中,缓存是必不可少的组件.通常我们都会用 ...

  3. 深入理解MyBatis的原理:整个体系

    前言:工作中虽然用到了 MyBatis,可完全不知道为什么,再不学习就晚了,这里将记录我的学习笔记,整个 MyBatis 的体系. 一.简介 1.传统的JDBC JDBC 是一种典型的桥接模式. 使用 ...

  4. Mybatis架构原理(二)-二级缓存源码剖析

    Mybatis架构原理(二)-二级缓存源码剖析 二级缓存构建在一级缓存之上,在收到查询请求时,Mybatis首先会查询二级缓存,若二级缓存没有命中,再去查询一级缓存,一级缓存没有,在查询数据库; 二级 ...

  5. MyBatis工作原理

    Mybatis工作原理: 我们的应用程序通过mybatis提供的api,增删改查方法来访问数据库,api底层调用了jdbc ,只不过mybatis对jdbc的封装是不完全封装,里面的sql语句需要我们 ...

  6. Mybatis的原理与JVM内存结构(面试题)

    Mybatis的原理 1.Mapper 接口在初始SQL SessionFactory注册的 2.Mapper 接口注册在名为MapperRegistry类的 HasMap中 key=Mapper c ...

  7. 面试官:你分析过mybatis工作原理吗?

    Mybatis工作原理也是面试的一大考点,必须要对其非常清晰,这样才能怼回去.本文建立在Spring+SpringMVC+Mybatis整合的项目之上. 我将其工作原理分为六个部分: 读取核心配置文件 ...

  8. mybatis运行原理

    mybatis运行原理 运行过程中涉及到的类或者接口 Resources(c) :用于加载mybatis核心配置文件 XMLConfigBuilder(c) :用于解析xml文件(核心配置文件) Co ...

  9. spring boot 整合 mybatis 以及原理

    同上一篇文章一样,spring boot 整合 mybatis过程中没有看见SqlSessionFactory,sqlsession(sqlsessionTemplate),就连在spring框架整合 ...

随机推荐

  1. [solution]JZOJ-5838 旅游路线

    [solution] JZOJ-5838 旅游路线 Time Limits 1000ms,Memory Limits 128MB 题面 Description GZOI队员们到X镇游玩.X镇是一个很特 ...

  2. Matlib

    >>> name1=input('请输入第一个名字;') 请输入第一个名字;陈汉彬 >>> name2=input('请输入第二个名字;') 请输入第二个名字;钟宇 ...

  3. ModelAndView返回json对象的方法

    这是在spring4之后. @RequestMapping(value = "/returnjson") public ModelAndView getfsd(){ ModelAn ...

  4. SpringMVC异步文件上传下载

    首先了解一下File的构造方法: File(String pathname):根据一个路径得到File对象 File(String parent,String child):根据一个目录和一个子文件/ ...

  5. java.exe

    进程:是一个正在执行中的程序.每一个进程执行都有一个执行顺序.该顺序是一个执行路径,或者叫一个控制单元. 线程(例:FlashGet):就是进程中一个独立的控制单元.线程在控制着进程的执行.一个进程中 ...

  6. Java并发编程:Lock(锁)

    一.synchronized的缺陷 synchronized是java中的一个关键字,也就是说是Java语言内置的特性.那么为什么会出现Lock呢? 在上面一篇文章中,我们了解到如果一个代码块被syn ...

  7. 【渗透技术】渗透测试技术分析_TomCat

    [渗透技术]渗透测试技术分析_TomCat 本文转自:i春秋论坛 渗透测试-中间人攻击(原理)说起“中间人攻击”我想大多数对渗透测试又了解的朋友都多少有所了解,因为我们用到的次数真是非常的多.它可以将 ...

  8. 使用webmagic爬虫对百度百科进行简单的爬取

    分析要爬取的网页源码: 1.打开要分析的网页,查看源代码,找到要爬取的内容: (选择网页里的一部分右击审查元素也行) 2.导入jar包,这个就直接去网上下吧: 3.写爬虫: package com.g ...

  9. psnr的定义和python实现

    psnr是“Peak Signal to Noise Ratio”的缩写,即峰值信噪比,是一种评价图像的客观标准,它具有局限性,一般是用于最大值信号和背景噪音之间的一个工程项目. peak的中文意思是 ...

  10. JAVA中的Random()函数

    Java中存在着两种Random函数: 一.java.lang.Math.Random; 调用这个Math.Random()函数能够返回带正号的double值,该值大于等于0.0且小于1.0,即取值范 ...