Mybatis使用注解实现复杂动态SQL

系列文章目录

1、mybatis简介及数据库连接池
2、mybatis简单使用
3、mybatis中selectOne的使用
4、mybatis中resultMap结果集的使用
5、mybatis实用教程之XML实现动态sql


Mybatis使用注解实现复杂动态SQL

  • 系列文章目录
  • 前言
  • 一、基础注解
  • 二、使用Provider 类实现复杂注解


前言

当使用 MyBatis 注解方式执行复杂 SQL 时,你可以使用 @Select@Update@Insert@Delete 注解直接在接口方法上编写 SQL。也可以使用动态 SQL 注解 @SelectProvider、@UpdateProvider、@InsertProvider、@DeleteProvider 等结合 Provider 类来动态生成 SQL 语句。Provider 类需要定义一个方法,方法返回值是一个字符串,该字符串即为动态生成的 SQL 语句。这些注解允许你在方法级别上编写 SQL,使代码更简洁明了。


一、基础注解

这里介绍的注解有@Select@Update@Insert@Delete ,常用的也是这些。

以下是一个示例展示了如何使用注解执行复杂 SQL:

import org.apache.ibatis.annotations.*;@Mapper
public interface UserMapper {@Select("SELECT * FROM users WHERE name = #{name} AND age = #{age}")List<User> getUserByNameAndAge(@Param("name") String name, @Param("age") int age);@Update("UPDATE users SET name = #{name} WHERE id = #{id}")void updateUserNameById(@Param("id") int id, @Param("name") String name);@Insert("INSERT INTO users (name, age) VALUES (#{name}, #{age})")void insertUser(@Param("name") String name, @Param("age") int age);@Delete("DELETE FROM users WHERE id = #{id}")void deleteUserById(@Param("id") int id);// 更复杂的 SQL 可以通过 XML 方式或者动态 SQL 的注解方式实现// 也可以使用动态 SQL 注解 @SelectProvider、@UpdateProvider、@InsertProvider、@DeleteProvider 等
}

当然,也可以再注解中使用if标签和foreach来实现复杂sql,如下示例所示

@Select("SELECT * FROM users WHERE 1=1 " +"<if test='ids != null'> " +"AND id IN <foreach collection='ids' item='id' open='(' separator=',' close=')'>#{id}</foreach> " +"</if>")
List<User> getUsersByIds(@Param("ids") List<Integer> ids);@Select({"SELECT * FROM users WHERE id IN ","<foreach item='id' collection='userIds' open='(' separator=',' close=')'>","#{id}","</foreach>"
})
List<User> getUsersByIds(@Param("userIds") List<Integer> userIds);

在这个示例中:

  • @Select@Update@Insert@Delete 注解分别用于执行查询、更新、插入和删除操作。
  • 注解中的 SQL 语句使用 #{parameterName} 语法引用方法参数,并且使用 @Param 注解为参数指定名称。

二、使用Provider 类实现复杂注解

对于更复杂的 SQL 语句,你可以使用 @SelectProvider@UpdateProvider@InsertProvider@DeleteProvider 注解结合对应的 Provider 类,以及动态 SQL 注解来实现动态生成 SQL 语句。这样能够更灵活地处理复杂的查询逻辑。

以下是一个示例,展示如何使用注解结合 Provider 实现动态 SQL:

public class UserSqlProvider {public String getUserByNameAndAge(Map<String, Object> params) {String name = (String) params.get("name");Integer age = (Integer) params.get("age");StringBuilder sb = new StringBuilder("SELECT * FROM users WHERE 1=1");if (name != null && !name.isEmpty()) {sb.append(" AND name = #{name}");}if (age != null) {sb.append(" AND age = #{age}");}return sb.toString();}
}

注解使用:

import org.apache.ibatis.annotations.*;@Mapper
public interface UserMapper {@SelectProvider(type = UserSqlProvider.class, method = "getUserByNameAndAge")List<User> getUserByNameAndAge(Map<String, Object> params);
}

在这个示例中:

  • UserSqlProvider 类是一个 Provider 类,其中的 getUserByNameAndAge 方法根据传入的参数动态生成 SQL 语句。
  • UserMapper 接口使用 @SelectProvider 注解来指定 Provider 类和对应的方法,以动态生成 SQL 语句。

