-
ssm-mybatis进阶之动态sql
动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦, 例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。MyBatis 动态 SQL 主要通过在mapper映射文件中,使用类似于JSTL语言进行编写。
动态SQL元素
MyBatis 3 之后,元素已经大大精简,主要有以下几种:- if
- choose (when, otherwise)
- trim (where, set)
- foreach
if
使用动态 SQL 最常见情景是根据条件包含 where 子句的一部分,下面举例说明:
List<Student> getStudents(@Param("sex") String sex, @Param("pageIndex") int pageIndex, @Param("pageSize") int pageSize);

@Test
public void getStudents() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
//不筛选性别,也不分页
List<Student> students = mapper.getStudents("", 0, 0);
Object jsonStr = JSON.toJSON(students);
System.out.println(jsonStr);
sqlSession.close();
}

List<Student> students = mapper.getStudents("男", 0, 2);

- 编写dao:
- 编写mapper映射文件:
- 编写测试方法验证: 不筛选性别,也不分页,结果如下:修改测试方法,筛选性比也分页,验证如下:
语法:<if test="条件表达式">拼接sql语句</if>
choose (when, otherwise)
有时候,我们不想使用所有的条件,而只是想从多个条件中选择一个使用,Mybatis 又没提供 else 。 针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。
List<Student> getStudents2(@Param("sex") String sex, @Param("name") String name);

<choose>
<when test="条件表达式1">
拼接SQL1
</when>
<when test="条件表达式2">
拼接SQL2
</when>
...
<otherwise>
拼接默认SQL
</otherwise>
</choose>
@Test
public void getStudents2() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
//只执行性别筛选
List<Student> students = mapper.getStudents2("男", "");
Object jsonStr = JSON.toJSON(students);
System.out.println("[1]:" + jsonStr);
//只执行姓名筛选
students = mapper.getStudents2("", "张");
jsonStr = JSON.toJSON(students);
System.out.println("[2]:" + jsonStr);
//参数都传递,但只会按顺寻执行第一个筛选
students = mapper.getStudents2("女", "张");
jsonStr = JSON.toJSON(students);
System.out.println("[3]:" + jsonStr);
//一个都不传,默认返回第一个
students = mapper.getStudents2("", "");
jsonStr = JSON.toJSON(students);
System.out.println("[4]:" + jsonStr);
sqlSession.close();
}

- 编写dao:
- 编写mapper映射文件:
- 编写测试方法验证:
重点:要注意like语句的拼接方式
语法:
trim (where, set)
trim主要为了解决多条语句拼接时,冗余关键字、符号问题,MyBatis 已经提取了常用的去冗元素:<where>,<set>。 其中<where>标签主要解决拼接筛选过程中去除多余的AND和OR,<set>则解决赋值过程中多余的逗号问题。 下面就用<where>来举例说明(<set>类似)
List<Student> getStudents3(@Param("sex") String sex, @Param("name") String name);

@Test
public void getStudents3() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
//只执行性别筛选
List<Student> students = mapper.getStudents3("男", "");
Object jsonStr = JSON.toJSON(students);
System.out.println("[1]:" + jsonStr);
//只执行姓名筛选
students = mapper.getStudents3("", "张");
jsonStr = JSON.toJSON(students);
System.out.println("[2]:" + jsonStr);
//参数都传递,都会筛选
students = mapper.getStudents3("女", "李");
jsonStr = JSON.toJSON(students);
System.out.println("[3]:" + jsonStr);
//一个都不传,返回所有
students = mapper.getStudents3("", "");
jsonStr = JSON.toJSON(students);
System.out.println("[4]:" + jsonStr);
sqlSession.close();
}

- 编写dao:
- 编写mapper映射文件:
- 编写测试方法验证:
foreach
动态 SQL 的另一个常见使用场景是对集合进行遍历(尤其是在构建 IN 条件语句的时候)。
List<Student> getStudentsForeach(@Param("sex") String sex, @Param("ids") int[] ids);

@Test
public void getStudentsForeach() {
SqlSession sqlSession = MybatisUtils.getSqlSession();
StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
int[] ids = new int[]{1, 2, 3};
List<Student> students = mapper.getStudentsForeach("男", ids);
Object jsonStr = JSON.toJSON(students);
System.out.println(jsonStr);
sqlSession.close();
}

- 编写dao:
- 编写mapper映射文件:
- 编写测试方法验证:
出处:https://www.cnblogs.com/zhoux123/p/15184765.html
最新更新
求1000阶乘的结果末尾有多少个0
详解MyBatis延迟加载是如何实现的
IDEA 控制台中文乱码4种解决方案
SpringBoot中版本兼容性处理的实现示例
Spring的IOC解决程序耦合的实现
详解Spring多数据源如何切换
Java报错:UnsupportedOperationException in Col
使用Spring Batch实现批处理任务的详细教程
java中怎么将多个音频文件拼接合成一个
SpringBoot整合ES多个精确值查询 terms功能实
数据库审计与智能监控:从日志分析到异
SQL Server 中的数据类型隐式转换问题
SQL Server中T-SQL 数据类型转换详解
sqlserver 数据类型转换小实验
SQL Server数据类型转换方法
SQL Server 2017无法连接到服务器的问题解决
SQLServer地址搜索性能优化
Sql Server查询性能优化之不可小觑的书签查
SQL Server数据库的高性能优化经验总结
SQL SERVER性能优化综述(很好的总结,不要错
uniapp/H5 获取手机桌面壁纸 (静态壁纸)
[前端] DNS解析与优化
为什么在js中需要添加addEventListener()?
JS模块化系统
js通过Object.defineProperty() 定义和控制对象
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比