当前位置:   article > 正文

MyBatis——动态SQL的四个常用标签(<if>、<where>、<foreach>、<sql>)_mybatis

mybatis

文章目录:

1.什么是动态SQL? 

2.MyBatis中的动态SQL 

2.1 动态SQL——if标签

2.1.1 语法格式 

2.1.2 应用举例

2.2 动态SQL——where标签

2.2.1 语法格式 

2.2.2 应用举例

2.3 动态SQL——foreach标签

2.3.1 语法格式

2.3.2 应用举例1(简单类型)

2.3.2 应用举例2(对象类型)

2.4 动态SQL——sql标签

2.4.1 语法格式 

2.4.2 应用举例


1.什么是动态SQL? 

动态 SQL,通过 MyBatis 提供的各种标签对条件作出判断以实现动态拼接SQL 语句。这里的条件判断使用的表达式为 OGNL 表达式。常用的动态 SQL标签有<if>、<where>、<foreach>、<sql>等。

MyBatis 的动态 SQL 语句,与 JSTL 中的语句非常相似。

动态 SQL,主要用于解决查询条件不确定的情况:在程序运行期间,根据用户提交的查询条件进行查询。提交的查询条件不同,执行的 SQL 语句不同。若将每种可能的情况均逐一列出,对所有条件进行排列组合,将会出现大量的SQL 语句。此时,可使用动态 SQL 来解决这样的问题。

使用动态SQL时,dao接口中方法的形参要使用Java对象。


2.MyBatis中的动态SQL 

2.1 动态SQL——if标签

2.1.1 语法格式 

  1. <if test="boolean判断结果"> <!--要么为true、要么为false-->
  2. sql语句的部分
  3. </if>
  4. <!-- 对于该标签的执行,当 test 的值为 true 时,会将其包含的 SQL 片段断拼接到其所在的 SQL 语句中。 -->

2.1.2 应用举例

  1. package com.bjpowernode.dao;
  2. import com.bjpowernode.entity.Student;
  3. import java.util.List;
  4. /**
  5. *
  6. */
  7. public interface StudentDao {
  8. //if
  9. List<Student> selectIf(Student student);
  10. }
  1. <!-- if
  2. test: 使用对象的属性值作为条件
  3. -->
  4. <select id="selectIf" resultType="com.bjpowernode.entity.Student">
  5. select *
  6. from student
  7. where id=-1
  8. <if test="name!=null and name!=''">
  9. or name=#{name}
  10. </if>
  11. <if test="age>0">
  12. or age=#{age}
  13. </if>
  14. </select>
  15. <!--
  16. <if/>标签的中存在一个比较麻烦的地方:需要在 where 后手工添加 id=-1的子句。
  17. 因为,若 where 后的所有<if/>条件均为 false,而 where 后若又没有 id=-1 子句,则 SQL 中就会只剩下一个空的 where,SQL 出错。
  18. 所以,在where 后,需要添加子句 id=-1,以防止这种情况的发生。但当数据量很大时,会严重影响查询效率。
  19. -->
  1. @Test
  2. public void testSelectIf() {
  3. SqlSession session = MyBatisUtil.getSqlSession();
  4. StudentDao studentDao=session.getMapper(StudentDao.class);
  5. Student student=new Student();
  6. student.setName("张起灵");
  7. student.setAge(20);
  8. List<Student> students=studentDao.selectIf(student);
  9. students.forEach( stu -> System.out.println("stu === " + stu) );
  10. session.close();
  11. }

根据上面三个代码块,将其中的内容转为等价的 sql 语句如下:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/255746
推荐阅读
相关标签