背景资料

  MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis [1]
[2]iBATIS一词来源于“internet”和“abatis”的组合,是一个基于Java的持久层框架。iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)
 
简介
  MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。
  MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。
  每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。SqlSessionFactoryBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得。
  用xml文件构建SqlSessionFactory实例是非常简单的事情。推荐在这个配置中使用类路径资源(classpath resource),但你可以使用任何Reader实例,包括用文件路径或file://开头的url创建的实例。MyBatis有一个实用类----Resources,它有很多方法,可以方便地从类路径及其它位置加载资源。
 
总体流程
(1)加载配置并初始化

触发条件:加载配置文件
将SQL的配置信息加载成为一个个MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。
(2)接收调用请求
触发条件:调用Mybatis提供的API
传入参数:为SQL的ID和传入参数对象
处理过程:将请求传递给下层的请求处理层进行处理。
(3)处理操作请求 触发条件:API接口层传递请求过来
传入参数:为SQL的ID和传入参数对象
处理过程:
(A)根据SQL的ID查找对应的MappedStatement对象。
(B)根据传入参数对象解析MappedStatement对象,得到最终要执行的SQL和执行传入参数。
(C)获取数据库连接,根据得到的最终SQL语句和执行传入参数到数据库执行,并得到执行结果。
(D)根据MappedStatement对象中的结果映射配置对得到的执行结果进行转换处理,并得到最终的处理结果。
(E)释放连接资源。
(4)返回处理结果将最终的处理结果返回。
 
功能架构
功能架构讲解:
我们把Mybatis的功能架构分为三层:
(1)API接口层:提供给外部使用的接口API,开发人员通过这些本地API来操纵数据库。接口层一接收到调用请求就会调用数据处理层来完成具体的数据处理。
(2)数据处理层:负责具体的SQL查找、SQL解析、SQL执行和执行结果映射处理等。它主要的目的是根据调用的请求完成一次数据库操作。
(3)基础支撑层:负责最基础的功能支撑,包括连接管理、事务管理、配置加载和缓存处理,这些都是共用的东西,将他们抽取出来作为最基础的组件。为上层的数据处理层提供最基础的支撑。
 

动态SQL(Dynamic SQL)编辑

MyBatis 最强大的特性之一就是它的动态语句功能。如果您以前有使用JDBC或者类似框架的
  经历,您就会明白把SQL语句条件连接在一起是多么的痛苦,要确保不能忘记空格或者不要在
  columns列后面省略一个逗号等。动态语句能够完全解决掉这些痛苦。
  尽管与动态SQL一起工作不是在开一个party,但是MyBatis确实能通过在任何映射SQL语句中
  使用强大的动态SQL来改进这些状况。
  动态SQL元素对于任何使用过JSTL或者类似于XML之类的文本处理器的人来说,都是非常熟悉
  的。在上一版本中,需要了解和学习非常多的元素,但在MyBatis 3 中有了许多的改进,现在只
  剩下差不多二分之一的元素。MyBatis使用了基于强大的OGNL表达式来消除了大部分元素。
·if
  · choose (when, otherwise)
  · trim (where, set)
  · foreach

if 元素

  动态SQL 最常做的事就是有条件地包括where 子句。例如:
  <select id=”findActiveBlogWithTitleLike”
  parameterType=”Blog” resultType=”Blog”>
  SELECT * FROM BLOG
  WHERE state = ‘ACTIVE’
<if test=”title != null”>
  AND title like #{title}
  </if>
  </select>
这条语句提供一个带功能性的可选的文字。如果您没有传入标题,那么将返回所有激活的
  Blog。如果您传入了一个标题,那它就会查找与这个标题匹配的Blog(在这种情况下,您的参数
  值可能需要包括任何masking或者通配符)。
  如果我们想要可选地根据标题或者作者查询怎么办?首先,我把语句的名称稍稍改一下,使
  得看起来更直观。然后简单地加上另外一个条件。
  <select id=”findActiveBlogLike”
  parameterType=”Blog” resultType=”Blog”>
  SELECT * FROM BLOG WHERE state = ‘ACTIVE’
  <if test=”title != null”>
  AND title like #{title}
  </if>
  <if test=”author != null and author.name != null”>
  AND title like #{author.name}
  </if>
  </select>
