全部学科
NodeJS全栈
nodejs
Python全栈
python
小程序首页
📝 1 篇文章 14 道配套习题

动态 SQL专题

专题说明

本专题精选14道代表性题目,系统讲解MyBatis的动态SQL功能,涵盖if条件判断、choose/when/otherwise分支选择、foreach循环遍历、where/set智能裁剪、trim自定义、bind变量绑定等核心标签,是MyBatis最强大且最常用的特性之一。

学习目标

  1. 掌握if标签的条件判断与OGNL表达式语法
  2. 理解choose/when/otherwise的互斥分支机制
  3. 熟练使用foreach遍历List、数组和Map参数
  4. 掌握where/set标签的智能裁剪功能
  5. 理解trim标签与where/set的等价关系
  6. 能够综合运用动态SQL标签构建复杂查询

学习内容

本专题涵盖以下5个知识点:

知识点题目数核心内容
if 条件判断2题test属性、OGNL表达式、字符串比较
choose/when/otherwise2题互斥分支、索引优化
foreach 循环遍历3题collection属性、分隔符、Map遍历
where/set 智能裁剪3题自动添加关键字、去除多余AND/逗号
trim/bind 与其他4题trim等价关系、bind变量绑定、综合应用

学习建议

  • 先阅读完整指南文章,理解动态SQL的整体设计思想
  • 重点掌握if和foreach的使用,它们是动态SQL中最常用的标签
  • 理解trim标签是where/set的底层实现,有助于灵活定制
  • 注意OGNL表达式中字符串比较需要使用单引号
  • 多动手实践,尝试编写复杂的多条件查询SQL

📝 发现内容有误?点击此处直接编辑

📝 配套习题(14 题)

1
单选题

在 MyBatis 的动态 SQL 中,<trim> 标签用于自定义裁剪 SQL 片段。以下关于 <trim> 标签属性的描述,错误的是:

A

prefix 属性用于给裁剪后的内容添加前缀

B

prefixOverrides 属性用于去除内容开头匹配的指定字符串

C

suffixOverrides 属性用于去除内容结尾匹配的指定字符串

D

suffix 属性用于去除内容结尾的指定字符串

2
多选题

在 MyBatis 中,<where><set> 标签底层都可以用 <trim> 标签来实现。以下哪些 <trim> 配置可以分别等价于 <where><set> 标签的功能?

A

<trim prefix="WHERE" prefixOverrides="AND |OR "> 等价于 <where>

B

<trim prefix="SET" suffixOverrides=","> 等价于 <set>

C

<trim prefix="WHERE" suffixOverrides="AND |OR "> 等价于 <where>

D

<trim prefix="SET" prefixOverrides=","> 等价于 <set>

3
单选题

在 MyBatis 中,关于 <sql> 片段的使用,以下说法正确的是:

A

<sql> 片段只能在同一个 Mapper XML 文件中使用 <include> 标签引用

B

<sql> 片段可以通过 refid 引用其他命名空间的片段

C

<sql> 片段定义时必须指定 id 属性,使用时通过 <include refid="..."> 引用

D

<sql> 片段中可以包含完整的 SQL 语句,包括 SELECT、FROM、WHERE 等关键字,但不支持动态 SQL 标签

4
填空题

在 MyBatis 中,若要从一个 Mapper XML 文件引用另一个命名空间中定义的 SQL 片段,需要使用完整的命名空间格式。假设有命名空间为 com.example.mapper.UserMapper 的 Mapper,其中定义了 id="base_columns" 的 SQL 片段,在当前 Mapper 中引用该片段的正确语法是使用 ______ 标签,并设置 refid 属性为 ____________

5
单选题

在 MyBatis 中,<bind> 标签的主要作用是:

A

将 Java 方法绑定到 SQL 语句中执行

B

创建一个新变量,可以对传入的参数进行再加工,常用于模糊查询的 LIKE 拼接

C

绑定数据库连接池的配置参数

D

将 SQL 查询结果绑定到 Java 对象的特定属性

6
判断题

在 MyBatis 的 <if> 标签中,test 属性可以使用 OGNL 表达式进行条件判断,判断字符串相等时需要使用单引号包裹字符串常量,例如 test="name != null and name == 'admin'"

A

B

7
多选题

以下关于 MyBatis 中 <if> 标签使用的描述,哪些是正确的?

A

<if> 标签可以嵌套使用,实现复杂的条件组合逻辑

B

<if> 标签的 test 属性中可以使用 &&|| 进行逻辑运算

C

判断字符串参数不为空字符串时,应同时判断 != null!= '',以避免传入空字符串导致 SQL 语法错误

D

<if> 标签只能用在 <select> 语句中,不能用在 <update><delete>

8
单选题

在 MyBatis 的动态 SQL 中,<choose><when><otherwise> 标签组合的功能最接近 Java 中的哪种语法结构?

A

if-else if-else

B

switch-case-default

C

try-catch-finally

D

for-each 循环

9
判断题

在 MyBatis 中,<where> 标签只有在其内部至少有一个 <if> 或其他动态 SQL 标签返回了内容时,才会插入 WHERE 关键字。如果所有条件都不满足,则不会生成 WHERE 子句。

A

B

10
多选题

在 MyBatis 中,关于 <set> 标签在 UPDATE 语句中的使用,以下说法正确的有哪些?

A

<set> 标签会自动在字段前添加 SET 关键字

B

<set> 标签会自动去除字段列表末尾多余的逗号

C

如果 <set> 标签内部没有任何条件满足,生成的 SQL 仍然包含 SET 关键字

D

<set> 标签等价于 <trim prefix="SET" suffixOverrides=",">

11
单选题

在 MyBatis 的 <foreach> 标签中,当传入的参数是 List 类型时,collection 属性应该设置为什么值?

A

list

B

collection

C

array

D

参数变量名

12
填空题

在 MyBatis 中,使用 <foreach> 实现批量插入用户数据。假设传入参数为 List<User> 类型,使用 @Param("users") 注解指定参数名。请补全以下 SQL 模板中的空缺部分:

XML
<insert id="batchInsert">
    INSERT INTO user (name, email, age)
    VALUES
    <foreach ______="users" item="user" ______="," open="(" close=")" separator=",">
        #{________}, #{user.email}, #{user.age}
    </foreach>
</insert>
13
简答题

请编写一个 MyBatis Mapper XML 方法 searchUsers,要求实现以下功能:

  1. 支持多条件动态查询:用户名(模糊匹配)、邮箱、状态、角色列表
  2. 用户名使用 <bind> 标签进行模糊查询拼接
  3. 角色列表使用 <foreach> 实现 IN 查询
  4. 使用 <where> 标签智能处理 WHERE 子句
  5. 结果按创建时间倒序排列

请写出完整的 XML 配置。

14
多选题

以下关于 MyBatis 动态 SQL 的描述,哪些是错误的?

A

<choose> 标签中可以包含多个 <when>,所有满足条件的 <when> 都会执行

B

<trim> 标签的 prefixOverrides 属性用于在内容开头添加指定的前缀字符串

C

<foreach> 标签遍历 Map 类型参数时,index 表示键(key),item 表示值(value)

D

<sql> 片段中不能使用 <if><where> 等动态 SQL 标签

← 上一个专题 与 Spring 集成专题
下一个专题 → 参数传递与结果映射专题

📝 发现内容有误?点击此处直接编辑

想查看更多习题和详细解析?
小程序提供完整的题库和详细解析

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库