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. MATLAB的边缘检测函数中隐含的细化(非极大值抑制)算法

    前段时间做了一个车牌检测识别的项目,我的任务是将MATLAB中的算法移植成C++代码.在车牌区域提取的过程中,用到了水平方向的Sobel算子检测垂直边缘,一开始我直接把MATLAB中的 bw = ed ...

  2. Zabbix--05 Grafana、percona、自动发现和自动注册

    目录 一. Grafana自定义图形 1.安装grafana 2.安装并激活zabbix插件 3.数据展示 4.自定义图形仪表盘 5.自定义图形饼图 二. percona模版监控mysql 1.安装p ...

  3. Linux架构之Nginx 七层负载均衡

    第50章 Nginx七层负载均衡 一.Nginx负载均衡基本概述 1)为什么要使用负载均衡 当我们的Web服务器直接面向用户,往往要承载大量并发请求,单台服务器难以负荷.使用多台Web服务器组成集群, ...

  4. pandas数据排序(series排序 & DataFrame排序)

    # pandas数据排序 # series的排序: # Series.sort_values(ascending = True,inplace = False) # 参数说明: # ascending ...

  5. uboot if_changed函数

    u-boot编译过程分析 u-boot.lds: $(LDSCRIPT) prepare FORCE $(call if_changed_dep,cpp_lds) u-boot: $(u-boot-i ...

  6. PHP使用HighChart生成股票K线图详解

    本人qq群也有许多的技术文档,希望可以为你提供一些帮助(非技术的勿加). QQ群:   281442983 (点击链接加入群:http://jq.qq.com/?_wv=1027&k=29Lo ...

  7. MySQL的运行模式及一些特性,引擎、事务、并发控制、优化总结

    一 MySQL总体架构 上图是<高性能MySQL>中对MySQL总体架构的描述,客户端对服务端的连接有很多条,有一个专门的处理组件,类似tomcat使用线程池处理请求.解析器负责解析sql ...

  8. 对webpack从零配置

    一.新建配置文件,文件名一般为webpack.config.js: 二.配置文件目录,一般为根目录,一般会放在./build文件夹下 三.配置文件格式一般为module.exports={}, 四.结 ...

  9. LeetCode--128--最长连续序列(python)

    给定一个未排序的整数数组,找出最长连续序列的长度. 要求算法的时间复杂度为 O(n). 示例: 输入: [100, 4, 200, 1, 3, 2]输出: 4解释: 最长连续序列是 [1, 2, 3, ...

  10. CSS元素居中汇总

    总结实现不同类型元素居中的几种方法: 一.把margin值设置为auto(实现水平居中) 可以实现元素水平居中对齐 原理:使  margin-left=margin-right  如果设置  marg ...