赞
踩
注解中使用动态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);
上面使用脚本实现动态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,hiredate
- FROM("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);
直接调用接口,测试即可
赞
踩
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。