142. Spring Boot MyBatis升级篇-注解-动态SQL(if test)-方案一:<script>

 

【视频 & 交流平台】

à SpringBoot视频

http://study.163.com/course/introduction.htm?courseId=1004329008&utm_campaign=commission&utm_source=400000000155061&utm_medium=share

à SpringCloud视频

http://study.163.com/course/introduction.htm?courseId=1004638001&utm_campaign=commission&utm_source=400000000155061&utm_medium=share

à Spring Boot源码

https://gitee.com/happyangellxq520/spring-boot

à Spring Boot交流平台

http://412887952-qq-com.iteye.com/blog/2321532

 

 

【本篇博客,有配套视频,视频地址:《Spring Boot MyBatis升级篇-注解-动态SQL(if test)-方案一script,公众号中点击下面的阅读原文,视频中讲解的更详细】

需求缘起:

网友1:这样如果是不定条件查询怎么解决呢?也就是xml中可以用if标签,注解怎么搞呢?

网友2:这动态sql用注解的方式不太方便吧!博主有好方法,请推出参照一下,一直没用注解的原因,就是动态sql没有好的方式,包括when foreach!针对简单的查询还是可以的!

       看到网友这么积极的提问,博主甚是很欣慰,有问题,就研究破破来着。

 

需求场景:

       在一个表中有id,name,email我们查询的时候,希望name不为null的时候,作为查询条件,如果email不为null的时候,作为查询条件。

 

实现过程:

1name,email and 关系

       如果nameemail只是并且的关系的话,那么我们会这么写:


@Select("Select * from Demo where name =#{name}  and email=#{email} ")

public List<Demo> select3(Demo demo);

       其中Demo类如下:

public class Demo {
    private int id;
    private String name;
    private String email;
    private Date updateTime;
    private SexEnum sexEnum;
    //省略getter and setter…
}

 

       表中的数据:

2     王五       [email protected]
3     王五       [email protected]
4     王五2    [email protected]
5     王五6    [email protected]

 

       这时候访问:

http://127.0.0.1:8080/select3?name=王五&[email protected] 能返回数据。

但是现在我们的需求不是这样的了。

 

2if name !=null ,if email != null

       现在我们希望的是如果name不为null的话,那么就当做条件,否则就不要当做条件;如果email不为null,那么就当做条件,否则不当做条件。

       那么方案一:so eay,只需要在前面加入<script>就可以使用<if test>标签了,代码如下:

@Select("<script> " +
            "SELECT * " +
            "from Demo " +
            " <where> " +
            "  1=1" +
            " <if test=\"name != null\">and name=#{name}</if> " +
            " <if test=\"email != null\"> and email=#{email}</if> " +
            " </where> " +
            " </script> ")
    public List<Demo> select4(Demo demo);

 

访问1http://127.0.0.1:8080/select4会返回全部数据,动态SQL是:

SELECT * from Demo WHERE 1=1

 

访问2http://127.0.0.1:8080/select4?name=王五 会返回name=王五的数据,动态SQL是:

SELECT * from Demo WHERE 1=1 and name=?

 

访问3http://127.0.0.1:8080/select4?name=王五&[email protected]会返回name=王五并且[email protected]的数据,动态SQL是:

SELECT * from Demo WHERE 1=1 and name=? and email=?

  

       是不是很酷,完美解决问题。但是后头看代码这样的代码可读性差,修改的时候也很麻烦,所以呢,是否有更好的方案呢?下篇博客揭晓,广告时刻,大家不要离开。

 视频&交流平台

à SpringBoot网易云课堂视频

http://study.163.com/course/introduction.htm?courseId=1004329008

à Spring Boot交流平台

http://412887952-qq-com.iteye.com/blog/2321532

 

 

猜你喜欢

转载自412887952-qq-com.iteye.com/blog/2391906