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,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);

直接调用接口,测试即可

相关推荐

  1. MyBatis MyBatis 框架注解动态 SQL

    2024-03-16 12:26:02       43 阅读
  2. MyBatis动态Sql

    2024-03-16 12:26:02       58 阅读
  3. mybatis动态SQL

    2024-03-16 12:26:02       44 阅读
  4. MyBatis动态SQL

    2024-03-16 12:26:02       54 阅读
  5. MyBatisMybatis动态SQL——bind标签

    2024-03-16 12:26:02       23 阅读
  6. Mybatis使用注解实现复杂动态SQL

    2024-03-16 12:26:02       60 阅读
  7. 互联网轻量级框架整合MyBatis动态SQL

    2024-03-16 12:26:02       29 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-16 12:26:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-16 12:26:02       101 阅读
  3. 在Django里面运行非项目文件

    2024-03-16 12:26:02       82 阅读
  4. Python语言-面向对象

    2024-03-16 12:26:02       91 阅读

热门阅读

  1. Qt 数据类型介绍

    2024-03-16 12:26:02       38 阅读
  2. C++_第三周做题总结_指针2

    2024-03-16 12:26:02       42 阅读
  3. Android 地图SDK 绘制点 删除 指定

    2024-03-16 12:26:02       36 阅读
  4. pdf转图片(利用pdf2image包)

    2024-03-16 12:26:02       42 阅读