MybatisPlus中的使用Wrapper自定义SQL

一、条件构造器

        条件构造器提供了一种更加简洁和直观的方式来构建复杂的查询条件。它提供了一组静态方法,用于构建各种类型的查询条件,包括等于、不等于、大于、小于、包含等。使用条件构造器可以避免手动拼接SQL语句的麻烦,提高代码的可读性和可维护性。

以下是官方文档提供的常用的条件构造器实例:

        每种方法都重载了第一个参数为boolean类型的参数,表示该条件是否加入最后生成的sql中,默认为true。

alleq():全部eq

allEq({id:1,name:"老王",age:null})--->id = 1 and name = '老王' and age is null

eq():等于 =

eq("name", "老王")--->name = '老王'

ne():不等于 <>

ne("name", "老王")--->name <> '老王'

gt():大于 >

gt("age", 18)--->age > 18

ge():大于等于 >=

ge("age", 18)--->age >= 18

lt():小于 <

lt("age", 18)--->age < 18

le():小于等于 <=

le("age", 18)--->age <= 18

or():拼接OR

eq("id",1).or().eq("name","老王")--->id = 1 or name = '老王'

add():拼接AND

and(i -> i.eq("name", "李白").ne("status", "活着"))--->and (name = '李白' and status <> '活着')

between():BETWEEN 值1 AND 值2

between("age", 18, 30)--->age between 18 and 30

notBetween():NOT BETWEEN 值1 AND 值2

notBetween("age", 18, 30)--->age not between 18 and 30

like():LIKE '%值%

like("name", "王")--->name like '%王%'

notLike():NOT LIKE '%值%'

notLike("name", "王")--->name not like '%王%'

likeLeft():LIKE '%值'

likeLeft("name", "王")--->name like '%王'

likeRight():LIKE '值%'

likeRight("name", "王")--->name like '王%'

isNull():字段 IS NULL

isNull("name")--->name is null

isNotNull():字段 IS NOT NULL

isNotNull("name")--->name is not null

in():字段 IN (v0, v1, ...)

in("age", 1, 2, 3)--->age in (1,2,3)

notIn():字段NOT IN  (v0, v1, ...)

notIn("age", 1, 2, 3)--->age not in (1,2,3)

groupBy():分组:GROUP BY 字段

groupBy("id", "name")--->group by id,name

orderByAsc():排序:ORDER BY 字段, ... ASC

orderByAsc("id", "name")--->order by id ASC,name ASC

orderByDesc():排序:ORDER BY 字段, ... DESC

orderByDesc("id", "name")--->order by id DESC,name DESC

having():HAVING ( sql语句 

having("sum(age) > 10")--->having sum(age) > 10

二、Wrapper

        Wrapper在MyBatis-Plus中是用于构建动态SQL语句的重要工具之一。主要的子类有UpdateWrapper(实现更新操作)、QueryWrapper(实现查询操作)以及可以进行链式编程的AbstractLambdaWrapper,Wrapper的使用非常灵活,可以单独使用,也可以组合使用。

QueryWrapper

    @Testvoid queryWrapperTest(){QueryWrapper<User> wrapper = new QueryWrapper<User>().in("age",5);long count = userService.count(wrapper);System.out.println(count);}

UpdateWrapper

    @Testvoid updateWrapperTest1(){User user = new User();user.setEmail("456");UpdateWrapper<User> wrapper = new UpdateWrapper<User>().eq("name","fulian");boolean update = userService.update(user, wrapper);System.out.println(update);}

三、使用Wrapper实现自定义SQL

        需要注意的是:需要mybatis-plus版本 >= 3.0.7 param 参数名要么叫ew,要么加上注解@Param(Constants.WRAPPER) 使用${ew.customSqlSegment} 不支持 Wrapper 内的entity生成where语句。

实例

MySQL数据库中表内容如下:

User实体类

@TableName(value ="user")
@AllArgsConstructor
@NoArgsConstructor
@Data
public class User implements Serializable {private Long id;private String name;private Integer age;private String email;private static final long serialVersionUID = 1L;
}

UserMapper接口

public interface UserMapper extends BaseMapper<User> {// 使用 QueryWrapper 自定义updatevoid updateEmailByAges(@Param(Constants.WRAPPER) QueryWrapper<User> wrapper, @Param("email") String email);// 使用 LambdaQueryWrapper 自定义updatevoid updateEmailByAges2(@Param(Constants.WRAPPER) LambdaQueryWrapper<User> wrapper, @Param("email")String email);// 使用 LambdaQueryWrapper 自定义selectList<User> findUserInAges(@Param(Constants.WRAPPER)LambdaQueryWrapper<User> wrapper);
}

UserMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.fulian.mybatispluslearning.mapper.UserMapper"><resultMap id="BaseResultMap" type="com.fulian.mybatispluslearning.domain.User"><id property="id" column="id" jdbcType="BIGINT"/><result property="name" column="name" jdbcType="VARCHAR"/><result property="age" column="age" jdbcType="INTEGER"/><result property="email" column="email" jdbcType="VARCHAR"/></resultMap><sql id="Base_Column_List">id,name,age,email</sql><update id="updateEmailByAges">update userset email = #{email}${ew.customSqlSegment}</update><update id="updateEmailByAges2">update userset email = concat(email , #{email})${ew.customSqlSegment}</update><select id="findUserInAges" resultType="com.fulian.mybatispluslearning.domain.User">select * from user ${ew.customSqlSegment}</select>
</mapper>

测试类

@SpringBootTest
class UserServiceTest {@Resourceprivate UserService userService;@Resourceprivate UserMapper userMapper;@Testvoid customSqlUpdateTest(){List<Integer> ages = Arrays.asList(10,55);String email = "789";// 使用 LambdaQueryWrapper 自定义selectLambdaQueryWrapper<User> in = new LambdaQueryWrapper<User>().in(User::getAge, ages);List<User> userInAges = userMapper.findUserInAges(in);// 使用 QueryWrapper 自定义updateQueryWrapper<User> wrapper = new QueryWrapper<User>().in("age",ages);userMapper.updateEmailByAges1(wrapper,email);// 使用 LambdaQueryWrapper 自定义updateLambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>().in(User::getAge,ages);userMapper.updateEmailByAges2(wrapper,email);}}

        总之,Wrapper是MyBatis-Plus中非常强大和灵活的工具之一,它提供了一种链式调用的方式,可以方便地构建复杂的查询条件和动态SQL语句。通过使用Wrapper,我们可以提高代码的可读性和可维护性,并且使我们的应用程序更加高效和灵活。

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

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

相关文章

解决 Xshell 无法使用 root 账户远程登录 Linux 的问题

文章目录 问题描述问题原因解决办法 笔者出问题时的运行环境&#xff1a; Red Hat Enterprise Linux 9.2 x86_64 Xshell 7 问题描述 笔者在新安装的 Red Hat Enterprise Linux 中发现一个问题。在 RHEL 安装完之后&#xff0c;无法在 Xshell 中使用 root 账户远程登录此 Lin…

Spark---Spark on Hive

1、Spark On Hive的配置 1&#xff09;、在Spark客户端配置Hive On Spark 在Spark客户端安装包下spark-2.3.1/conf中创建文件hive-site.xml&#xff1a; 配置hive的metastore路径 <configuration><property><name>hive.metastore.uris</name><v…

分享70个节日PPT,总有一款适合您

分享70个节日PPT&#xff0c;总有一款适合您 70个节日PPT下载链接&#xff1a;https://pan.baidu.com/s/1IRIKuFoGjQJ14OVkeW_mDQ?pwd6666 提取码&#xff1a;6666 Python采集代码下载链接&#xff1a;采集代码.zip - 蓝奏云 学习知识费力气&#xff0c;收集整理更不易…

Django回顾【四】之模型层

目录 一、基本使用 1、ORM框架 2、创建表 二、常用和非常用字段 三、常用和非常用字段参数 四、settings配置 五、基本操作 5.1 增加表记录 5.2 删除表纪录 5.3 更新表纪录 5.4 查询表纪录 六、 多表操作-创建关系 七、基于对象的跨表查询 八、基于链表的跨表…

【LeeCode】438.找到字符串中所有字母异位词

给定两个字符串 s 和 p&#xff0c;找到 s 中所有 p 的 异位词 的子串&#xff0c;返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成的字符串&#xff08;包括相同的字符串&#xff09;。 示例 1: 输入: s "cbaebabacd", p "…

服务器数据恢复—ocfs2文件系统被格式化为其他文件系统如何恢复数据?

服务器故障&#xff1a; 由于工作人员的误操作&#xff0c;将Ext4文件系统误装入到存储中Ocfs2文件系统数据卷上&#xff0c;导致原Ocfs2文件系统被格式化为Ext4文件系统。 由于Ext4文件系统每隔几百兆就会写入文件系统的原始信息&#xff0c;原Ocfs2文件系统数据会遭受一定程度…

TCP/IP的体系结构

目录 一、TCP/IP的体系结构 二、TCP/IP四层协议的表示方法举例 三、现在因特网使用的TCP/IP体系结构 四、互联网应用层的客户——服务器方式 一、TCP/IP的体系结构 二、TCP/IP四层协议的表示方法举例 三、现在因特网使用的TCP/IP体系结构 四、互联网应用层的客户——服务器…

项目中枚举的进阶用法(携带Java原理分析)

目录 1 枚举的普通用法1.1 无参1.2 单个参数1.3 两个参数 2 枚举的进阶用法&#xff08;核心&#xff09;2.1 优化2.1.1 需要改造的代码2.1.2 直接使用泛型2.1.3 使用反射---Class2.1.4 反射泛型 2.2 最终效果2.3 思考&#xff1a;类型擦除 遇到项目中这样一种写法&#xff0c;…

Python 围圈报数

题目:有n个人围成一圈&#xff0c;顺序排号。从第一个人开始报数&#xff08;从1到3报数&#xff09;&#xff0c;凡报到3的人退出圈子&#xff0c;问最后留下的是原来第几号的那位。 输入&#xff1a;8 输出&#xff1a;7 用list实现循环遍历的过程 import copy a[1,2,3,4…

SpringBoot Logback配置文件引入子配置文件

主项目Logback logback-spring-dev.xml <configuration><include resource"org/springframework/boot/logging/logback/defaults.xml" /><include resource"logback-child-log.xml" /><springProperty scope"context" na…

NowCoder | KY11 二叉树遍历

NowCoder | KY11 二叉树遍历 OJ链接 简单来说就是构建这个二叉树定义结构体通过递归方式根据输入的字符串构建二叉树。对于输入字符串中的每个字符&#xff0c;如果是 ‘#’ 表示空节点&#xff0c;否则创建一个新节点&#xff0c;并递归地构建左右子树。 #include <limit…

24V转12V

24V转12V电源芯片是一种高效率、高稳定性的电源转换解决方案。它能够将输入电压范围为直流3.2V至36V的电能转换为输出电压范围为直流1.25V至35V的电能&#xff0c;且具有大92%的转换效率和3A的大输出电流。132*476I*OOO1 24V转12V电源芯片3A电流输出 可调输出 V*UIC9527 该电源…

微服务--一篇入门kubernets

Kubernetes 1. Kubernetes介绍1.1 应用部署方式演变1.2 kubernetes简介1.3 kubernetes组件1.4 kubernetes概念 2. kubernetes集群环境搭建2.1 前置知识点2.2 kubeadm 部署方式介绍2.3 安装要求2.4 最终目标2.5 准备环境2.6 系统初始化2.6.1 设置系统主机名以及 Host 文件的相互…

ubuntu22.04设置国内源

设置国内源 vim /etc/apt/sources.list deb https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiverse deb-src https://mirrors.aliyun.com/ubuntu/ jammy main restricted universe multiversedeb https://mirrors.aliyun.com/ubuntu/ jammy-secur…

okhttp导致的内存溢出(OOM)sun.security.ssl.SSLSocketImpl

使用分析工具&#xff1a;MAT(Memory Analyzer Tool)、JvisualVM占用内存&#xff1a;sun.security.ssl.SSLSocketImpl 一、 项目场景&#xff1a; 功能&#xff1a;一个定时任务(xxl-job)采用线程池的方式多线程请求第三方拉取数据&#xff0c;网络框架使用okhttp3。 问题&am…

爬虫概念、基本使用及一个类型和六个方法(一)

目录 一、爬虫简介 1.什么是爬虫 2.爬虫的核心 3.爬虫的用途 4.爬虫的分类 5.反爬手段 二、Urllib基本使用 1.导入我们需要的包 2.定义一个url 3.模拟浏览器向服务器发送请求 4.获取响应中的页面的源码 5.打印数据 三、一个类型和六个方法 1.定义url&#xff0c;并…

代码级接口测试与单元测试的区别

关于接口测试 接口测试是一个比较宽泛的概念, 近几年在国内受到很多企业和测试从业者的追捧, 尤其是上层的UI在取悦用户的过程中迭代更新加快, UI自动化维护成本急剧上升的时代, 大家便转向了绕过前端的接口层面进行测试. 但是很多人, 对接口测试的理解并不完整, 事实上, 我们…

【数据结构】最短路径——Floyd算法

一.问题描述 给定带权有向图G&#xff08;V&#xff0c;E&#xff09;&#xff0c;对任意顶点 V &#xff08;ij)&#xff0c;求顶点到顶点的最短路径。 转化为&#xff1a; 多源点最短路径求解问题 解决方案一&#xff1a; 每次以一个顶点为源点调用Dijksra算法。时间复杂…

基于yolov8-道路裂缝检测

1 介绍 本文主要是搜集数据&#xff0c;从网上kaggle等网站找了2000多张图片&#xff0c;然后使用yolov8模型进行训练&#xff0c;最后只展示训练过程中的图片&#xff0c;如果有需要&#xff0c;可以联系&#xff1a;https://docs.qq.com/doc/DWEtRempVZ1NSZHdQ。

在线学习平台-需求分析(Java)

需求分析 研发集管理员、教务、教师、学生四种权限一体的中后台教务服务管理系统。其中管理员能够开设账号与角色分配&#xff0c;控制系统权限&#xff1b;教务能够进行班级管理、学员管理&#xff1b;教师能够进行课程与教学资源发布、作业发布与批改&#xff1b;学生能够观…