今天小编就为大家带来一篇有关动态SQL复杂查询语句的文章。小编觉得挺实用的,为此分享给大家做个参考。一起跟随小编过来看看吧。
多条件查询
普通的sql查询多条判断条件时
select * from emp
where 1=1 and ename = ? and job = ? and sal = ?
当其中一个条件为空时或者未提供会报错
mybatis提供了 if 标签
and ename like concat("%",#{name},"%")
判断失败则不加入sql语句
实例
//map传参
List selectByCondition1(Map searchMap);
//顺序传参
List selectByCondition2(String ename,String job,Double sal);
//对象传参
List selectByCondition3(SearchMap searchMap);
public class SearchMap {
private String name;
private String job;
private Double sal;
}
select * from emp where ename like concat("%",#{ename},"%") and job = #{job} and sal > #{sal}
select * from emp where ename like concat("%",#{param1},"%") and job = #{param2} and sal > #{param3}
select * from emp where ename like concat("%",#{name},"%") and job = #{job} and sal > #{sal}
这样还是存在问题 如果其中第一条判断失败 那么第二条加入 会变成
select * from emp where and job = #{job}多余的and导致出错
可以通过一般方式解决
select * from emp where 1=1
and ename like concat("%",#{name},"%")
and job = #{job}
and sal > #{sal}
为了解决这个问题 mybatis提供了 where标签
select * from emp
and ename like concat("%",#{name},"%")
and job = #{job}
and sal > #{sal}
where标签会自动出掉多余的第一个and或者or
foreach查询
需求
传入多个 id 查询用户信息,用下边两个 sql 实现:
SELECT * FROM USERS WHERE username LIKE '%张%' AND (id =10 OR id =89 OR id=16)
SELECT * FROM USERS WHERE username LIKE '%张%' AND id IN (10,89,16)
这样我们在进行范围查询时,就要将一个集合中的值,作为参数动态添加进来。
这样我们将如何进行参数的传递?
在 QueryVo 中加入一个 List 集合用于封装参数
/**
*
Description: 查询的条件
*/郑州引产手术费用多少钱 https://yiyuan.120ask.com/art/307587.html
public class QueryVo implements Serializable {
private List ids;
public List getIds() {
return ids;
}
public void setIds(List ids) {
this.ids = ids;
}
}
持久层 Dao 接口
/**
* 根据 id 集合查询用户
* @param vo
* @return
*/
List findInIds(QueryVo vo);
持久层 Dao 映射配置
#{uid}
SQL 语句:
select 字段 from user where id in (?)
标签用于遍历集合,它的属性:
collection:代表要遍历的集合元素,注意编写时不要写#{}
open:代表语句的开始部分
close:代表结束部分
item:代表遍历集合的每个元素,生成的变量名
sperator:代表分隔符
1.3.3.1.编写测试方法
@Test
public void testFindInIds() {
QueryVo vo = new QueryVo();
List ids = new ArrayList();
ids.add(41);
ids.add(42);
ids.add(43);
ids.add(46);
ids.add(57);
vo.setIds(ids);
//6.执行操作
List users = userDao.findInIds(vo);
for(User user : users) {
System.out.println(user);
}
}
Mybatis 中简化编写的 SQL 片段 sql冗余
Sql 中可将重复的 sql 提取出来,使用时用 include 引用即可,最终达到 sql 重用的目的。
1 定义代码片段
select * from user
2 引用代码片段
where id = #{uid}
以上就是动态SQL复杂查询语句的介绍,详细使用情况还得要大家自己使用过才能知道具体要领。如果想阅读更多相关内容的文章,欢迎关注亿速云行业资讯频道!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。