choose, when, otherwise 元
  有时候我们不想应用所有的条件,而是想从多个选项中选择一个。与java 中的switch 语句
  相似,MyBatis 提供了一个choose 元素。
  让我们继续使用上面的例子,但这次我们只搜索有提供查询标题的,或者只搜索有提供查询
  作者的数据。如果两者都没有提供,那只返回加精的Blog (可能是管理员有选择性的查询,而不
  是返回大量无意义的随机的Blog)。
  <select id=”findActiveBlogLike”
  parameterType=”Blog” resultType=”Blog”>
  SELECT * FROM BLOG WHERE state = ‘ACTIVE’
  <choose>
  <when test=”title != null”>
  AND title like #{title}
  </when>
  <when test=”author != null and author.name != null”>
  AND title like #{author.name}
  </when>
  <otherwise>
  AND featured = 1
  </otherwise>
  </choose>
  </select>
trim, where, set 元素
  
考虑一下我们上面提到的‘if ’的例子中,如果现在我们把‘ACTIVE=1’也做为条件,会发
  生什么情况。
  <select id=”findActiveBlogLike”
  parameterType=”Blog” resultType=”Blog”>
  SELECT * FROM BLOG
  WHERE
  <if test=”state != null”>
  state = #{state}
  </if>
  <if test=”title != null”>
  AND title like #{title}
  </if>
  <if test=”author != null and author.name != null”>
  AND title like #{author.name}
  </if>
  </select>
  如果我们一个条件都不设置,会发生什么呢?语句最终可能会变成这个样子:
  SELECT * FROM BLOG
  WHERE
  这将会执行失败。如果只有第二个条件满足呢?语句最终会变成这样:
  SELECT * FROM BLOG
  WHERE
  AND title like ‘someTitle’
这同样会执行失败。这个问题仅用条件很难简单地解决,如果您已经这么写了,那您可能以
  后永远都不想犯这样的错了。
  MyBatis有个简单的方案能解决这里面90%的问题。如果where没有出现的时候,您可以自定一
  个。修改一下,就能完全解决:
  <select id=”findActiveBlogLike”
  parameterType=”Blog” resultType=”Blog”>
  SELECT * FROM BLOG
  <where>
  <if test=”state != null”>
  state = #{state}
  </if>
  <if test=”title != null”>
  AND title like #{title}
  </if>
  <if test=”author != null and author.name != null”>
  AND title like #{author.name}
  </if>
</where>
  </select>
  where 元素知道插入“where”如果它包含的标签中有内容返回的话。此外,如果返回的内容
  以“AND” 或者“OR”开头,它会把“AND” 或者“OR”去掉。
  如果where 元素的行为并没有完全按您想象的那样,您还可以使用trim 元素来自定义。例
  如,下面的trim 与where 元素实现相同功能:
  <trim prefix="WHERE" prefixOverrides="AND |OR ">
  …
  </trim>
  overrides属性使用了管道分隔的文本列表来覆写,而且它的空白也不能忽略的。这样的结果
  是移出了指定在overrides 属性里字符,而在开头插入prefix属性中指定的字符。
Foreach 元素
  
另一个动态SQL 经常使用到的功能是集合迭代,通常用在IN 条件句。例如:
  <select id="selectPostIn" resultType="domain.blog.Post">
  SELECT *
  FROM POST P
  WHERE ID in
  <foreach item="item" index="index" collection="list"
  open="(" separator="," close=")">
  #{item}
  </foreach>
  </select>
foreach 元素非常强大,允许您指定一个集合,申明能够用在元素体内的项和索引变量。也
  允许您指定开始和结束的字符,也可以加入一个分隔符到迭代器之间。这个元素的聪明之处在于
  它不会意外地追加额外的分隔符。
  

