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. EffectiveC++条款04:确定对象被使用前已先被初始化

    不要混淆赋值和初始化,对于大多数类型而言,比起先调用默认构造函数然后调用赋值操作符,只调用一次拷贝构造函数是高效的 对于内置类型,也需要成员初值列(member initialization list ...

  2. php理解递归

    递归有一段时间很让人难已理解,突然发现一个很好的办法来理解,现在跟大家分享一下: <?php function fact(n){ if( n == 1){ return 1; } retrun ...

  3. java并发学习--第九章 指令重排序

    一.happns-before happns-before是学习指令重排序前的一个必须了解的知识点,他的作用主要是就是用来判断代码的执行顺序. 1.定义 happens-before是用来指定两个操作 ...

  4. php内置函数分析之array_diff_assoc()

    static void php_array_diff_key(INTERNAL_FUNCTION_PARAMETERS, int data_compare_type) /* {{{ */ { uint ...

  5. DDD领域驱动设计初探(五):AutoMapper使用

    前言:前篇搭建了下WCF的代码,就提到了DTO的概念,对于为什么要有这么一个DTO的对象,上章可能对于这点不太详尽,在此不厌其烦再来提提它的作用: 从安全上面考虑,领域Model都带有领域业务,让Cl ...

  6. DevExpress v19.1新版亮点——WinForms篇(一)

    行业领先的.NET界面控件DevExpress v19.1终于正式发布,本站将以连载的形式介绍各版本新增内容.在本系列文章中将为大家介绍DevExpress WinForms v19.1中新增的一些控 ...

  7. 郭盛华现身北京机场,颇有IT男的风范,网友:疑似被招安了

    郭盛华纵横互联网江湖数十年,他白手起家,凭着过人的勇敢.智慧和绝技,身经百战,显赫辉煌,成为中外闻名的互联网安全领域大师级人物. 郭盛华的网络技术指导方面经验丰富实力深厚.他是中国互联网安全领域的传奇 ...

  8. note 2019.12.16

    1.无序 HTML 列表: <ul> <li>Coffee</li> <li>Tea</li> <li>Milk</li& ...

  9. for循环性能测试

    项目中遇到需要用for循环dom节点获取每个节点保存的数据,一共有8000多条数据,但是循环加载需要18秒左右才出来. 平时for循环中数据少感觉不出来,现在数据多了就有差别了. 部分代码如下 var ...

  10. JDK1.8 LinkedList双向链表源码

    序言 LinkedList是一个双向链表 也就是说list中的每个元素,在存储自身值之外,还 额外存储了其前一个和后一个元素的地址,所以也就可以很方便地根据当前元素获取到其前后的元素 链表的尾部元素的 ...