温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

动态SQL复杂查询语句

发布时间:2020-05-26 10:59:24 来源:亿速云 阅读:410 作者:Leah 栏目:编程语言

  今天小编就为大家带来一篇有关动态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复杂查询语句的介绍,详细使用情况还得要大家自己使用过才能知道具体要领。如果想阅读更多相关内容的文章,欢迎关注亿速云行业资讯频道!

向AI问一下细节
推荐阅读:
  1. sybase查询语句
  2. 动态sql

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI