MyBatis基础:MyBatis动态SQL(3)
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)的更多相关文章
- mybatis 基础(二) 动态sql 关于where if / where choose when otherwise
个人理解: where if就相当于正常的java中的if 语句,如果有多个条件组合判断的话用 and, or连接 而where choose when otherwise choose就好像是swi ...
- 【mybatis深度历险系列】mybatis中的动态sql
最近一直做项目,博文很长时间没有更新了,今天抽空,学习了一下mybatis,并且总结一下.在前面的博文中,小编主要简单的介绍了mybatis中的输入和输出映射,并且通过demo简单的介绍了输入映射和输 ...
- Mybatis入门之动态sql
Mybatis入门之动态sql 通过mybatis提供的各种标签方法实现动态拼接sql. 1.if.where.sql.include标签(条件.sql片段) <sql id="sel ...
- mybatis 详解------动态SQL
mybatis 详解------动态SQL 目录 1.动态SQL:if 语句 2.动态SQL:if+where 语句 3.动态SQL:if+set 语句 4.动态SQL:choose(when,o ...
- mybatis中的动态SQL
在实际开发中,数据库的查询很难一蹴而就,我们往往要根据各种不同的场景拼接出不同的SQL语句,这无疑是一项复杂的工作,我们在使用mybatis时,mybatis给我们提供了动态SQL,可以让我们根据具体 ...
- Mybatis映射文件动态SQL语句-01
因为在很多业务逻辑复杂的项目中,往往不是简单的sql语句就能查询出来自己想要的数据,所有mybatis引入了动态sql语句, UserMapper.xml <?xml version=" ...
- mybatis入门基础(五)----动态SQL
一:动态SQL 1.1.定义 mybatis核心对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. 1.2.案例需求 用户信息综合查询列表这个statement的定义使用动态s ...
- 6.Mybatis中的动态Sql和Sql片段(Mybatis的一个核心)
动态Sql是Mybatis的核心,就是对我们的sql语句进行灵活的操作,他可以通过表达式,对sql语句进行判断,然后对其进行灵活的拼接和组装.可以简单的说成Mybatis中可以动态去的判断需不需要某些 ...
- 11、MyBatis教程之动态SQL
12.动态SQL 1.介绍 什么是动态SQL:动态SQL指的是根据不同的查询条件 , 生成不同的Sql语句. 官网描述: MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或 ...
- 【长文】Spring学习笔记(七):Mybatis映射器+动态SQL
1 概述 本文主要讲述了如何使用MyBatis中的映射器以及动态SQL的配置. 2 MyBatis配置文件概览 MyBatis配置文件主要属性如下: <settings>:相关设置,键值对 ...
随机推荐
- Python:Day08 文件操作
能调用方法的一定是对象! 文件的操作分为三步: 1.打开文件 2.操作文件 3.关闭文件 f= open('小重山','r',encoding='utf8') #以读的方式打开一个文件,如果文件不存在 ...
- 漏洞扫描,linux配置规范处理
#!/bin/bash ## set shortest length of password filename=/etc/login.defs if [ -f "$filename" ...
- 淡旺季机票的价格问题(switch语句与if-else语句嵌套)
项目背景 淡旺季机票的价格,原价机票价格为5000元, 淡季头等舱打5折,经济舱打4折 旺季头等舱打9折,经济舱打8折 要求 编写程序实现: 输入任意的月份与舱位来计算机票的价格 1代表头等舱,2代表 ...
- Python脱产8期 Day06 2019/4/18
一 深浅拷贝 例:ls = [1, 'abc', [10]] 1.值拷贝:s1 = ls # ls1直接将ls中存放的地址拿过来,>ls内部的值发生任何变化,ls1都会随之变化. 2.浅拷 ...
- object detection[NMS]
非极大抑制,是在对象检测中用的较为频繁的方法,当在一个对象区域,框出了很多框,那么如下图: 上图来自这里 目的就是为了在这些框中找到最适合的那个框.有以下几种方式: 1 nms 2 soft-nms ...
- 【thinkPHP框架】Failed opening required 'header.php' include_path='.;c:\php5\pear 终级解决方案
ThinkPHP框架中的某一个php页面,想要去引入其他php页面,结果反复报错,无解. 各种百度,有说是文件权限不够的,也有说配置不对的,反正一个都没有解决这个问题,依然无解. 最终,找到了办法,似 ...
- 分布式系统消息中间件——RabbitMQ的使用基础篇
分布式系统消息中间件——RabbitMQ的使用基础篇
- Winform开发框架之字段权限控制
在我的很多Winform开发项目中(包括混合框架的项目),统一采用了权限管理模块来进行各种权限的控制,包括常规的功能权限(按钮.菜单权限).数据权限(记录的权限),另外还可以进行字段级别的字段权限控制 ...
- ReactJs移动端兼容问题汇总
汽车H5使用ReactJs问题汇总 Q:安卓4.4webview显示空白? A:初步怀疑是css属性没有加前缀引发的兼容问题,但添加后发现也不行,通过webview调试后控制台输出Set is und ...
- H5 id选择器
09-id选择器 迟到毁一生 早退穷三代 按时上下班 必成高富帅 <!DOCTYPE html> <html lang="en"> <head> ...