热门课程

免费试听

上课方式

开班时间

当前位置: 首页 -   文章 -   新闻动态 -   正文

MyBatis常用到的动态sql

知了堂姐
2024-07-09 11:12:24
0

简介

相信大家没用Mybatis之前,都碰到过各种条件判断拼接SQL、需要去掉多余的逗号等痛苦,Mybatis中的动态SQL能很好的解决上面说的情况,可以很灵活的组装SQL语句,从而提高开发效率。

1、SQL的动态拼接有哪些

if标签

where标签

choose when otherwise标签

set标签

trim标签

bind标签

sql和include标签 foreach标签

2、if标签:

test中写判断条件 参数直接paramN或者别名 特点: 只要成立就拼接在Sql语句中,都成立就全部都拼接 注意: where子句中加上1=1来规避and的风险


条件模糊查以及查询时间段内数据


3、where标签:

特点:

会自动地给Sql语句添加where关键字,并将第一个and去除。


4、choose when otherwise标签

特点:

条件只要有一个成立,其他的就不会再判断了。

如果没有成立的条件则默认执行otherwise中的内容


5、set标签:

产生一个set关键字,自动去除最后一个逗号。

注意: ​

在判断条件中最后保持有一个永远成立的条件。避免sql错误。


update accountTable 


aname=#{aname},


money=#{money},


ano=#{ano},


where  ano=#{ano}

6、trim标签:

prefix:在trim的内容前添加指定的内容 ​

prefixOverrides在trim的内容前去除指定的内容 ​

suffix:在trim的内容后添加指定的内容 ​

suffixOverrides:在trim的内容后去除指定的内容 ​

注意: ​

先去除后添加 ​

添加内容会默认添加一个空格。

    
update account     
    
    
ano=#{ano},    
    
    
aname=#{aname},    
    
   
money=#{money},    
     
    
where ano=#{ano} 

7、bind标签:

name:参数名 ​

value:表达式,注意字符串拼接按照变量方式进行拼接 ​

例如:

 

给参数重新赋值


      
    update account 
    
    
    ano=#{ano},
    
    
    aname=#{aname},
    
    
    money=#{money},
    
     
    where ano=#{ano}

8、sql和include标签:

sql标签:在外部声明公用SQL语句 ​

id ​

include标签:引入声明的公共SQL语句 ​

refid: ​

优点:便于SQL的整体修改 ​

缺点:难于阅读

 
   
    ano,aname,apwd,money
   

9、foreach标签:

构造IN条件语句时需要对集合进行遍历,这时候可以使用foreach元素。foreach会去掉多余","。若集合为空,则不会执行foreach元素中的操作,但此时会多出"in"关键字,报错。

item:集合中的元素

index:元素所在集合的下标,迭代map时,index是键

collection:集合的类型,可选值list,array,除此之外还可以是@Param("name")、Map中的key、类的成员变量 open、

close:在首、尾拼接的字符

separator:每个元素间的分隔符

注: foreach标签支持List、Set、Map、Array等的遍历

迭代数组或者List、Set集合时,index是迭代次数,item是本次迭代获取的元素;

迭代Map(或Map.Entry对象的集合)时,index是键,item是值

collection属性介绍

传入单参数且是List时,collection="list"

传入单参数且是Array时,collection="array"

传入单参数且是Set时,需使用@Param注解,同下

传入单参数且使用@Param("name")时,collection="name",即和@Param注解的value属性值相同,此时list、array无效

传入多参数且封装成Map时,如map.put("ids", Arrays.asList(1, 2)),此时collection="ids"

传入多参数且封装成类时,如User类中有成员变量List roleIds,此时collection="roleIds";若User类中有成员变量Role role,Role类中有成员变量prilIds,此时collection="role.prilIds"

 
   
    insert into log values 
    
    (#{log.outno},#{log.inno},#{log.money})
      
   

10、示例

批量修改的动态sql

controller层

 /**
     * 批量修改
     */
    @PutMapping("/aaa")
    @ApiOperation(value = "下架")
    public R aaa(@RequestBody Asa asa) {
        this.goodTestService.updateState(asa.getIds(),asa.getMsg());
        return R.data("cg");
    }

service

package com.troy.testa.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.service.IService;
import com.troy.testa.dto.GoodTestDTO;
import com.troy.testa.entity.GoodTest;
import org.springframework.data.domain.Pageable;

import java.util.List;

/**
 * (GoodTest)表服务接口
 * @author zhangh
 * @date 2021-03-21 15:31:34
 */
public interface GoodTestService extends IService {


    void updateState(String[] ids,String msg);
}

serviceImp

 @Override
    public void updateState(String[] ids,String msg) {

        baseMapper.updateState(ids,msg);
    }

dao

package com.troy.testa.dao;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;

import com.troy.testa.dto.GoodTestDTO;
import com.troy.testa.entity.GoodTest;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import com.baomidou.mybatisplus.core.metadata.IPage;
import java.util.List;

/**
 * (GoodTest)表数据库访问层
 * @author zhangh
 * @date 2021-03-21 15:31:34
 */
@Mapper
public interface GoodTestDao extends BaseMapper {


    void updateState(@Param("ids") String[] ids,@Param("msg") String msg);
}

xml





    
        
            UPDATE good_test
            SET good_state = 1,good_name=#{msg}
            WHERE id = #{item}
        
    

postman测试

表已批量修改

成功!

虽然可以用程序循环实现,但是用了动态sql少去了不少工作量。

总结:

发中,经常需要根据不同的条件动态拼接SQL,并且还确保空格、列名最后的逗号、多余的AND、OR条件等。在MyBatis中处理这种情况是比较方便容易的。

大家都在看

0基础怎么转行做前端?前端怎么学?

2024-07-09 浏览次数:0

前端开发:node.js入门

2024-07-09 浏览次数:0

前端开发包括哪些内容?前端开发要怎么做

2024-07-09 浏览次数:0

0基础转行前端怎么学习?小白怎么学前端开发?

2024-07-09 浏览次数:0

25岁计算机网教专升本,学习5个月,入职安全运维...

2024-07-09 浏览次数:0

知了汇智项目总监探讨鸿蒙生态与人才培育新机遇

2024-07-09 浏览次数:0
最新资讯
IDEA+Mybatis-ge... MyBatis Generator简称MBG,是MyBatis 官方出的代码生成器。MBG能够自动生...
MyBatis常用到的动态sq... 相信大家没用Mybatis之前,都碰到过各种条件判断拼接SQL、需要去掉多余的逗号等痛苦,Mybat...
MybatisPlus—kot... Kotlin是一个基于JVM的新的编程语言,2010年由IntelliJ IDEA所在的JetBra...
MybatisPlus介绍以及... MybatisPlus在Mybatis的基础上只做增强,不做改变,就像是魂斗罗中的红人和蓝人一样。 ...
Mybatis缓存机制详解 1.存在内存中的临时数据 2.将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(...
Mybatis 添加日志功能 对于现在的应用程序来说,日志的重要性是不言而喻的。很难想象没有任何日志记录功能的应用程序运行在生产环...
IDEA+Mybatis-ge... MyBatis Generator简称MBG,是MyBatis 官方出的代码生成器。MBG能够自动生...