MyBatis整体了解
背景资料

动态SQL(Dynamic SQL)编辑
经历,您就会明白把SQL语句条件连接在一起是多么的痛苦,要确保不能忘记空格或者不要在
columns列后面省略一个逗号等。动态语句能够完全解决掉这些痛苦。
尽管与动态SQL一起工作不是在开一个party,但是MyBatis确实能通过在任何映射SQL语句中
使用强大的动态SQL来改进这些状况。
动态SQL元素对于任何使用过JSTL或者类似于XML之类的文本处理器的人来说,都是非常熟悉
的。在上一版本中,需要了解和学习非常多的元素,但在MyBatis 3 中有了许多的改进,现在只
剩下差不多二分之一的元素。MyBatis使用了基于强大的OGNL表达式来消除了大部分元素。
· choose (when, otherwise)
· trim (where, set)
· foreach
if 元素
<select id=”findActiveBlogWithTitleLike”
parameterType=”Blog” resultType=”Blog”>
SELECT * FROM BLOG
WHERE state = ‘ACTIVE’
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>
有时候我们不想应用所有的条件,而是想从多个选项中选择一个。与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>
考虑一下我们上面提到的‘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>
</select>
where 元素知道插入“where”如果它包含的标签中有内容返回的话。此外,如果返回的内容
以“AND” 或者“OR”开头,它会把“AND” 或者“OR”去掉。
如果where 元素的行为并没有完全按您想象的那样,您还可以使用trim 元素来自定义。例
如,下面的trim 与where 元素实现相同功能:
<trim prefix="WHERE" prefixOverrides="AND |OR ">
…
</trim>
overrides属性使用了管道分隔的文本列表来覆写,而且它的空白也不能忽略的。这样的结果
是移出了指定在overrides 属性里字符,而在开头插入prefix属性中指定的字符。
另一个动态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>
允许您指定开始和结束的字符,也可以加入一个分隔符到迭代器之间。这个元素的聪明之处在于
它不会意外地追加额外的分隔符。
MyBatis整体了解的更多相关文章
- MyBatis整体架构
Mybatis整体架构 基础支持层 反射模块 Java中的反射很强大,但是还是需要封装的.MyBatis专门提供了反射模块,对元素的反射进行了封装,提供了简洁的API,对反射进行了优化,例如缓存了类的 ...
- MyBatis源码分析(二):MyBatis整体架构及原理
一.Mybatis整体架构导图 二.Mybatis的核心组成 SqlSessionFactoryBuilder(构造器): 根据配置信息(XML)生成SqlSessionFactory工厂接口,构造器 ...
- 由浅入深--MyBatis整体架构
学一门技术,做一件事不应该马上就直接进入到细节中,而是应该鸟瞰其全貌,了解它的整体架构和执行流程. MyBatis的整体架构 MyBatis的整体架构分为三层,分别是基础支持层,核心处理层和接口层,各 ...
- mybatis整体流程
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC ...
- Mybatis源码学习之整体架构(一)
简述 关于ORM的定义,我们引用了一下百度百科给出的定义,总体来说ORM就是提供给开发人员API,方便操作关系型数据库的,封装了对数据库操作的过程,同时提供对象与数据之间的映射功能,解放了开发人员对访 ...
- 浅析MyBatis(一):由一个快速案例剖析MyBatis的整体架构与运行流程
MyBatis 是轻量级的 Java 持久层中间件,完全基于 JDBC 实现持久化的数据访问,支持以 xml 和注解的形式进行配置,能灵活.简单地进行 SQL 映射,也提供了比 JDBC 更丰富的结果 ...
- Mybatis框架可视化(1)
Mybatis整体架构视图: 接 口 层 SqlSession (定义了Mybatis暴露给应用程序调用的API) 核 心 处 理 层 配置解析 (加载核心配置.映射配置. mapper接口注解信息, ...
- Mybatis学习系列(一)入门简介
MyBatis简介 Mybatis是Apache的一个Java开源项目,是一个支持动态Sql语句的持久层框架.Mybatis可以将Sql语句配置在XML文件中,避免将Sql语句硬编码在Java类中.与 ...
- MyBatis随笔
前一阵参与了一个项目的搭建,为了快速开发再加上学一些新东西,准备采用React+Spring MVC+MyBatis的架构. 花了一些时间最终把Spring MVC+MyBatis打通. 这里总结下M ...
随机推荐
- ImportError: No module named lmdb
why? 具体原因没有查清楚.安装caffe时,按照要求安装了包,caffe用的好好的,而且我也用打好包的lmdb跑了程序了.可我今天想看一下我的打包数据是不是漏掉数据了,直接开个python窗口,i ...
- 通过ajax给后台提交数据时,radio性别数据的获取
通过ajax向后台异步发送数据,经常我们会遇到个人信息额提交,一般我们采用FormData来装数据.在装性别值得时候,我们会有两个radio框,获取radio值得方法如下: 一般情况下,一个radio ...
- 菜鸟笔记 -- Chapter 6.1 面向对象概述
6.1 面向对象概述 在程序开发的初期人们使用结构化开发语言,但是随着时间的流逝,软件的规模越来越庞大,结构化语言的弊端逐渐暴露出来,开发周期被无限制拖延,产品质量也不尽如人意,人们终于发现结构化语言 ...
- iOS 语言国际化配置
所谓的iOS 国际化,就是根据系统不同的语言自动切换. 首先,如图: 创建一个.strings文件,以“Localizable.strings”为文件名: 创建完之后,在XCode的右边勾选自 ...
- checked="checked"无效,radio未选中问题排查
在使用attr给元素设置属性的时候,但是显示在页面就是未选中,而且是只使用一两次是ok的,但是连着多使用就不起作用了,百度了下,发现遇到这个问题的人还蛮多的, 有人说,发现在jQuery1.6版本之后 ...
- python实践项目—Collatz序列
Collatz序列题意说明 编写一个名为collatz()的函数,它有一个名为number 的参数.如果参数是偶数,那么collatz()就打印出number // 2,并返回该值.如果number ...
- 【ospf-基础配置】
ospf开放最短路径优先基本配置{ ospf cost :配置ospf接口的优先级 ospf dr-priority :配置路径花费值 ospf router_id:创建ospf的进程号 area a ...
- 常见的Dom操作
1.什么是DOM? DOM又称文档对象模型( DOM, Document Object Model )主要用于对HTML和XML文档的内容进行操作.DOM描绘了一个层次化的节点树,通过对节点进行操作, ...
- x-pack本地安装方式
一.首先下载本地安装包,我使用的ELK是5.6.1版本: https://artifacts.elastic.co/downloads 二.进入到elasticsearch/bin(所有节点)和kib ...
- sbt打包error(sbt.librarymanagement.ResolveException: unresolved dependency: org.apache.spark#spark-streaming;2.3.1: not found)
解决方法: 修改simple.sbt文件: cd /usr/local/spark/myapp/TestStream vim simple.sbt 切记:中间相连部分两个百分号一定要写上