动态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"
