mybatis 动态sql及参数传递

mybatis 动态sql及参数传递mybatis 动态 sql 及参数传递

目录

使用场景

动态标签

if标签

where标签

choose、when、otherwise 标签

set标签

trim标签

forEach标签

参数传递

单个参数传递

多个参数传递

传入单个实体(JavaBean/Map)

传入多个实体

传入集合

批量新增


使用场景

在实际开发过程中,我们往往需要编写复杂的SQL语句,拼接稍有不注意就会导致错误,Mybatis给开发者提供了动态SQL,大大降低了拼接SQL导致的错误。

动态标签

mybatis 动态sql及参数传递

if标签

if标签通常用那个胡where语句,update语句,insert语句中,通过判断参数值来决定是否使用某个查询条件,判断是否更新某一个字段或插入某个字段

 
   
     #{orderNum,jdbcType=VARCHAR}, 
   

where标签

where标签通常与if标签配合使用,当if标签数量很多时可能会导致组合错误

 

当id=null 会 出现如下的sql拼写错误,

mybatis 动态sql及参数传递

除了用where 1=1 and xxx 这样的方式外还可以使用

标签,

标签能够将
开头(结尾的不行)多余的and/or去掉,同时

标签还能根据包含内容是否为空,决定where关键字的显示或隐藏。


正例:

mybatis 动态sql及参数传递

反例:

mybatis 动态sql及参数传递

choose、when、otherwise 标签

这三个标签需要组合在一起使用,类似于 Java 中的 switch、case、default。只有一个条件生效,也就是只执行满足的条件 when,没有满足的条件就执行 otherwise,表示默认条件。

mybatis 动态sql及参数传递

set标签

采用update语句时,如果同时使用了

标签,如果某一行没有执行则会导致多余逗号,如果采用

标签则能够去掉结尾多余的逗号

反例:

mybatis 动态sql及参数传递



标签后

mybatis 动态sql及参数传递

注意:这里的set标签只能去掉语句最后一个逗号,其他的标点去不掉 多余的逗号也去不掉

trim标签

trim标签比较强大,可完成

或者

标记的功能,主要包含四个参数

  • prefix:在trim标签内sql语句加上前缀
  • suffix:在trim标签内sql语句加上后缀
  • prefixOverrides:指定去除多余的前缀内容,如:prefixOverrides=“AND | OR”,去除trim标签内sql语句多余的前缀”and”或者”or”。
  • suffixOverrides:指定去除多余的后缀内容。

替代

 
    
   
     update order_pri 
     
     
     
       order_num = #{orderNum, jdbcType = VARCHAR}, 
      
     
       is_del = #{isDel, jdbcType = INTEGER}, 
      
     where id = #{id, jdbcType = VARCHAR } 
   

替代

 
    


识别标签为空时,自动将内容处理为空,不添加where关键字。

forEach标签

foreach标签主要有以下参数:

  • collection配置的是传递进来的参数名称
  • item配置的是循环中当前的元素。
  • index配置的是当前元素在集合的位置下标。
  • open和 close配置的是以什么符号将这些集合元素包装起来。
  • separator是各个元素的间隔符。

参数传递

单个参数传递

单参数可以直接进行传递Dao无需添加@Param注解

 
    List 
   
     selectById(String orderNum); 
     
     
   

mybatis 动态sql及参数传递

多个参数传递

多参数传递时xml无法识别key,需要用@Param标识一下进行传递

反例:

mybatis 动态sql及参数传递

正例:

 
    List 
   
     selectByFieldV2(@Param("id") Integer id, @Param("orderNum") String orderNum); 
     
     
   

传入单个实体(JavaBean/Map)

当参数<5 时建议多值传递,当参数>5时建议采用实体的方式

采用实体方式(不加@Param标识):

 
    List 
   
     selectListParam(OrderPri orderPri); 
     
     
   

如果加@Param注解则,xml中需要跟进@Param配置的名称进行实体中属性的读取

List 
   
     selectListParam(@Param("orderPri") OrderPri orderPri); 
     
   

当参数为map时同JavaBean,这里不再赘述。

传入多个实体

多实体传参时也要加@Param,否则会读不出来实体的属性

List 
   
     selectListByMulEntity(@Param("pri") OrderPri pri, @Param("dtl") OrderDtl dtl); 
     
   

传入集合

1.当参数为Collection接口,转换为Map,Map的key为collection
2.当参数类型为List接口,“list”作为key,或用@Param(“xx”)修饰,遍历时需要collection=”xx”
3.当参数为数组,也会转换为Map,Map的key为array




  • 传入数组时collection用array接:
 --Mapper List 
   
     selectBatch(int[] arr); 
     
     
   
  • 传入集合时用list接口(注意判空的写法)
 --Mapper List 
   
     selectBatchList(List 
    
      idList); --xml 
      
      
     
   
  • 传入多个集合时
--Mapper List 
   
     selectBatchListV2(@Param("idList") List 
    
      idList, @Param("orders")List 
     
       orders); 
       
       
      
     
   

批量新增

 
   
     insert into table (field01, field02) values 
    
      (#{item.field01,jdbcType=DATE}, #{item.field01,jdbcType=VARCHAR}) 
     
   

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/218762.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月17日 下午11:32
下一篇 2026年3月17日 下午11:32


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号