ssm-mybatis进阶之动态sql

ssm-mybatis进阶之动态sql

动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦, 例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。MyBatis 动态 SQL 主要通过在mapper映射文件中,使用类似于JSTL语言进行编写。

动态SQL元素

MyBatis 3 之后,元素已经大大精简,主要有以下几种:
  • if
  • choose (when, otherwise)
  • trim (where, set)
  • foreach

if

使用动态 SQL 最常见情景是根据条件包含 where 子句的一部分,下面举例说明:
  1. 编写dao:
  2. List<Student> getStudents(@Param("sex") String sex, @Param("pageIndex") int pageIndex, @Param("pageSize") int pageSize);
  3. 编写mapper映射文件:

  4. 语法:<if test="条件表达式">拼接sql语句</if>
  5. 编写测试方法验证:
  6. @Test
    public void getStudents() {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        //不筛选性别,也不分页
        List<Student> students = mapper.getStudents("", 0, 0);
        Object jsonStr = JSON.toJSON(students);
        System.out.println(jsonStr);
        sqlSession.close();
    }
    不筛选性别,也不分页,结果如下:


    修改测试方法,筛选性比也分页,验证如下:
    List<Student> students = mapper.getStudents("男", 0, 2);

choose (when, otherwise)

有时候,我们不想使用所有的条件,而只是想从多个条件中选择一个使用,Mybatis 又没提供 else 。 针对这种情况,MyBatis 提供了 choose 元素,它有点像 Java 中的 switch 语句。
  1. 编写dao:
  2. List<Student> getStudents2(@Param("sex") String sex, @Param("name") String name);
  3. 编写mapper映射文件:

  4. 重点:要注意like语句的拼接方式
    语法:
    <choose>
        <when test="条件表达式1">
            拼接SQL1
        </when>
        <when test="条件表达式2">
            拼接SQL2
        </when>
        ...
        <otherwise>
            拼接默认SQL
        </otherwise>
    </choose>
    
  5. 编写测试方法验证:
  6. @Test
    public void getStudents2() {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        //只执行性别筛选
        List<Student> students = mapper.getStudents2("男", "");
        Object jsonStr = JSON.toJSON(students);
        System.out.println("[1]:" + jsonStr);
        //只执行姓名筛选
        students = mapper.getStudents2("", "张");
        jsonStr = JSON.toJSON(students);
        System.out.println("[2]:" + jsonStr);
        //参数都传递,但只会按顺寻执行第一个筛选
        students = mapper.getStudents2("女", "张");
        jsonStr = JSON.toJSON(students);
        System.out.println("[3]:" + jsonStr);
        //一个都不传,默认返回第一个
        students = mapper.getStudents2("", "");
        jsonStr = JSON.toJSON(students);
        System.out.println("[4]:" + jsonStr);
        sqlSession.close();
    }

trim (where, set)

trim主要为了解决多条语句拼接时,冗余关键字、符号问题,MyBatis 已经提取了常用的去冗元素:<where>,<set>。 其中<where>标签主要解决拼接筛选过程中去除多余的AND和OR,<set>则解决赋值过程中多余的逗号问题。 下面就用<where>来举例说明(<set>类似)
  1. 编写dao:
  2. List<Student> getStudents3(@Param("sex") String sex, @Param("name") String name);
  3. 编写mapper映射文件:

  4. 编写测试方法验证:
  5. @Test
    public void getStudents3() {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        //只执行性别筛选
        List<Student> students = mapper.getStudents3("男", "");
        Object jsonStr = JSON.toJSON(students);
        System.out.println("[1]:" + jsonStr);
        //只执行姓名筛选
        students = mapper.getStudents3("", "张");
        jsonStr = JSON.toJSON(students);
        System.out.println("[2]:" + jsonStr);
        //参数都传递,都会筛选
        students = mapper.getStudents3("女", "李");
        jsonStr = JSON.toJSON(students);
        System.out.println("[3]:" + jsonStr);
        //一个都不传,返回所有
        students = mapper.getStudents3("", "");
        jsonStr = JSON.toJSON(students);
        System.out.println("[4]:" + jsonStr);
        sqlSession.close();
    }

foreach

动态 SQL 的另一个常见使用场景是对集合进行遍历(尤其是在构建 IN 条件语句的时候)。
  1. 编写dao:
  2. List<Student> getStudentsForeach(@Param("sex") String sex, @Param("ids") int[] ids);
  3. 编写mapper映射文件:

  4. collection 可以是 list, set, array, map。map 时 index 为 key , item 为值。
  5. 编写测试方法验证:
  6. @Test
    public void getStudentsForeach() {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        int[] ids = new int[]{1, 2, 3};
        List<Student> students = mapper.getStudentsForeach("男", ids);
        Object jsonStr = JSON.toJSON(students);
        System.out.println(jsonStr);
        sqlSession.close();
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值