在实际应用中,根据需要,Provider 类的方法可以编写更为复杂的逻辑,以生成复杂动态 SQL 语句,使其更加灵活和可控。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/193880.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Spring MVC数据绑定的几种方法(一)

这篇文章包含spring mvc的默认数据类型绑定和简单数据类型绑定。内容来自实验。 准备&#xff1a; &#xff08;1&#xff09;在IDEA环境中从archetye创建webapp类型的maven项目exp6。 &#xff08;2&#xff09;在src\main目录下创建并标注java源代码文件夹和resources资源文…

NVIDIA GPU Operator install in kubernetes

文章目录 1. 简介2. Kubernetes 安装3. OS配置4. Docker Engine&#xff0c;cri-dockerd安装5. 安装 kubeadm6. GPU-Operator安装 1. 简介 Kubernetes通过设备插件框架提供对特殊硬件资源的访问&#xff0c;如NVIDIA GPU、⽹卡、Infiniband适配器和其他设备。但是&#xff0c;…

基于Java SSM框架实现实现四六级英语报名系统项目【项目源码+论文说明】

基于java的SSM框架实现四六级英语报名系统演示 摘要 本论文主要论述了如何使用JAVA语言开发一个高校四六级报名管理系统&#xff0c;本系统将严格按照软件开发流程进行各个阶段的工作&#xff0c;采用B/S架构&#xff0c;面向对象编程思想进行项目开发。在引言中&#xff0c;作…

2024美赛数学建模资料---100%获奖资料

很好的教程了 一共二十四章 每一章都是一个模型 并且有matlab编程编码 第一章 线性规划 第二章 整数规划 第三章 非线性规划 第四章 动态规划 第五章 图与网络 第六章 排队论 第七章 对策论 第八章 层次分析法 第九章 插值与拟合 第十章 数据的统计描述和分析 第十一章…

链表算法总结

知识概览 链表包括单链表和双链表&#xff0c;这里讨论算法题中的链表。为了考虑算法题中对于时间效率的要求&#xff0c;链表通常是用数组模拟成静态链表的形式&#xff0c;速度快。 单链表可以用来写邻接表&#xff08;包括n个链表&#xff09;&#xff0c;邻接表可以存储树…

详解Spring对Mybatis等持久化框架的整合

&#x1f609;&#x1f609; 学习交流群&#xff1a; ✅✅1&#xff1a;这是孙哥suns给大家的福利&#xff01; ✨✨2&#xff1a;我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 &#x1f96d;&#x1f96d;3&#xff1a;QQ群&#xff1a;583783…

自带灯效的气传导耳机,声音当然好听,哈氪聆光体验

现在市场上的蓝牙耳机种类繁多&#xff0c;入耳式的算是主流&#xff0c;但不太适合户外使用 &#xff0c;我平时出门健身、散步的时候&#xff0c;更喜欢用气传导耳机。气传导耳机通常采用挂耳式的设计&#xff0c;耳机不入耳&#xff0c;佩戴舒适度更好&#xff0c;而且稳定性…

Linux安装mongodb数据库(详细)

一、下载安装包 本文使用 tgz 方式,根据服务器类型在官网下载 MongoDB 安装包。官方地址&#xff1a;https://www.mongodb.com/try/download/community 下载方式如图所示&#xff1a; 选择版本 关于 MongoDB 的版本选择&#xff0c;参见如下版本差异&#xff1a; 1、将从官…

Java基本数据类型详解

✨个人主页&#xff1a;全栈程序猿的CSDN博客 &#x1f4a8;系列专栏&#xff1a;Java从入门到精通 ✌座右铭&#xff1a;编码如诗&#xff0c;Bug似流星&#xff0c;持续追求优雅的代码&#xff0c;解决问题如同星辰般自如 Java是一种强类型语言&#xff0c;数据类型在程序中起…

最小生成树(简单讲解,通俗易懂)

什么是树呢&#xff1f; 有三个特点&#xff1a; 无向图&#xff0c;连通&#xff0c;无环 其他性质&#xff1a;树中点的个数总是比边的个数多1&#xff0c;根节点没有父节点&#xff0c;树中节点的度数之和等于其边数。 树&#xff08;tree&#xff09;是一种特殊的图&am…

