当前位置:   article > 正文

MyBatis 之十:MyBatis 框架注解中的动态 SQL

MyBatis 之十:MyBatis 框架注解中的动态 SQL

注解的动态SQL

注解中使用动态SQL ,可以通过使用的 script脚本来实现,(不推荐)

在 SQL 字符串中可以使用 MyBatis 的动态 SQL 元素(如 <if>、<choose>、<when>、<otherwise>、<foreach> 等),但需要将其包裹在 script 标签内。

在 MyBatis 中利用注解实现动态 SQL 查询,可以让代码更加简洁,

不过在处理复杂动态 SQL 时要注意可读性和维护性,必要时依然推荐结合或转向 XML 配置文件进行映射

  1. @Update("<script>" +
  2. "update emp\n" +
  3. " <set>\n" +
  4. " <if test=\"salary!=null\">\n" +
  5. " sal=#{salary},\n" +
  6. " </if>\n" +
  7. " <if test=\"deptno!=null\">\n" +
  8. " deptno=#{deptno},\n" +
  9. " </if>\n" +
  10. " <if test=\"ename!=null\">\n" +
  11. " ename=#{ename},\n" +
  12. " </if>\n" +
  13. " <if test=\"hiredate!=null\">\n" +
  14. " hiredate=#{hiredate},\n" +
  15. " </if>\n" +
  16. " </set>\n" +
  17. " where empno=#{empno}" +
  18. "</script>")
  19. void update(Emp emp);

Provider 动态SQL

上面使用脚本实现动态SQL,效率低容易出错

框架针对动态SQL需求,提供了 Provider 来解决

@InsertProvider

@SelectProvide

@UpdateProvider

@DeleteProvider

实现多条件组合动态查询

第一步先定义Provider 类,完全自定义。

  1. package com.wdzl.provider;
  2. import com.wdzl.pojo.Emp;
  3. import org.apache.ibatis.jdbc.SQL;
  4. public class EmpProvider {
  5. /**
  6. * 之前的普通的拼接SQL的方式
  7. * @return
  8. */
  9. public String getSearch(Emp emp){
  10. String sql = "select * from emp where 1=1";
  11. if(emp.getDeptno()!=null){
  12. sql += " and deptno=#{deptno}";
  13. }
  14. if(emp.getEname()!=null){
  15. sql += " and ename = #{deptno}";
  16. }
  17. if(emp.getSalary()!=null){
  18. sql += " and sal >= #{salary}";
  19. }
  20. return sql;
  21. }
  22. /**
  23. * 使用 SQL()
  24. */
  25. public String getSQL(Emp emp){
  26. return new SQL(){
  27. { //注意:下面代码是在匿名内部类的代码段中
  28. SELECT("empno,ename,sal,hiredate"); // select empno,ename,salary,hiredate
  29. FROM("emp");
  30. if(emp.getDeptno()!=null){
  31. WHERE("deptno=#{deptno}"); //默认为 and 条件
  32. }
  33. OR(); // 指定为 or 条件
  34. if(emp.getEname()!=null){
  35. WHERE("ename = #{deptno}");
  36. }
  37. if(emp.getSalary()!=null){
  38. WHERE("sal >= #{salary}");
  39. }
  40. //排序
  41. ORDER_BY("hiredate desc");
  42. }
  43. }.toString();
  44. }
  45. }

注意:上面代码中两个不同的方法实现,对于外部调用者来说,都是调用方法传入对象,返回字符串的SQL所以使用哪一种方式都可以。

第二步通过注解调用

修改 IEmpDao 接口中查询的方法,使用注解来引用上面的类中的某一个方法

先看调用Provider 类中第一个方法:

  1. @SelectProvider(type = EmpProvider.class,method = "getSearch")
  2. List<Emp> queryByCondtion(Emp emp);

下面是调用 Provider 类中第二个方法

  1. @SelectProvider(type = EmpProvider.class,method = "getSQL")
  2. List<Emp> queryByCondtion(Emp emp);

直接调用接口,测试即可

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/254867
推荐阅读
相关标签
  

闽ICP备14008679号