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

注解的动态SQL

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

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

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

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

@Update("")
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,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 queryByCondtion(Emp emp);

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

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

直接调用接口,测试即可

你可能感兴趣的:(MyBatis,mybatis,sql,数据库)