app开发者平台在数字化时代的重要性与发展趋势解析
797
2023-01-22
MyBatis常用动态sql大总结
简介
相信大家没用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的风险
select * from UserEntity where 1=1
and outno=#{param1}
and inno=#{param2}
条件模糊查以及查询时间段内数据
select * from UserEntity where 1=1
and outno=#{param1}
and begin_time <= #{effectiveTime}
//effectiveTime 是封的查询条件类的查询字段 and end_time >= #{effectiveTime}
//begin_time,end_time 对应数据库字段。
3、where标签:
特点:
会自动地给Sql语句添加where关键字,并将第一个and去除。
select * from UserEntity
and outno=#{param1}
and inno=#{param2}
4、choose when otherwise标签
特点:
条件只要有一个成立,其他的就不会再判断了。
如果没有成立的条件则默认执行otherwise中的内容
select * from UserEntity
and outno=#{param1}
and inno=#{param2}
and 1=1
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的整体修改
缺点:难于阅读
select
ano,aname,apwd,money
9、foreach标签:
构造IN条件语句时需要对集合进行遍历,这时候可以使用foreach元素。foreach会去掉多余","。若集合为空,则不会执行foreach元素中的操作,但此时会多出"in"关键字,报错。
item:集合中的GKRTm元素
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"
select * from account where ano in
#{item}
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.trohttp://y.testa.service;
import com.baomidou.mybatisplus.core.metahttp://data.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中处理这种情况是比较方便容易的。
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~