当前位置: 首页 > news >正文

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

直接调用接口,测试即可

相关文章:

  • @EnableConfigurationProperties注解使用
  • 【数据结构和算法】-贪心算法
  • 浅谈Spring框架
  • Python 网络编程
  • [Java、Android面试]_10_Java中==与equal()方法的区别?重写equal()方法?
  • Redisson 分布式锁原理分析
  • 智能合约 之 ERC-20介绍
  • vue-admin-template极简的 vue admin 管理后台的动态路由实现方法
  • 002_avoid_for_loop_in_Matlab避免使用for循环
  • Session、Cookie 和 Token的保存
  • 【蓝桥杯选拔赛真题72】python输出整数 第十五届青少年组蓝桥杯python选拔赛真题 算法思维真题解析
  • 软件测试教程 自动化测试之Junit框架
  • 网络安全进入AI赋能时代
  • 记录C++中,子类同名属性并不能完全覆盖父类属性的问题
  • Linux编程3.8 进程-守护进程
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • avalon2.2的VM生成过程
  • django开发-定时任务的使用
  • js中forEach回调同异步问题
  • Meteor的表单提交:Form
  • OSS Web直传 (文件图片)
  • spring + angular 实现导出excel
  • tweak 支持第三方库
  • 目录与文件属性:编写ls
  • 前端工程化(Gulp、Webpack)-webpack
  • 前端面试之闭包
  • 如何解决微信端直接跳WAP端
  • 想写好前端,先练好内功
  • 一道面试题引发的“血案”
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • mysql面试题分组并合并列
  • 关于Android全面屏虚拟导航栏的适配总结
  • # 达梦数据库知识点
  • #在 README.md 中生成项目目录结构
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (编程语言界的丐帮 C#).NET MD5 HASH 哈希 加密 与JAVA 互通
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (强烈推荐)移动端音视频从零到上手(上)
  • (转) Android中ViewStub组件使用
  • (转)Sql Server 保留几位小数的两种做法
  • (转)关于多人操作数据的处理策略
  • (总结)Linux下的暴力密码在线破解工具Hydra详解
  • .net 4.0发布后不能正常显示图片问题
  • .NET Core 网络数据采集 -- 使用AngleSharp做html解析
  • .NET Remoting学习笔记(三)信道
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET构架之我见
  • .NET使用存储过程实现对数据库的增删改查
  • .skip() 和 .only() 的使用
  • [ 2222 ]http://e.eqxiu.com/s/wJMf15Ku
  • [ vulhub漏洞复现篇 ] ECShop 2.x / 3.x SQL注入/远程执行代码漏洞 xianzhi-2017-02-82239600
  • [AR]Vumark(下一代条形码)
  • [BZOJ]4817: [Sdoi2017]树点涂色
  • [C#] 我的log4net使用手册
  • [C/C++]关于C++11中的std::move和std::forward