mybatis概念
   mybatis 是一款轻量级的orm的数据持久框架,封装jdbc 对开发提供了便利,但是性能会比jdbc低,从开发的角度来说,现在是比较流行的 掌握上比较容易,也支持缓存,级联关系。几乎避免了与jdbc设值和返回结果集映射的代码,将接口和java的实体类映射成数据库中的记录。
 
传统jdbc的缺点
  1.工作量相对比较大(我们需要先连接,然后处理jdbc底层事务,处理数据类型,还需要操作connection,statement对象和resultSet对象去拿到数据 然后解析 最后关闭他们)
  2.jdbc编程可能产生的异常进行捕获并正常关闭资源,如果是简单的还好,如果是复杂的操作更复杂。
 
ORM框架的产生
  由于jdbc的存在的缺陷,在实际开发工作中我们很少使用jdbc进行编程,于是提出了object relational mapping 简称orm ,简单来说orm就是数据库表和java对象的映射关系模型于是就有了hibernate目前比较流行的orm框架,hibernate是建立在若干pojo通过xml映射文件或者注解提供的规则映射到数据库表上。hibernate对jdbc的封装程度比较高,hibernate中不需要写sql了 只需要使用hql语言来就可以了。并且还可以屏蔽数据库之间的差异。框架的设计意味着框架的应用范围。由于封装程度比较高,对sql的优化方面限制很大。在当今互联网中 减少数据传递是最基本的优化方法。显然hibernate无法满足所有的要求,在要求数据传递效率上如果无法做到sql优化的要求,那这一款框架是无法满足这类需求的,所有产生了myabtias这款框架,他提供了更灵活,更方便的方法,弥补了hibernate这些缺陷。
 
mybatis的优势
  为了解决hibernate的不足,一个半自动映射框架mybatis应运而生,之所以称它为半自动,是因为他需要手动匹配POJO,sql和映射关系,而全表映射的hibernate只需要提供pojo和映射关系即可。
历史上mybatis是apache的一个开源项目ibaits 后迁入google code改为mybatis,而和hibernate不同的是,不仅要提供映射文件,还需要我们提供sql语句,这个sql就是动态配置,也就是他最大的特点。
 
mybatis的基本组成
  1.sqlsessionfactoryBuilder
  2.sqlsessionfactory
  3.sqlsession
  4.sqlmapper
 
流程关系如图所示:
 
为了方便使用mybatis,我们创建一个configuration单例对象存储在内存中,因为在内存中是计算机系统中读取速度最快的,我们通过解析一个xml文件配置信息保存在configuration类对象中,达到重复使用,而且占用空间小,在mybatis中提供了两个sqlsessionfactory的实现类 defaultSqlSessionFactory和sqlsessionManager,不过sqlsessionManager目前还没有使用,mybatis中目前使用的是defaultSqlSessionFactory 他们的关系如下图。
 
 
在configuration中mapper接口是简化了复杂的sqlsession实现,然后mapper只是一个接口,而且没有实现类并不能完成操作sqlsession,这里运用了jdk的动态代理,通过分析代码可以看出Java 动态代理,具体有如下四步骤:
   1. 通过实现 InvocationHandler 接口创建自己的调用处理器;
   2. 通过为 Proxy 类指定 ClassLoader 对象和一组 interface 来创建动态代理类;
     3. 通过反射机制获得动态代理类的构造函数,其唯一参数类型是调用处理器接口类型;
     4. 通过构造函数创建动态代理类实例,构造时调用处理器对象作为参数被传入。
 
生命周期
sqlsessionFactoryBuilder:
  它的作用是创建sqlsessionFactory,通过他可以创建多个SqlSessionFactory。它的作用就是一个构造器,一旦我们创建了sqlSessionFactory,它的作用就已经完结,这个时候我们就应该毫不犹豫废弃它。
SqlSessionFactory:
  SqlSessionFactory的作用是创建SqlSession,而sqlSession就是一个会话,在实际生产环境中如果创建多个sqlSessionFactory 会打开更多的数据库连接资源,那么数据库的连接资源很快就会耗尽,因此他的职责是创建sqlsession,所以我们采用单例模式,一个数据库都只对应一个SqlSessionFactory管理好数据库资源的分配,避免过多的connection被消耗。
SqlSession:
  它的生命周期是请求数据库事务的过程中,而且是一个线程不安全的对象,在操作数据库需要注意隔离级别,数据库锁等高级特性。每次创建的sqlsession 都必须及时关闭它,它的长期存在会使数据库连接池的活动资源减少。
mapper:
  它的作用是发送sql,然后返回我们需要的结果,大多数情况下开发只需要操作这个对象,剩下的在xml配置和sqlsession已经完成了,这就符合面向对象开发。它的生命周期和sqlSession一样。
 