MyBatis整体了解的更多相关文章

  1. MyBatis整体架构

    Mybatis整体架构 基础支持层 反射模块 Java中的反射很强大,但是还是需要封装的.MyBatis专门提供了反射模块,对元素的反射进行了封装,提供了简洁的API,对反射进行了优化,例如缓存了类的 ...

  2. MyBatis源码分析(二):MyBatis整体架构及原理

    一.Mybatis整体架构导图 二.Mybatis的核心组成 SqlSessionFactoryBuilder(构造器): 根据配置信息(XML)生成SqlSessionFactory工厂接口,构造器 ...

  3. 由浅入深--MyBatis整体架构

    学一门技术,做一件事不应该马上就直接进入到细节中,而是应该鸟瞰其全貌,了解它的整体架构和执行流程. MyBatis的整体架构 MyBatis的整体架构分为三层,分别是基础支持层,核心处理层和接口层,各 ...

  4. mybatis整体流程

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC ...

  5. Mybatis源码学习之整体架构(一)

    简述 关于ORM的定义,我们引用了一下百度百科给出的定义,总体来说ORM就是提供给开发人员API,方便操作关系型数据库的,封装了对数据库操作的过程,同时提供对象与数据之间的映射功能,解放了开发人员对访 ...

  6. 浅析MyBatis(一):由一个快速案例剖析MyBatis的整体架构与运行流程

    MyBatis 是轻量级的 Java 持久层中间件,完全基于 JDBC 实现持久化的数据访问,支持以 xml 和注解的形式进行配置,能灵活.简单地进行 SQL 映射,也提供了比 JDBC 更丰富的结果 ...

  7. Mybatis框架可视化(1)

    Mybatis整体架构视图: 接 口 层 SqlSession (定义了Mybatis暴露给应用程序调用的API) 核 心 处 理 层 配置解析 (加载核心配置.映射配置. mapper接口注解信息, ...

  8. Mybatis学习系列(一)入门简介

    MyBatis简介 Mybatis是Apache的一个Java开源项目,是一个支持动态Sql语句的持久层框架.Mybatis可以将Sql语句配置在XML文件中,避免将Sql语句硬编码在Java类中.与 ...

  9. MyBatis随笔

    前一阵参与了一个项目的搭建,为了快速开发再加上学一些新东西,准备采用React+Spring MVC+MyBatis的架构. 花了一些时间最终把Spring MVC+MyBatis打通. 这里总结下M ...

随机推荐

  1. Selenium处理页面---弹窗、表格、鼠标悬停、frame、下拉框、上传文件

    一.Selenium测试-常用页面处理 1.概述 UI自动化测试(GUI界面层):UI层是用户使用产品的入口,所有功能通过这一层提供给用户,测试工作大多集中在这一层,常见的测试工具有UFT.Robot ...

  2. Linux系统VPS主机SSH常用命令

    putty查询log文当里的"test"关键字 /home/iotserver/WebServer3_log# grep "test" log.log.bak2 ...

  3. CSS基础全荟

    一.CSS概述 1.css是什么?? 层叠样式表 2.css的引入方式 1.行内样式   在标签上加属性style="属性名1:属性值1;属性名2:属性值2;..." 2.内嵌式  ...

  4. jquery点击按钮复制内容

    做移动端的项目遇到一个需求要点击按钮复制dom里的内容,看了很多资料显示必须textarea或者input里的内容才能简单复制,还有就是用插件的了,最终都因为遇到各种问题放弃,最终选择了最简单的点击复 ...

  5. java 时间转换去杠

    public static String minusHyphen(String dateParam){ if(dateParam ==null) return null; if(dateParam.i ...

  6. git push之后回滚(撤销)代码

    问题描述:首先,先说明一下,为什么会引发这次的话题,是这样的,我做完功能Agit push之后,2个月后需求部门要求不要功能A了,然后需要在没有功能A的基础上开发,怎么办?赶紧回滚代码呀. 然后我用g ...

  7. android发布帖子类技术

    最近练习一些关于发布帖子的技术,说来也简单,就学了一点皮毛吧!好了,下面就上代码吧! 首先设计服务器的访问类,大家都知道现在东西都要联网的嘛! JSONParser的类: public class J ...

  8. js中的逻辑与和逻辑或随笔

    逻辑与:&&,都真才真 逻辑或:||,一真都真 逻辑运算两侧不都是布尔值时,会隐式转换为布尔值转换规则:转换为true:非0数字(包含infinity).非空字符串转换为false:0 ...

  9. STM32(4)——系统时钟和SysTick

    1.STM32的时钟系统 在STM32中,一共有5个时钟源,分别是HSI.HSE.LSI.LSE.PLL HSI是高速内部时钟,RC振荡器,频率为8MHz: HSE是高速外部时钟,可接石英/陶瓷谐振器 ...

  10. go 操作数据库

    假设有了数据库,创建表 CREATE TABLE `userinfo` ( `uid` INT(10) NOT NULL AUTO_INCREMENT, //自增字段 `username` VARCH ...