动态sql之各种标签的使用以及详细配置

    技术2022-07-10  109

    动态sql

    在一个复杂得业务逻辑的背景下,比如一个电商网站

    ​ 在一个手机表中,可能需要按照品牌,型号,颜色,内存等多个属性对手机表进行查找,如果对一个属性写一个查询方法,那么代码将会非常复杂,所以我们思考:有没有一种可能只写一种方法就可以查询出来业务。那么他来了-----动态SQL

    一、Where和if标签

    需求:查询user表的数据。多个条件无脑组合

    第一步:定义接口,接口中添加查询方法

    **注意:**定义方法时要考虑返回值与输入参数

    第二步:映射文件中添加方法实现配置

    使用if标签对条件做出判断 <if test="id!=null"> id=#{id} </if> If(id!=null){ id=#{id}}

    上述解决方案中存在where 1=1的无意义sql,使用Where标签解决1=1的问题

    注意:if标签做条件判断,test属性中添加判断添加,多条件时使用and拼接where标签帮我们解决了1=1问题的同时,还可以帮助我们去掉第一个and

    二、Set标签

    需求:修改person信息,传什么改什么

    第一步:接口中添加修改方法

    第二步:映射文件中添加实现

    **注意:**set标签可以帮助我们解决最后一个逗号的问题

    三、trim标签

    3.1重写set标签

    **prefix:**前缀,在执行trim标签内语句时,在前面拼接的值(set)

    **SuffixOverrides:**忽略后缀,在执行trim标签内语句时,在最后忽略的值(,)

    3.2重写Where标签

    PrefixOverrides:忽略前缀(and/or)

    Suffix:后缀(加上where)

    四、choose标签

    需求:如果有用户的id,使用id查询,如果没有id,看是否有那么,按name模糊查询,如果都没有,按照地址模糊查,如果地址没有,查询全部

    第一步:定义接口方法

    第二步:映射文件中添加方法实现

    注意:

    Choose:表示单选,标签下的条件只选择一个执行 Choose相当于switch语句 When标签相当于case语句 Otherwise标签相当于default语句

    五、foreach标签

    foreach标签主要是用来做数据的循环遍历

    例如:select * from person where id in(4,5,6)在这样的语句中,需要根据一个集合或者一个数组传入的参数进行查询。

    Case 1:使用集合传入用户需要查询的值

    第一步:接口中定义方法 ​ 使用集合接收传过来的id串。

    第二步:映射文件中添加方法的实现配置 ​ 注意:

    ​ Foreach标签:用于遍历集合/数组

    ​ Collection属性:代表要遍历的集合元素,如果遍历的是集合,属性值可以是collection,也可以是list

    ​ Open属性:代表语句的开始部分(前缀)

    ​ Close属性:代表结束部分(后缀)

    ​ Item属性:代表遍历集合的每个元素,生成的变量名,取名要做到见名知意。

    ​ Separator属性:代表分隔符

    第三步:测试代码

    Case 2:使用数组传入用户查询需要的id

    第一步:接口方法 第二步:映射文件 注意:使用foreach遍历 数组时,collection属性值为array

    case 3:pojo对象集合属性传入用户需要查询的id

    第一步:创建一个查询对象QueryVO(补充查询条件)

    第二步:定义接口方法

    第三步:添加映射

    ​ 注意:

    ​ 当foreach遍历的是pojo的集合属性或者数组属性时,collection的属性值为属性的名称

    第四步:测试代码

    第三步:添加映射**

    [外链图片转存中…(img-xUKhckcg-1593526500513)]

    ​ 注意:

    ​ 当foreach遍历的是pojo的集合属性或者数组属性时,collection的属性值为属性的名称

    第四步:测试代码

    Processed: 0.009, SQL: 9