MyBatis 令人喜欢的一大特性就是动态 SQL。 在使用 JDBC 的过程中, 根据条件进行 SQL 的拼接是很麻烦且很容易出错的。 MyBatis 动态 SQL 的出现, 解决了这个麻烦。
MyBatis通过 OGNL 来进行动态 SQL 的使用的。
目前, 动态 SQL 支持以下几种标签
| 元素 | 作用 | 备注 |
|---|---|---|
| if | 判断语句 | 单条件分支 |
| choose(when、otherwise) | 相当于 Java 中的 if else | 多条件分支 |
| trim(where、set) | 辅助元素 | 用于处理 SQL 拼接问题 |
| foreach | 循环语句 | 批量插入, 更新, 查询时经常用到 |
| bind | 创建一个变量, 并绑定到上下文中 | 用于兼容不同的数据库, 防止 SQL 注入等 |
1 数据准备
为了后面的演示, 创建了一个 Maven 项目 mybatis-dynamic, 创建了对应的数据库和表
DROP TABLE IF EXISTS `student`; CREATE TABLE `student` ( `student_id` int(10) unsigned NOT NULL AUTO_INCREMENT COMMENT '编号', `name` varchar(20) DEFAULT NULL COMMENT '姓名', `phone` varchar(20) DEFAULT NULL COMMENT '电话', `email` varchar(50) DEFAULT NULL COMMENT '邮箱', `sex` tinyint(4) DEFAULT NULL COMMENT '性别', `locked` tinyint(4) DEFAULT NULL COMMENT '状态(0:正常,1:锁定)', `gmt_created` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '存入数据库的时间', `gmt_modified` datetime DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改的时间', `delete` int(11) DEFAULT NULL, PRIMARY KEY (`student_id`) ) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='学生表';对应的项目结构

2 if 标签
if 标签是我们最常使用的。 在查询、删除、更新的时候很可能会使用到。 必须结合 test 属性联合使用。
2.1 在 WHERE 条件中使用 if 标签
这是常见的一种现象, 我们在进行按条件查询的时候, 可能会有多种情况。
2.1.1 查询条件
根据输入的学生信息进行条件检索
- 当只输入用户名时, 使用用户名进行模糊检索;
- 当只输入性别时, 使用性别进行完全匹配
- 当用户名和性别都存在时, 用这两个条件进行查询匹配查询
