动态SQL是MyBatis的一个强大的特性
动态SQL基于OGNL的表达式,可以使用动态SQL完成多条件查询等逻辑实现
MyBatis通过标签的配合使用,可实现如下功能
语句的动态拼接
前后缀格式处理
复杂参数处理
常用标签
if:利用if实现简单的条件选择
where:简化SQL语句中where的条件判断
choose(when、otherwise):相当于java中的switch语句,通常与when和otherwise搭配
foreach:迭代一个集合,通常用于in条件
set:解决动态更新语句
trim:可以灵活地去除多余的关键字
查询出角色id值为2且用户姓名包含"赵"的用户信息
测试方法传入角色id参数为null的时候,为什么检索结果为空?
原因

如何解决?
if标签;动态SQL技术中最常用的标签之一,类似于Java中的if语句
语法

示例
Dao接口//根据用户名称和角色查询用户列表,用户名实现模糊查询 参数是基础数据类型 //实现多条件查询 条件用户名和角色是可选的 ListgetUserListByNameAndRole1(@Param("xm") String name, @Param("js") Integer role);
- Dao接口映射文件
-
- <!--根据用户名称和角色查询用户列表,用户名实现模糊查询 参数是基础数据类型 条件可选-->
-
- <select id="getUserListByNameAndRole1" resultType="user">
- SELECT * FROM smbms_user WHERE 1=1 /*写1=1是为了防止 后面没有条件 那么where关键字就成多余的了*/
- <if test="xm!=null and xm!=''">
- AND userName LIKE CONCAT ('%',#{xm},'%')
- </if>
- <if test="js!=null">
- AND userRole=#{js}
- </if>
- </select>
-
- 测试类
-
-
-
- @Test
- public void getUserListByNameAndRole1Test(){
- SqlSession sqlSession=null;
- try {
- //创建SqlSession实例
- sqlSession= MybatisUtil.createSqlSession();
- //创建UserMapper接口实例,调用其方法执行相关的SQL语句
- List<User> list = sqlSession.getMapper(UserMapper.class).getUserListByNameAndRole1("赵",null);
- for (User user:list){
- log.info("编码:" + user.getUserCode()+"\t用户名:"+user.getUserName()+"\t角色:"+user.getUserRole());
- }
- } catch (Exception e) {
- e.printStackTrace();
- }finally {
- MybatisUtil.closeSqlSession(sqlSession);
- }
- }
-
-
根据上面的示例,如果1=1不写;当所有的条件为null或者是有条件时,控制台汇报SQL异常错误
原因是

如何解决?
where标签:它自动识别其标签内是否有返回值,若有,就插入一个where。
若该标签返回的内容是以and或or开头,会自动删除
语法

示例
-
- Dao接口映射文件
- <!--根据用户名称和角色查询用户列表,用户名实现模糊查询 参数是基础数据类型 条件可选-->
- <select id="getUserListByNameAndRole1" resultType="user">
- SELECT * FROM smbms_user
- <where>
- <if test="xm!=null and xm!=''">
- AND userName LIKE CONCAT ('%',#{xm},'%')
- </if>
- <if test="js!=null">
- AND userRole=#{js}
- </if>
- </where>
- </select>
-
-