目录
使用场景
动态标签
if标签
where标签
choose、when、otherwise 标签
set标签
trim标签
forEach标签
参数传递
单个参数传递
多个参数传递
传入单个实体(JavaBean/Map)
传入多个实体
传入集合
批量新增
在实际开发过程中,我们往往需要编写复杂的SQL语句,拼接稍有不注意就会导致错误,Mybatis给开发者提供了动态SQL,大大降低了拼接SQL导致的错误。
if标签通常用那个胡where语句,update语句,insert语句中,通过判断参数值来决定是否使用某个查询条件,判断是否更新某一个字段或插入某个字段
#{orderNum,jdbcType=VARCHAR},
where标签通常与if标签配合使用,当if标签数量很多时可能会导致组合错误
当id=null 会 出现如下的sql拼写错误,
除了用where 1=1 and xxx 这样的方式外还可以使用
正例:
反例:
这三个标签需要组合在一起使用,类似于 Java 中的 switch、case、default。只有一个条件生效,也就是只执行满足的条件 when,没有满足的条件就执行 otherwise,表示默认条件。
采用update语句时,如果同时使用了
反例:
加
注意:这里的set标签只能去掉语句最后一个逗号,其他的标点去不掉 多余的逗号也去不掉。
trim标签比较强大,可完成
update order_pri
order_num = #{orderNum, jdbcType = VARCHAR},
is_del = #{isDel, jdbcType = INTEGER},
where
id = #{id, jdbcType = VARCHAR }
当
foreach标签主要有以下参数:
单参数可以直接进行传递Dao无需添加@Param注解
List selectById(String orderNum);
多参数传递时xml无法识别key,需要用@Param标识一下进行传递
反例:
正例:
List selectByFieldV2(@Param("id") Integer id, @Param("orderNum")
String orderNum);
当参数<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
--Mapper
List selectBatch(int[] arr);
--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})