JS不同运算符下的隐式类型转换

目录 运算符 逻辑运算符&#xff08;&&、||、!&#xff09;和 条件表达式&#xff08;if、三元表达式&#xff09; 逻辑运算符 条件表达式 算数运算符&#xff08;*、/、- %、&#xff09;和 关系运算符&#xff08;>、<、、!&#xff09; 算数运算符 关系…

Python实战:批量加密Excel文件指南

更多Python学习内容&#xff1a;ipengtao.com 大家好&#xff0c;我是彭涛&#xff0c;今天为大家分享 Python实战&#xff1a;批量加密Excel文件指南&#xff0c;全文3800字&#xff0c;阅读大约10分钟。 在日常工作中&#xff0c;保护敏感数据是至关重要的。本文将引导你通过…

栈和队列的OJ题--13.用队列实现栈

13. 用队列实现栈 225. 用队列实现栈 - 力扣&#xff08;LeetCode&#xff09; /*解题思路&#xff1a; 此题可以用两个队列去实现一个栈&#xff0c;每次始终保持一个队列为空&#xff0c; 入栈操作相当于给非空队列进行入队操作 出栈操作相当于非空队列的队尾元素出队&…

细说CountDownLatch

CountDownLatch 概念 CountDownLatch可以使一个获多个线程等待其他线程各自执行完毕后再执行。 CountDownLatch 定义了一个计数器&#xff0c;和一个阻塞队列&#xff0c; 当计数器的值递减为0之前&#xff0c;阻塞队列里面的线程处于挂起状态&#xff0c;当计数器递减到0时…

【学习笔记】机器学习——GAN

提出于2014年。 GAN由两个神经网络组成&#xff1a;一个试图生成看起来与训练数据相似数据的生成器&#xff0c;以及一个试图从虚假数据中分辨出真实数据的判别器。生成器和判别器在训练期间相互竞争。 对抗训练&#xff08;训练竞争性网络&#xff09;是一种重要的机器学习思想…

CMake常用命令指南

前言 本博客是在 CMake 保姆级教程 文章的学习上进行的总结&#xff0c;把常用CMake命令总结如下。 CMake基本命令 CMake 使用 # 进行行注释&#xff0c;使用 #[[ ]] 形式进行块注释。 # 行注释#[[块注释 ]]以下三个命令是使用CMake构建最简单的一个项目所需要的命令。 cm…

工作几年了,你真的懂 Redis 嘛?

大家好&#xff0c;我是伍六七。一个专注于输出 AI 编程内容的在职大厂资深程序员&#xff0c;全国最大 AI 付费社群破局初创合伙人&#xff0c;关注我一起破除 35 诅咒。 Redis 基本上是大部分技术公司都会使用的缓存框架&#xff0c;但是我发现很多程序员其实并不懂 Redis。 …

【数组】-Lc15-三数之和(排序+for循环+滑动窗口)

写在前面 最近想复习一下数据结构与算法相关的内容&#xff0c;找一些题来做一做。如有更好思路&#xff0c;欢迎指正。 目录 写在前面一、场景描述二、具体步骤1.环境说明2.代码 写在后面 一、场景描述 给定一个包含 n 个整数的数组 nums&#xff0c;判断 nums 中是否存在三个…

SSM新闻发布管理系统

SSM毕设分享 序号1&#xff1a;SSM新闻发布管理系统 1 项目简介 Hi&#xff0c;各位同学好&#xff0c;这里是郑师兄&#xff01; 今天向大家分享一个毕业设计项目作品【SSM新闻发布管理系统】 师兄根据实现的难度和等级对项目进行评分(最低0分&#xff0c;满分5分) 难度系数…

三极管在数字电路中的应用

一、认识三极管 三极管拥有3个引脚&#xff0c;分别对应3个级&#xff1a;基极(Base)、发射极&#xff08;Emitter&#xff09;、集电极(Collector)&#xff0c;如下图所示&#xff1b;下图横向左侧的是基极&#xff0c;带箭头的那个引脚就是发射极&#xff0c;另一个就是集电…