1. 概述

  MyBatis中动态SQL包括元素:

元素 作用 备注
if 判断语句 单条件分支判断
choose(when、otherwise) 相当于Java中的case when语句 多条件分支判断
trim(where、set) 辅助元素 用于处理SQL拼接问题
foreach 循环语句 用于in语句等列举条件

2. if元素

  if元素是最常用的判断语句,常与test属性联合使用。

2.1 if

<resultMap id="baseResultMap" type="com.libing.helloworld.model.Role">
<id property="id" column="id" />
<result property="roleName" column="role_name" />
</resultMap>
<select id="findBySearchText" resultMap="baseResultMap">
SELECT
id,
role_name
FROM
role
WHERE 1 = 1
<if test="searchText != null and searchText != ''">
AND role_name LIKE CONCAT('%', #{searchText,jdbcType=VARCHAR}, '%')
</if>
ORDER BY id ASC
</select>

2.2 if + where

<select id="findBySearchText" resultMap="baseResultMap">
SELECT
id,
role_name
FROM
role
<where>
<if test="id > 0">
id >= #{id}
</if>
<if test="searchText != null and searchText != ''">
AND role_name LIKE CONCAT(CONCAT('%',#{searchText,jdbcType=VARCHAR}),'%')
</if>
</where>
ORDER BY id ASC
</select>

  MyBatis中where标签会判断如果所包含的标签中有返回值,则插入一个‘where’。此外,如果标签返回的内容是以AND或OR开头,则自动删除开头的AND或OR。

2.3 if + set

<update id="update" parameterType="com.libing.helloworld.model.Role">
UPDATE role
<set>
<if test="roleName != null and roleName != ''">
role_name = #{roleName},
</if>
<if test="remark != null and remark != ''">
remark LIKE CONCAT('%', #{remark, jdbcType=VARCHAR}, '%')
</if>
</set>
WHERE id = #{id}
</update>

  上面形式,当ramark=null时,动态SQL语句会由于多出一个“,”而错误。

3. choose(when,otherwise)元素

<select id="findByCondition" resultMap="baseResultMap">
SELECT
id,
role_name
FROM
role
<where>
<choose>
<when test="id > 0">
id >= #{id}
</when>
<otherwise>
AND role_name LIKE CONCAT('%', #{roleName, jdbcType=VARCHAR}, '%')
</otherwise>
</choose>
</where>
ORDER BY id ASC
</select>

4.trim元素

4.1 trim:if + where

<select id="findByCondition" resultMap="baseResultMap">
SELECT
id,
role_name
FROM
role
<trim prefix="where" prefixOverrides="AND | OR">
<if test="id > 0">
id >= #{id}
</if>
<if test="roleName != null and roleName != ''">
AND role_name = LIKE CONCAT('%', #{roleName, jdbcType=VARCHAR}, '%')
</if>
</trim>
ORDER BY id ASC
</select>

4.2 trim:if + set

<update id="update" parameterType="com.libing.helloworld.model.Role">
UPDATE role
<trim prefix="set" suffixOverrides=",">
<if test="roleName != null and roleName != ''">
role_name = #{roleName},
</if>
<if test="remark != null and remark != ''">
remark LIKE CONCAT('%', #{remark, jdbcType=VARCHAR}, '%')
</if>
</trim>
WHERE id = #{id}
</update>

5. foreach元素

  foreach元素是一个循环语句,作用是遍历集合,支持遍历数组、List、Set接口的集合。

import org.apache.ibatis.annotations.Param;
List<Role> findByIds(@Param("ids") List<Integer> ids);
<select id="findByIds" resultMap="baseResultMap">
SELECT
id,
role_name
FROM
role
WHERE id IN
<foreach collection="ids" index="index" item="id" open="(" separator="," close=")">
#{id}
</foreach>
ORDER BY id ASC
</select>

  其中,

    collection:传入的参数名称,可以是一个数组、List、Set等集合

    item:循环中当前的元素

    index:当前元素在集合的位置下标

    open和close:包裹集合元素的符号

    separator:各个元素的间隔符

int insertBatch(List<Role> list);
<insert id="insertBatch" parameterType="java.util.List">
INSERT role
(
role_name
)
VALUES
<foreach collection="list" item="item" index="index" separator=",">
(
#{item.roleName}
)
</foreach>
</insert>

6. bind元素

  bind元素的作用是通过OGNL表达式去自定义一个上下文变量。

List<Role> findBySearchText(@Param("searchText") String searchText);
<select id="findBySearchText" resultMap="baseResultMap">
<bind name="pattern_searchText" value="'%' + searchText + '%'"/>
SELECT
id,
role_name
FROM
role
WHERE
role_name LIKE #{pattern_searchText}
</select>

  其中,

    searchText:传入的参数名称

MyBatis基础:MyBatis动态SQL(3)的更多相关文章

  1. mybatis 基础(二) 动态sql 关于where if / where choose when otherwise

    个人理解: where if就相当于正常的java中的if 语句,如果有多个条件组合判断的话用 and, or连接 而where choose when otherwise choose就好像是swi ...

  2. 【mybatis深度历险系列】mybatis中的动态sql

    最近一直做项目,博文很长时间没有更新了,今天抽空,学习了一下mybatis,并且总结一下.在前面的博文中,小编主要简单的介绍了mybatis中的输入和输出映射,并且通过demo简单的介绍了输入映射和输 ...

  3. Mybatis入门之动态sql

    Mybatis入门之动态sql 通过mybatis提供的各种标签方法实现动态拼接sql. 1.if.where.sql.include标签(条件.sql片段) <sql id="sel ...

  4. mybatis 详解------动态SQL

    mybatis 详解------动态SQL   目录 1.动态SQL:if 语句 2.动态SQL:if+where 语句 3.动态SQL:if+set 语句 4.动态SQL:choose(when,o ...

  5. mybatis中的动态SQL

    在实际开发中,数据库的查询很难一蹴而就,我们往往要根据各种不同的场景拼接出不同的SQL语句,这无疑是一项复杂的工作,我们在使用mybatis时,mybatis给我们提供了动态SQL,可以让我们根据具体 ...

  6. Mybatis映射文件动态SQL语句-01

    因为在很多业务逻辑复杂的项目中,往往不是简单的sql语句就能查询出来自己想要的数据,所有mybatis引入了动态sql语句, UserMapper.xml <?xml version=" ...

  7. mybatis入门基础(五)----动态SQL

    一:动态SQL 1.1.定义 mybatis核心对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. 1.2.案例需求 用户信息综合查询列表这个statement的定义使用动态s ...

  8. 6.Mybatis中的动态Sql和Sql片段(Mybatis的一个核心)

    动态Sql是Mybatis的核心,就是对我们的sql语句进行灵活的操作,他可以通过表达式,对sql语句进行判断,然后对其进行灵活的拼接和组装.可以简单的说成Mybatis中可以动态去的判断需不需要某些 ...

  9. 11、MyBatis教程之动态SQL

    12.动态SQL 1.介绍 什么是动态SQL:动态SQL指的是根据不同的查询条件 , 生成不同的Sql语句. 官网描述: MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或 ...

  10. 【长文】Spring学习笔记(七):Mybatis映射器+动态SQL

    1 概述 本文主要讲述了如何使用MyBatis中的映射器以及动态SQL的配置. 2 MyBatis配置文件概览 MyBatis配置文件主要属性如下: <settings>:相关设置,键值对 ...

随机推荐

  1. 转://Linux下误删除/home目录的恢复方法

    一般情况下,我们在安装Oracle数据库的时候,都会创建一个Oracle用户,用该用户来安装和管理Oracle.Oracle用户的根目录就是/home/oracle. 通常安装Oracle数据库是按照 ...

  2. P2068 统计和(树状数组模板)

    这是一道树状数组题 #include<iostream> using namespace std; ; int tree[maxn], n, m; char h; int x, y; vo ...

  3. N维偏序:cdq分治

    cdq(陈丹琦)分治,是一种类似二分的算法.基本思想同分治: 递归,把大问题划分成若干个结构相同的子问题,直到(L==R): 处理左区间[L,mid]对右区间[mid+1,R]的影响: 合并. 它可以 ...

  4. Ubuntu18.04安装英伟达显卡驱动

    前几天买了一张RTX2060显卡,想自学一下人工智能,跑一些图形计算,安装Ubuntu18.04后发现英伟达显卡驱动安装还是有点小麻烦,所以这里记录一下安装过程,以供参考: 1.卸载系统里低版本的英伟 ...

  5. 两个select之间的元素互相移动并保持顺序

    <html> <head> <meta http-equiv="Content-Type" content="text/html; char ...

  6. 如果IBM再给我一次实习机会

    2014年,我拿到了IBM斯图加特R&D的实习机会.在连续被索尼和博世拒掉之后,这个实习对我来说弥足珍贵.我学的是通信专业,在这之前与编程相关的活动只有一学期的安卓Lab,还是靠抱队友大腿才及 ...

  7. 【C#复习总结】细说匿名方法

    1 前言 本系列会将[委托] [匿名方法][Lambda表达式] [泛型委托] [表达式树] [事件]等基础知识总结一下.(本人小白一枚,有错误的地方希望大佬指正) 系类1:细说委托 系类2:细说匿名 ...

  8. 平均精度均值(mAP)——目标检测模型性能统计量

    在机器学习领域,对于大多数常见问题,通常会有多个模型可供选择.当然,每个模型会有自己的特性,并会受到不同因素的影响而表现不同. 每个模型的好坏是通过评价它在某个数据集上的性能来判断的,这个数据集通常被 ...

  9. Entity Framework Core系列之什么是Entity Framework Core

    前言 Entity Framework Core (EF Core)是微软推荐的基于.NET Core framework的应用程序数据访问技术.它是轻量级,可扩展并且支持跨平台开发.EF Core是 ...

  10. H5 18-序选择器

    18-序选择器 我是标题 我是段落1 我是段落2 我是段落3 我是段落4 我是段落5 我是段落6 我是段落7 我是段落8 --> 我是段落1 我是段落2 我是段落2 我是标题 <!DOCT ...