使用动态SQL完成多条件查询

 动态SQl是MyBatis的一个强大的特性,在使用JDBC操作数据时,如果查询条件过多,将字符串联成SQL语句是比较麻烦的一件事,且容易出错,有了动态SQL我们就可以使用动态SQL,动态SQL基于OGNL表达式,可使我们方便地在SQL语句中实现某些逻辑。好了废话不多说,接下来我们看下示例

==在这里我们还是使用上一篇文章使用的示例,只是修改一下,大家可以先看一下上一篇文章==

用于实现动态SQL的元素如下

  • if:利用if实现简单的条件选择
  • choose(when,otherwise):相当于Java中的switch语句,通常与when和otherwise搭配
  • where:简化SQL语句中where的条件判断。
  • set:解决动态更新语句 trim:可以灵活地去除多余的关键字
  • foreach:迭代一个集合,通常用于in条件
使用if做多条件查询

修改UserMapper.xml文件

<select id="getUserList" resultMap="userList">     SELECT u.*,r.roleName FROM USER u,Role r WHERE u.userRole=r.id     <if test="userRole!=null">         AND u.userRole=#{userRole}     </if>     <if test="userName!=null and userName!=''">         AND u.userName LIKE concat('%',#{userName},'%')     </if> </select>

这段代码的意思就是,如果有角色id就以角色id查询,有用户名字就以用户名字查询,若都没有就全部查询,这和我们之前JDBC中where条件加1==1的意思是一样的
修改接口中的方法

public List<User> getUserList(@Param("userRole")Integer roleId,@Param("userName")String userName);

添加测试

public void testQuery(){     SqlSession sqlSession=null;      try{       sqlSession=MyBatisUtil.createSqlSession();       //这里我们就写两个参数,看看会出现什么结果       List<User> userList=sqlSession.getMapper(UserMapper.class).getUserList(2,null);       for (User user: userList) {             System.out.println(user.getUserName());         }     }catch (Exception ex){         ex.printStackTrace();     }finally {         MyBatisUtil.closeSqlSession(sqlSession);     } }
使用where

where元素主要用来简化SQL语句中的where条件判断,并能智能地处理and和or,如果有多余的and或者or where会智能的去除,我们可以把他和if联合起来一块使用

修改UserMapper.xml

<!--注意开启自动映射--> <select id="getUserList" resultType="User">     SELECT * FROM USER     <where>     <if test="userName!=null and userName!=''">        AND userName LIKE concat('%',#{userName},'%')         </if>         <if test="userRole!=null">             AND userRole=#{userRole}         </if>     </where> </select>
使用if+trim实现多条件查询

trim元素也会自动识别其标签是否有返回值,若有返回值,会在自己包含前后加上某些前缀(比如我们的修改语句加set),也可在其后加上某些后缀(就像我们的修改语句最后一般会有个修改的条件) 后续我们会详细的讲前缀后缀的使用方法

修改UserMapper.xml

<select id="getUserList"

                    
                
50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信