一、解决思路
让前端的下拉框支持单选、多选及全选,后台让Mybatis使用** trim **标签拼接动态SQL,实现
select * from order
where startDate = sysdate
and (name="A" or name="B" or name="C")
-----------------------------------------------
--当用户全选时,舍弃掉最后的 and() 条件
select * from order
where startDate = sysdate
二、请求参数
入参说明
// 单选
{
"date":"2021-10-1",
"name":["A"]
}
// 多选
{
"date":"2021-10-1",
"name":["A","B","C"]
}
// 全选
{
"date":"2021-10-1",
"nameList":["all"]
}
三、后台相关代码
- 1、请求的入参对应的实体类
@Data
public SelectReq{
private String date;
private List<String> nameList;
}
* 2、Mybatis映射文件
<select id="selectByBeans" resultMap="BaseResultMap" parameterType="com.wg.demo.po.SelectReq">
select
*
from employee
where date = to_date(#{date},'yyyy-mm-dd')
<trim prefix="and (" suffix=")" suffixOverrides="and | or">
<foreach collection="nameList" item="item">
<if test='name != "all"'>
name=#{item} or
</if>
</foreach>
</trim>
</select>
四、Mybatis注意要点
- trim标签一般用于去除sql语句中多余的and关键字,逗号,或者给sql语句前拼接 “where“、“set“以及“values(“ 等前缀,或者添加“)“等后缀
prefix | 给sql语句拼接的前缀 |
---|---|
suffix | 给sql语句拼接的后缀 |
prefixOverrides | 去除sql语句前面的关键字或者字符,该关键字或者字符由prefixOverrides属性指定,假设该属性指定为"AND",当sql语句的开头为"AND",trim标签将会去除该"AND" |
suffixOverrides | 去除sql语句后面的关键字或者字符,该关键字或者字符由suffixOverrides属性指定 |
- foreach表示循环操作,具体的参数含义如下:
foreach | 元素的属性主要有 item,index,collection,open,separator,close。 |
---|---|
item | 表示集合中每一个元素进行迭代时的别名 |
index | 指定一个名字,用于表示在迭代过程中,每次迭代到的位置 |
open | 表示该语句以什么开始 |
separator | 表示在每次进行迭代之间以什么符号作为分隔符 |
close | 表示以什么结束 |
- if 标签判断字符串
<if test = 'sex == "Y"'>
这里注意,外层用单引号,字符串用双引号包裹