mybatis初步理解的更多相关文章

  1. 初步理解@Transactional注解

    在SSM项目中,经常在业务层的类或者方法上看到@Transactional注解,只是知道这个注解的作用是进行事务管理,但是具体有哪些属性,在什么情况下进行回滚,确是不那么清楚.所以在网上看了一些视频和 ...

  2. javascript 原型及原型链的初步理解

    最近折腾了好久,终于是把js里面的原型和原型链做了个初步的理解: 在这里,我打个比喻: 我(child),我妈constructor(构造函数)生了我:别人问我老妈跟谁生的我,于是此时我妈会指向我爸爸 ...

  3. Spring学习笔记--环境搭建和初步理解IOC

    Spring框架是一个轻量级的框架,不依赖容器就能够运行,像重量级的框架EJB框架就必须运行在JBoss等支持EJB的容器中,核心思想是IOC,AOP,Spring能够协同Struts,hiberna ...

  4. Graph Cuts初步理解

    一些知识点的初步理解_8(Graph Cuts,ing...) Graph cuts是一种十分有用和流行的能量优化算法,在计算机视觉领域普遍应用于前背景分割(Image segmentation).立 ...

  5. 非常易于理解‘类'与'对象’ 间 属性 引用关系,暨《Python 中的引用和类属性的初步理解》读后感

    关键字:名称,名称空间,引用,指针,指针类型的指针(即指向指针的指针) 我读完后的理解总结: 1. 我们知道,python中的变量的赋值操作,变量其实就是一个名称name,赋值就是将name引用到一个 ...

  6. springBoot(1)---springboot初步理解

    springboot初步理解 在没有用SpringBoot之前,我们用spring和springMVC框架,但是你要做很多比如: (1)配置web.xml,加载spring和spring mvc 2) ...

  7. Mysql加锁过程详解(7)-初步理解MySQL的gap锁

    Mysql加锁过程详解(1)-基本知识 Mysql加锁过程详解(2)-关于mysql 幻读理解 Mysql加锁过程详解(3)-关于mysql 幻读理解 Mysql加锁过程详解(4)-select fo ...

  8. 关于THINKPHP5模型关联的初步理解

    初步理解的意思是,使用最常用的关联模型,然后可以正常运行 还是打个比方 文章表  和文章分类表 一个文章分类可以有多个文章  所以  文章分类模型和文章建立 hasMany的关联 而文章和文章分类表则 ...

  9. spfa+差分约束系统(C - House Man HDU - 3440 )+对差分约束系统的初步理解

    题目链接:https://cn.vjudge.net/contest/276233#problem/C 题目大意:有n层楼,给你每个楼的高度,和这个人单次的最大跳跃距离m,两个楼之间的距离最小是1,但 ...

随机推荐

  1. Android工具集合

    Drozer – Android APP安全评估工具(附测试案例) http://www.freebuf.com/sectool/26503.html

  2. Laravel——缓存使用

    1.使用Redis类 use Illuminate\Support\Facades\Redis; 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ...

  3. Azure IoT 技术研究系列3

    上篇博文中我们将模拟设备注册到Azure IoT Hub中:我们得到了设备的唯一标识. Azure IoT 技术研究系列2-设备注册到Azure IoT Hub 本文中我们继续深入研究,设备到云.云到 ...

  4. Mybatis(三)MyBatis 动态SQL

    在 MyBatis 3 之前的版本中,使用动态 SQL 需要学习和了解非常多的标签,现在 MyBatis 采用了功能强大的 OGNL( Object-Graph Navigation Language ...

  5. SQL Server清理索引碎片

    DECLARE @SchemeName NVARCHAR(MAX)=N''; DECLARE @TableName NVARCHAR(MAX)=N''; DECLARE @IndexName NVAR ...

  6. 【JavaScript】对象 obj.name 语法与 obj[name]语法

    obj.name ==> obj["name"]  底层的自动转化,所以直接写 obj["name"] 效率会高一些 var obj = { name: ...

  7. 转:HTML5 History API 详解

    从Ajax翻页的问题说起 请想象你正在看一个视频下面的评论,在翻到十几页的时候,你发现一个写得稍长,但非常有趣的评论.正当你想要停下滚轮细看的时候,手残按到了F5.然后,页面刷新了,评论又回到了第一页 ...

  8. SPOJ 694 || 705 Distinct Substrings ( 后缀数组 && 不同子串的个数 )

    题意 : 对于给出的串,输出其不同长度的子串的种类数 分析 : 有一个事实就是每一个子串必定是某一个后缀的前缀,换句话说就是每一个后缀的的每一个前缀都代表着一个子串,那么如何在这么多子串or后缀的前缀 ...

  9. 立神gvim

    set cursorlineset history=1700set nocompatible  "去掉讨厌的有关vi一致性模式,避免以前版本的一些bug和局限  set nufiletype ...

  10. CF 696 A Lorenzo Von Matterhorn(二叉树,map)

    原题链接:http://codeforces.com/contest/696/problem/A 原题描述: Lorenzo Von Matterhorn   Barney lives in NYC. ...