赞
踩
动态 SQL,通过 MyBatis 提供的各种标签对条件作出判断以实现动态拼接SQL 语句。这里的条件判断使用的表达式为 OGNL 表达式。常用的动态 SQL标签有<if>、<where>、<foreach>、<sql>等。
MyBatis 的动态 SQL 语句,与 JSTL 中的语句非常相似。
动态 SQL,主要用于解决查询条件不确定的情况:在程序运行期间,根据用户提交的查询条件进行查询。提交的查询条件不同,执行的 SQL 语句不同。若将每种可能的情况均逐一列出,对所有条件进行排列组合,将会出现大量的SQL 语句。此时,可使用动态 SQL 来解决这样的问题。
使用动态SQL时,dao接口中方法的形参要使用Java对象。
- <if test="boolean判断结果"> <!--要么为true、要么为false-->
- sql语句的部分
- </if>
- <!-- 对于该标签的执行,当 test 的值为 true 时,会将其包含的 SQL 片段断拼接到其所在的 SQL 语句中。 -->
- package com.bjpowernode.dao;
-
-
- import com.bjpowernode.entity.Student;
-
- import java.util.List;
-
- /**
- *
- */
- public interface StudentDao {
-
- //if
- List<Student> selectIf(Student student);
-
- }
- <!-- if
- test: 使用对象的属性值作为条件
- -->
- <select id="selectIf" resultType="com.bjpowernode.entity.Student">
- select *
- from student
- where id=-1
- <if test="name!=null and name!=''">
- or name=#{name}
- </if>
-
- <if test="age>0">
- or age=#{age}
- </if>
- </select>
- <!--
- <if/>标签的中存在一个比较麻烦的地方:需要在 where 后手工添加 id=-1的子句。
- 因为,若 where 后的所有<if/>条件均为 false,而 where 后若又没有 id=-1 子句,则 SQL 中就会只剩下一个空的 where,SQL 出错。
- 所以,在where 后,需要添加子句 id=-1,以防止这种情况的发生。但当数据量很大时,会严重影响查询效率。
- -->
- @Test
- public void testSelectIf() {
- SqlSession session = MyBatisUtil.getSqlSession();
- StudentDao studentDao=session.getMapper(StudentDao.class);
- Student student=new Student();
- student.setName("张起灵");
- student.setAge(20);
- List<Student> students=studentDao.selectIf(student);
- students.forEach( stu -> System.out.println("stu === " + stu) );
- session.close();
- }
根据上面三个代码块,将其中的内容转为等价的 sql 语句如下:
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/255746
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。