文档章节

MyBatis基础学习:动态SQL和SQL语句构建器类

群星纪元
 群星纪元
发布于 2016/10/07 00:46
字数 1795
阅读 363
收藏 0

Mybatis介绍

MyBatis logo

MyBatis(http://www.mybatis.org/) 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以对配置和原生Map使用简单的 XML 或注解,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

 

动态 SQL

作用

MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其他类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句有多么痛苦。拼接的时候要确保不能忘了必要的空格,还要注意省掉列名列表最后的逗号。利用动态 SQL 这一特性可以彻底摆脱这种痛苦。

通常使用动态 SQL 不可能是独立的一部分,MyBatis 当然使用一种强大的动态 SQL 语言来改进这种情形,这种语言可以被用在任意的 SQL 映射语句中。

动态 SQL 元素和使用 JSTL 或其他类似基于 XML 的文本处理器相似。在 MyBatis 之前的版本中,有很多的元素需要来了解。MyBatis 3 大大提升了它们,现在用不到原先一半的元素就可以了。MyBatis 采用功能强大的基于 OGNL 的表达式来消除其他元素。

 

if

动态 SQL 通常要做的事情是有条件地包含 where 子句的一部分。比如:

<select id="select" resultType="User">
  SELECT * FROM User WHERE uid=#{uid} 
  <if test="name != null">
    AND name=#{name}
  </if>
</select>

 

choose (when, otherwise)

有些时候,我们不想用到所有的条件语句,而只想从中择其一二。针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。

<select id="find" resultType="User">
  SELECT * FROM User WHERE uid=#{uid}
  <choose>
    <when test="name != null">
      AND name=#{name}
    </when>
    <when test="age != null">
      AND age=#{age}
    </when>
    <otherwise>
      AND age=0
    </otherwise>
  </choose>
</select>

 

trim (where, set)

我们可以通过自定义 trim 元素来定制我们想要的功能。比如:

<trim prefix="WHERE" prefixOverrides="AND |OR ">
  ... 
</trim>

prefixOverrides 属性会忽略通过管道分隔的文本序列(注意此例中的空格也是必要的)。它带来的结果就是所有在 prefixOverrides 属性中指定的内容将被移除,并且插入 prefix 属性中指定的内容。

 

foreach

动态 SQL 的另外一个常用的必要操作是需要对一个集合进行遍历。比如:

<insert id="insert" parameterType="User">
    INSERT INTO User (
      <include refid="baseColums"/>
    ) VALUES
    <foreach item="item" collection="list" separator=",">
        (#{item.name}, #{item.age})
    </foreach>
</insert>

foreach 元素的功能是非常强大的,它允许你指定一个集合,声明可以用在元素体内的集合项和索引变量。它也允许你指定开闭匹配的字符串以及在迭代中间放置分隔符。这个元素是很智能的,因此它不会偶然地附加多余的分隔符。

 

SQL语句构建器类

作用

Java程序员面对的最痛苦的事情之一就是在Java代码中嵌入SQL语句。这么来做通常是由于SQL语句需要动态来生成-否则可以将它们放到外部文件或者存储过程中。正如你已经看到的那样,MyBatis在它的XML映射特性中有一个强大的动态SQL生成方案。但有时在Java代码内部创建SQL语句也是必要的。此时,MyBatis有另外一个特性可以帮到你,在减少典型的加号,引号,新行,格式化问题和嵌入条件来处理多余的逗号或 AND 连接词之前。

 

SQL类

MyBatis 3提供了方便的工具类来帮助解决该问题。使用SQL类,简单地创建一个实例来调用方法生成SQL语句。比如:

private String selectPersonSql() {
  return new SQL() {{
    SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FULL_NAME");
    SELECT("P.LAST_NAME, P.CREATED_ON, P.UPDATED_ON");
    FROM("PERSON P");
    FROM("ACCOUNT A");
    INNER_JOIN("DEPARTMENT D on D.ID = P.DEPARTMENT_ID");
    INNER_JOIN("COMPANY C on D.COMPANY_ID = C.ID");
    WHERE("P.ID = A.ID");
    WHERE("P.FIRST_NAME like ?");
    OR();
    WHERE("P.LAST_NAME like ?");
    GROUP_BY("P.ID");
    HAVING("P.LAST_NAME like ?");
    OR();
    HAVING("P.FIRST_NAME like ?");
    ORDER_BY("P.ID");
    ORDER_BY("P.FULL_NAME");
  }}.toString();
}

 

SQL类方法和描述表

方法 描述
SELECT(String) 开始或插入到 SELECT子句。 可以被多次调用,参数也会添加到 SELECT子句。 参数通常使用逗号分隔的列名和别名列表,但也可以是数据库驱动程序接受的任意类型。
SELECT_DISTINCT(String) 开始或插入到 SELECT子句, 也可以插入 DISTINCT关键字到生成的查询语句中。 可以被多次调用,参数也会添加到 SELECT子句。 参数通常使用逗号分隔的列名和别名列表,但也可以是数据库驱动程序接受的任意类型。
FROM(String) 开始或插入到 FROM子句。 可以被多次调用,参数也会添加到 FROM子句。 参数通常是表名或别名,也可以是数据库驱动程序接受的任意类型。
  • JOIN(String)
  • INNER_JOIN(String)
  • LEFT_OUTER_JOIN(String)
  • RIGHT_OUTER_JOIN(String)
基于调用的方法,添加新的合适类型的 JOIN子句。 参数可以包含由列命和join on条件组合成标准的join。
WHERE(String) 插入新的 WHERE子句条件, 由AND链接。可以多次被调用,每次都由AND来链接新条件。使用 OR() 来分隔OR。
OR() 使用OR来分隔当前的 WHERE子句条件。 可以被多次调用,但在一行中多次调用或生成不稳定的SQL。
AND() 使用AND来分隔当前的 WHERE子句条件。 可以被多次调用,但在一行中多次调用或生成不稳定的SQL。因为 WHERE 和 HAVING 二者都会自动链接 AND, 这是非常罕见的方法,只是为了完整性才被使用。
GROUP_BY(String) 插入新的 GROUP BY子句元素,由逗号连接。 可以被多次调用,每次都由逗号连接新的条件。
HAVING(String) 插入新的 HAVING子句条件。 由AND连接。可以被多次调用,每次都由AND来连接新的条件。使用 OR() 来分隔OR.
ORDER_BY(String) 插入新的 ORDER BY子句元素, 由逗号连接。可以多次被调用,每次由逗号连接新的条件。
DELETE_FROM(String) 开始一个delete语句并指定需要从哪个表删除的表名。通常它后面都会跟着WHERE语句!
INSERT_INTO(String) 开始一个insert语句并指定需要插入数据的表名。后面都会跟着一个或者多个VALUES()。
SET(String) 针对update语句,插入到"set"列表中
UPDATE(String) 开始一个update语句并指定需要更新的表明。后面都会跟着一个或者多个SET(),通常也会有一个WHERE()。
VALUES(String, String) 插入到insert语句中。第一个参数是要插入的列名,第二个参数则是该列的值。

 

总结

以上就是动态SQL和SQL语句构建器类的大致结构。通过对if元素、choose, when, otherwise元素、trim, where, set元素、foreach元素和SQL类的学习,对动态SQL和SQL语句构建器类有了一个整体的概念和理解。

本文转载自:https://my.oschina.net/zhaojia/blog/750452

上一篇: Java GC
下一篇: 漫谈JVM
群星纪元
粉丝 50
博文 456
码字总数 44497
作品 0
朝阳
高级程序员
私信 提问
加载中

评论(0)

MyBatis基础学习:动态SQL和SQL语句构建器类

Mybatis介绍 MyBatis(http://www.mybatis.org/) 是支持定制化 SQL、存储过程以及高级映射的优秀的持久层框架。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可...

Jia
2016/09/22
2.4K
0
MyBatis 基础搭建及架构概述

[TOC] MyBatis 是什么? MyBatis是第一个支持自定义SQL、存储过程和高级映射的类持久框架。MyBatis消除了大部分JDBC的样板代码、手动设置参数以及检索结果。MyBatis能够支持简单的XML和注解配...

osc_kfohgqus
04/16
1
0
(二)MyBatis核心组件(配图详解&代码实现)

MyBatis的核心组件分为4个部分 SqlSessionFactoryBuilder(构造器):根据xml或java代码生成SqlSessionFactory。 SqlSessionFactory(工厂接口):使用它生成Sqlsession,工厂模式下生成。 ...

青衣煮茶
2018/07/27
0
0
深入理解MyBatis的原理:整个体系

前言:工作中虽然用到了 MyBatis,可完全不知道为什么,再不学习就晚了,这里将记录我的学习笔记,整个 MyBatis 的体系。 一、简介   1、传统的JDBC   JDBC 是一种典型的桥接模式。   ...

osc_nnd0q3n4
2018/08/05
2
0
Mybatis技术内幕(一)——整体架构概览

Mybatis技术内幕(一)——整体架构概览 Mybatis的整体架构分为三层,分别是基础支持层、核心处理层和接口层。 如图所示: 一、基础支持层 基础支持层包含整个Mybatis的基础模块,这些模块为核...

osc_nhu3ff62
2019/11/20
2
0

没有更多内容

加载失败,请刷新页面

加载更多

从尾到头打印链表

输入一个链表,按链表从尾到头的顺序返回一个ArrayList。 /**   * struct ListNode {     * int val;     * struct ListNode *next;     * ListNode(int x) :       * v...

osc_5c67s863
7分钟前
16
0
如何把两个pdf合成一个?几个pdf文件可以合并到一起吗?

熟悉office软件的小伙伴应该都知道如何将两个word文档,两个Excel表格合并成一个吧?但是现如今,word和Excel可并非是唯一常用的办公程序了,就拿pdf来说,就是现在比较受青睐的办公程序。那...

小品778
7分钟前
14
0
P2433 小学数学N合一

https://www.luogu.com.cn/problem/P2433 全谷最复杂的简单题。 题目描述 问题 1 请输出 I love Luogu! 问题 2 这里有 10 个苹果,小A 拿走了 2 个,Uim 拿走了 4 个,八尾勇拿走剩下的所有的...

osc_d8v3gwtb
7分钟前
11
0
开坑记录网络开坑

转行IT发现自己在工作中遇到的好多问题都没有思路或者办法去排查解决,简单来讲就是没有IT的运行逻辑,所以攒了点钱报了个网络班,先学习一下网络的基础知识,自己也是个新人,虽然接近而立之...

卡贝俏
9分钟前
16
0
健康消费升级提速,“智慧”+“健康”TCL空调能否构筑市场新格局?

文|曾响铃 来源|科技向令说(xiangling0815) 五月初夏,终于迎来了空调市场的第一波热潮,苏宁数据显示,五一期间线上空调销售量同比增长99.7%,几近翻倍。 然而,今年的情况又与往年不太一...

osc_6srwahuo
9分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部