视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Mybatis的whereforeachset等标签详解
2025-09-28 00:58:52 责编:小OO
文档
sql语句where条件中,需要一些安全判断,例如按性别检索,如果传入的参数是空的,此时查询出的结果很可能是空的,也许我们需要参数为空 时,是查出全部的信息。这是我们可以使用动态sql,增加一个判断,当参数不符合要求的时候,我们可以不去判断此查询条件。

 下文均采用mysql语法和函数(例如字符串链接函数CONCAT

3.1 if标签    

 一个很普通的查询:

Xml代码  

   

   

但是此时如果studentName是null或空字符串,此语句很可能报错或查询结果为空。此时我们使用if动态sql语句先进行判断,如果值为null或等于空字符串,我们就不进行此条件的判断。

修改为:

Xml代码  

   

   

 此时,当studentName的值为null或’’的时候,我们并不进行where条件的判断,所以当studentName值为null或’’值,不附带这个条件,所以查询结果是全部。

 由于参数是Java的实体类,所以我们可以把所有条件都附加上,使用时比较灵活, new一个这样的实体类,我们需要那个条件,只需要附上相应的值就会where这个条件,相反不去赋值就可以不在where中判断。

   代码中的where标签,请参考3.2.1.

Xml代码  

   

   

查询,姓名中有‘李’,男,生日在‘1985-05-28’,班级在‘20000002’的学生。

Java代码  

StudentEntity entity = new StudentEntity();    

entity.setStudentName("李");    

entity.setStudentSex("男");    

entity.setStudentBirthday(StringUtil.parse("1985-05-28"));    

entity.setClassEntity(classMapper.getClassByID("20000002"));    

List studentList = studentMapper.getStudentListWhereEntity(entity);    

for( StudentEntity entityTemp : studentList){    

    System.out.println(entityTemp.toString());    

}   

3.2 where、set、trim标签

3.2.1 where

当if标签较多时,这样的组合可能会导致错误。例如,like姓名,等于指定性别等:

Xml代码  

   

   

 如果上面例子,参数studentName为null或’’,则或导致此sql组合成“WHERE AND”之类的关键字多余的错误SQL。

 这时我们可以使用where动态语句来解决。这个“where”标签会知道如果它包含的标签中有返回值的话,它就插入一个‘where’。此外,如果标签返回的内容是以AND 或OR 开头的,则它会剔除掉。

 上面例子修改为:

Xml代码  

   

   

3.2.2 set

当在update语句中使用if标签时,如果前面的if没有执行,则或导致逗号多余错误。使用set标签可以将动态的配置SET 关键字,和剔除追加到条件末尾的任何不相关的逗号。

没有使用if标签时,如果有一个参数为null,都会导致错误,如下示例:

Xml代码  

   

   

    UPDATE STUDENT_TBL    

       SET STUDENT_TBL.STUDENT_NAME = #{studentName},    

           STUDENT_TBL.STUDENT_SEX = #{studentSex},    

           STUDENT_TBL.STUDENT_BIRTHDAY = #{studentBirthday},    

           STUDENT_TBL.CLASS_ID = #{classEntity.classID}    

     WHERE STUDENT_TBL.STUDENT_ID = #{studentID};    

   

 使用set+if标签修改后,如果某项为null则不进行更新,而是保持数据库原值。如下示例:

Xml代码  

   

   

    UPDATE STUDENT_TBL    

       

           

            STUDENT_TBL.STUDENT_NAME = #{studentName},    

           

           

            STUDENT_TBL.STUDENT_SEX = #{studentSex},    

           

           

            STUDENT_TBL.STUDENT_BIRTHDAY = #{studentBirthday},    

           

           

            STUDENT_TBL.CLASS_ID = #{classEntity.classID}    

           

       

    WHERE STUDENT_TBL.STUDENT_ID = #{studentID};    

   

3.2.3 trim

 trim是更灵活的去处多余关键字的标签,他可以实践where和set的效果。

 where例子的等效trim语句:

Xml代码  

   

   

set例子的等效trim语句:

Xml代码  

   

   

    UPDATE STUDENT_TBL    

               

            STUDENT_TBL.STUDENT_NAME = #{studentName},    

           

           

            STUDENT_TBL.STUDENT_SEX = #{studentSex},    

           

           

            STUDENT_TBL.STUDENT_BIRTHDAY = #{studentBirthday},    

           

           

            STUDENT_TBL.CLASS_ID = #{classEntity.classID}    

           

       

    WHERE STUDENT_TBL.STUDENT_ID = #{studentID};    

   

3.3 choose (when, otherwise)

         有时候我们并不想应用所有的条件,而只是想从多个选项中选择一个。MyBatis提供了choose 元素,按顺序判断when中的条件出否成立,如果有一个成立,则choose结束。当choose中所有when的条件都不满则时,则执行 otherwise中的sql。类似于Java 的switch 语句,choose为switch,when为case,otherwise则为default。

         if是与(and)的关系,而choose是或(or)的关系。

         例如下面例子,同样把所有可以的条件都写上,方面使用。选择条件顺序,when标签的从上到下的书写顺序:

Xml代码  

   

   

3.4 foreach

对于动态SQL 非常必须的,主是要迭代一个集合,通常是用于IN 条件。

List 实例将使用“list”做为键,数组实例以“array” 做为键。

 

 3.4.1参数为list实例的写法:

SQL写法:

Xml代码  

   

接口的方法声明:

Java代码  

public List getStudentListByClassIDs(List classList);   

public List getStudentListByClassIDs(List classList); 测试代码,查询学生中,在20000002、20000003这两个班级的学生:

Java代码  

List classList = new ArrayList();    

classList.add("20000002");    

classList.add("20000003");    

   

List studentList = studentMapper.getStudentListByClassIDs(classList);    

for( StudentEntity entityTemp : studentList){    

    System.out.println(entityTemp.toString());    

}   

List classList = new ArrayList();

classList.add("20000002");

classList.add("20000003");

List studentList = studentMapper.getStudentListByClassIDs(classList);

for( StudentEntity entityTemp : studentList){

 System.out.println(entityTemp.toString());

}

 3.4.2参数为Array实例的写法:

SQL语句:

Xml代码  

   

 接口的方法声明:

Java代码  

public List getStudentListByClassIDs(String[] ids);   

public List getStudentListByClassIDs(String[] ids);测试代码,查询学生中,在20000002、20000003这两个班级的学生:

Java代码  

String[] ids = new String[2];    

ids[0] = "20000002";    

ids[1] = "20000003";    

List studentList = studentMapper.getStudentListByClassIDs(ids);    

for( StudentEntity entityTemp : studentList){    

    System.out.println(entityTemp.toString());    

}下载本文

显示全文
专题