本文主要是介绍MyBatis 之十:MyBatis 框架注解中的动态 SQL,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
注解的动态SQL
注解中使用动态SQL ,可以通过使用的 script脚本来实现,(不推荐)
在 SQL 字符串中可以使用 MyBatis 的动态 SQL 元素(如 <if>、<choose>、<when>、<otherwise>、<foreach> 等),但需要将其包裹在 script 标签内。
在 MyBatis 中利用注解实现动态 SQL 查询,可以让代码更加简洁,
不过在处理复杂动态 SQL 时要注意可读性和维护性,必要时依然推荐结合或转向 XML 配置文件进行映射
@Update("<script>" +"update emp\n" +" <set>\n" +" <if test=\"salary!=null\">\n" +" sal=#{salary},\n" +" </if>\n" +" <if test=\"deptno!=null\">\n" +" deptno=#{deptno},\n" +" </if>\n" +" <if test=\"ename!=null\">\n" +" ename=#{ename},\n" +" </if>\n" +" <if test=\"hiredate!=null\">\n" +" hiredate=#{hiredate},\n" +" </if>\n" +" </set>\n" +" where empno=#{empno}" +"</script>")
void update(Emp emp);
Provider 动态SQL
上面使用脚本实现动态SQL,效率低容易出错
框架针对动态SQL需求,提供了 Provider 来解决
@InsertProvider
@SelectProvide
@UpdateProvider
@DeleteProvider
实现多条件组合动态查询
第一步先定义Provider 类,完全自定义。
package com.wdzl.provider;import com.wdzl.pojo.Emp;
import org.apache.ibatis.jdbc.SQL;public class EmpProvider {/*** 之前的普通的拼接SQL的方式* @return*/public String getSearch(Emp emp){String sql = "select * from emp where 1=1";if(emp.getDeptno()!=null){sql += " and deptno=#{deptno}";}if(emp.getEname()!=null){sql += " and ename = #{deptno}";}if(emp.getSalary()!=null){sql += " and sal >= #{salary}";}return sql;}/*** 使用 SQL()*/public String getSQL(Emp emp){return new SQL(){{ //注意:下面代码是在匿名内部类的代码段中SELECT("empno,ename,sal,hiredate"); // select empno,ename,salary,hiredateFROM("emp");if(emp.getDeptno()!=null){WHERE("deptno=#{deptno}"); //默认为 and 条件}OR(); // 指定为 or 条件if(emp.getEname()!=null){WHERE("ename = #{deptno}");}if(emp.getSalary()!=null){WHERE("sal >= #{salary}");}//排序ORDER_BY("hiredate desc");}}.toString();}
}
注意:上面代码中两个不同的方法实现,对于外部调用者来说,都是调用方法传入对象,返回字符串的SQL所以使用哪一种方式都可以。
第二步通过注解调用
修改 IEmpDao 接口中查询的方法,使用注解来引用上面的类中的某一个方法
先看调用Provider 类中第一个方法:
@SelectProvider(type = EmpProvider.class,method = "getSearch")
List<Emp> queryByCondtion(Emp emp);
下面是调用 Provider 类中第二个方法
@SelectProvider(type = EmpProvider.class,method = "getSQL")
List<Emp> queryByCondtion(Emp emp);
直接调用接口,测试即可
这篇关于MyBatis 之十:MyBatis 框架注解中的动态 SQL的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!