全网最详细的mybatis plus 条件构造器queryWrapper学习,比如and(),eq(),or(),like(),between(),orderByAsc()等方法以及分页操作

news2024/12/24 3:09:10

文章目录

  • 1. 引言
  • 2. 结构关系
  • 3. 环境配置
    • 3.1 引入jar包
    • 3.2 创建数据源
    • 3.2 创建User实体类
    • 3.4 创建UserMapper类
    • 3.5 创建UserService类
  • 4. 操作演示
  • 5. 注意事项

1. 引言

mybatis大家都有使用过,既面向对象又灵活可配。不友好的地方是,会随着使用出现大量xml文件和SQL语句。

此时,mybatis-plus应运而生,对mybatis做了无侵入增强,还可以简化SQL语句,或者不写SQL语句。

  1. MyBatis-Plus官网:https://mp.baomidou.com

  2. MyBatis-Plus官方文档:https://baomidou.com/pages

  3. 码云项目地址:https://gitee.com/baomidou/mybatis-plus

  4. GitHub地址:https://github.com/baomidou/mybatis-plus

  5. MyBatis-Plus开发组织:https://gitee.com/baomidou

2. 结构关系

queryWrappermybatis plus中实现查询的对象封装操作类,其层级关系如下:

在这里插入图片描述

上图的字段解释:

  • Wrapper: 条件构造抽象类,最顶端父类,抽象类中提供4个方法西面贴源码展示

  • AbstractWrapper: 用于查询条件封装,生成sqlwhere条件

  • AbstractLambdaWrapperLambda语法使用Wrapper统一处理解析lambda获取column

  • LambdaQueryWrapper:看名称也能明白就是用于Lambda语法使用的查询Wrapper

  • LambdaUpdateWrapperLambda更新封装Wrapper

  • QueryWrapperEntity对象封装操作类,不是用lambda语法

  • UpdateWrapperUpdate条件封装,用于Entity对象更新操作

3. 环境配置

3.1 引入jar包

<properties>
 	<java.version>1.8</java.version>
 	<baomidouMybatisPlus.version>3.5.2</baomidouMybatisPlus.version>
</properties>

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>${baomidouMybatisPlus.version}</version>
</dependency>

3.2 创建数据源

CREATE TABLE `user`  (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(255) NOT NULL,
  `nick_name` varchar(255) NOT NULL,
  `age` int(11) NULL DEFAULT NULL,
  PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 5 CHARACTER SET = utf8;

INSERT INTO `user` VALUES (1, 'chenxier', '陈希尔', 18);
INSERT INTO `user` VALUES (2, 'zhangsan', '张三', 22);
INSERT INTO `user` VALUES (3, 'lisi', '李四', 20);
INSERT INTO `user` VALUES (4, 'wanger', '王二', 23);

3.2 创建User实体类

如果User实体类中的某属性名称和数据表中对应的字段名称一致,TableField注解可写可不写。

/**
 * @author 念兮为美
 * @create 2020-05-29 10:00
 */
@AllArgsConstructor
@NoArgsConstructor
@Data
@TableName("user")
public class User implements Serializable {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  private int id;
  private String username;
  @TableField(value = "nick_name")
  private String nickname;
  private Integer age;
}

3.4 创建UserMapper类

因为UserMapper继承BaseMapper接口后,无需编写userMapper.xml文件,即可获得CRUD功能,如下所示:

/**
 * @author 念兮为美
 * @create 2020-05-29 10:13
 */
@Mapper
public interface UserMapper extends BaseMapper<User> {

}

3.5 创建UserService类

/**
 * @author 念兮为美
 * @create 2020-05-29 10:54
 */
public class UserService extends ServiceImpl<UserMapper, User> {
  @Resource public UserMapper userMapper;
}

4. 操作演示

上述环境搭建完成后,我们即可实现queryWrapper的相关操作,如下列出常见的使用场景。

  1. 分页查询

queryWrapper做分页查询以及查询时的注意事项,在我的这篇博文中写的很详细,可以点击链接查看:详解Mybatis-Plus中分页插件PaginationInterceptor, MybatisPlusInterceptor在SpringBoot中的使用

  1. or查询

我们在使用queryWrapper的or查询时,这里存在一个小小的坑,可以参考我的这篇博文,写的很详细:mybatis框架中的queryWrapper的or查询,联想到MySQL中and 和or的关系

  1. eq查询

如下代码所示:

@Test
void contextLoads() {
  QueryWrapper queryWrapper = new QueryWrapper();
  queryWrapper.eq("username","chenxier");
  User one = userService.getOne(queryWrapper);
  System.out.println(JSONUtil.toJsonPrettyStr(one));
}

输出结果:

JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@6212dc7d] will not be managed by Spring
==>  Preparing: SELECT id,username,nick_name,age FROM user WHERE (username = ?)
==> Parameters: chenxier(String)
<==    Columns: id, username, nick_name, age
<==        Row: 1, chenxier, 陈希尔, 18
<==      Total: 1
  1. like查询

如下代码所示:

@Test
void contextLoads() {
  QueryWrapper queryWrapper = new QueryWrapper();
  queryWrapper.like("username","chenxier");
  User one = userService.getOne(queryWrapper);
  System.out.println(JSONUtil.toJsonPrettyStr(one));
}

从输出结果可以看到,如果我们使用.like方法时,querywrapper会自动加上%searchParam%,如下所示:

JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@4833bb83] will not be managed by Spring
==>  Preparing: SELECT id,username,nick_name,age FROM user WHERE (username LIKE ?)
==> Parameters: %chenxier%(String)
<==    Columns: id, username, nick_name, age
<==        Row: 1, chenxier, 陈希尔, 18
<==      Total: 1
  1. likeLeftlikeRight

    • likeLeft%查询,比如username like '%san'

    • likeRight%查询,比如username like 'zhang%'

具体如下代码所示:

@Test
void contextLoads() {
  QueryWrapper queryWrapper = new QueryWrapper();
  queryWrapper.likeLeft("username","san");
  queryWrapper.likeRight("username","zhang");
  User one = userService.getOne(queryWrapper);
  System.out.println(JSONUtil.toJsonPrettyStr(one));
}

输出结果如下:

JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@3d4ea4cf] will not be managed by Spring
==>  Preparing: SELECT id,username,nick_name,age FROM user WHERE (username LIKE ? AND username LIKE ?)
==> Parameters: %san(String), zhang%(String)
<==    Columns: id, username, nick_name, age
<==        Row: 2, zhangsan, 张三, 22
<==      Total: 1
  1. between查询

如下代码所示:

@Test
void contextLoads() {
  QueryWrapper queryWrapper = new QueryWrapper();
  queryWrapper.between("age",20,23);
  List list = userService.list(queryWrapper);
  System.out.println(JSONUtil.toJsonPrettyStr(list));
}

根据输出结果可以看到,between查询是左闭右闭,即age >= 20 and age <= 23,如下所示:

JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@c9a8e12] will not be managed by Spring
==>  Preparing: SELECT id,username,nick_name,age FROM user WHERE (age BETWEEN ? AND ?)
==> Parameters: 20(Integer), 23(Integer)
<==    Columns: id, username, nick_name, age
<==        Row: 2, zhangsan, 张三, 22
<==        Row: 3, lisi, 李四, 20
<==        Row: 4, wanger, 王二, 23
<==      Total: 3
  1. orderByAscorderByDesc排序

    • orderByAsc 升序排列

    • orderByDesc 降序排列

具体如下代码所示:

@Test
void contextLoads() {
  QueryWrapper queryWrapper = new QueryWrapper();
  queryWrapper.orderByAsc("age");
  queryWrapper.orderByDesc("id");
  List list = userService.list(queryWrapper);
  System.out.println(JSONUtil.toJsonPrettyStr(list));
}

从输出结果可以看到,先按age升序,如果age相同则按id降序排列,如下所示:

JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@10bf2726] will not be managed by Spring
==>  Preparing: SELECT id,username,nick_name,age FROM user ORDER BY age ASC,id DESC
==> Parameters: 
<==    Columns: id, username, nick_name, age
<==        Row: 1, chenxier, 陈希尔, 18
<==        Row: 3, lisi, 李四, 22
<==        Row: 2, zhangsan, 张三, 22
<==        Row: 4, wanger, 王二, 23
<==      Total: 4

5. 注意事项

由于querywrapper的方法较多,大家可以参考如下表格进行实际操作。

在这里插入图片描述

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

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

相关文章

C++之缺省参数以及C++的输入输出

文章目录前言一、缺省参数的定义二、缺省参数的分类1.全缺省参数2.半缺省参数三、缺省参数的注意事项1. 半缺省参数必须从右往左依次来给出&#xff0c;不能间接给缺省值2. 缺省参数不能在函数声明和定义中同时出现3. 缺省值必须是常量或者全局变量4. C语言不支持四、C的输入&a…

考虑实时市场联动的电力零售商鲁棒定价策略(Matlab代码实现)

&#x1f468;‍&#x1f393;个人主页&#xff1a;研学社的博客 &#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜…

JavaEE初阶第三课:网络初识

欢迎来到javaee初阶的第三课&#xff0c;这节课我会带大家来初识网络 荔枝目录1.认识IP和端口1.1 IP1.2端口2.认识协议2.1协议分层&#xff08;TCP/IP协议&#xff09;2.2封装与分用2.3两台主机之间的网络通信流程&#xff08;非同一网段&#xff09;3.其他常见名词 解释3.1客户…

电脑老是蓝屏是什么原因?怎么修复蓝屏

电脑老是蓝屏是什么原因&#xff1f;其实电脑蓝屏的原因是有很多种的&#xff0c;每个地方出问题都会导致电脑蓝屏&#xff0c;所以我们要想知道蓝屏的原因&#xff0c;那么就需要一步步的去检测&#xff0c;去排除掉一些可能&#xff0c;才能得出正确的蓝屏原因的答案。 一.什…

MATLAB 数组计算

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

Java字典注解的简单实现(AOP)

需求来源 在开发过程中&#xff0c;必不可少会用到字典&#xff0c;例如&#xff0c;数据库字段性别字段可能是这样的&#xff1a;1&#xff1a;男&#xff1b;2&#xff1a;女&#xff0c;在数据存储的时候用1和2&#xff0c;但是在前端展示的时候需要使用男和女&#xff0c;…

有没有人像我一样每次面对sql都很痛苦

今天又操作了一遍sql&#xff0c;这世界上有没有人像我一样&#xff0c;每一次面对mysql都是一次痛苦的经历。 不知道别人怎么想&#xff0c;反正我是这样的。使用mysql从来没有让我快乐过。在数据库里面&#xff0c;最喜欢mongo&#xff0c;当然我也只会mongo。但是每一次使用…

NL-meals、BM3D

常用的高斯滤波或者均值滤波相对都比较简单&#xff0c;即每个窗口的滤波核都是一样的。稍微复杂一些保边滤波如&#xff0c;双边滤波和导向图滤波等。这里介绍几种ffmpeg里面包含的相对比较复杂的滤波算法。计算量不可谓不小。可以通过ffmpeg查看源码实现过程&#xff0c;这里…

RHCE(防火墙)

文章目录一、什么是防火墙二、iptables三、firewalld四、作业一、什么是防火墙 防火墙&#xff1a;防火墙是位于内部网络和外部网络之间的屏障&#xff0c;它按照系统管理员预先定义的规则来控制数据包的进出 防火墙可以分为硬件防火墙和软件防火墙。硬件防火墙是由厂商设计好的…

LongAdder/LongAccumulator类分析

一、LongAdder简介 1.下图是JDK-API文档的的截图信息 我们可以得知这两个类都是1.8开始提供的&#xff0c;并且都具有顶级的并发性。这两类的区别点主要在于LongAdder初始值为0&#xff0c;只能做累加操作&#xff0c;而LongAccumulator可以完成一些复杂的计算&#xff0c;本…

软件设计师考试整理-0-前言

1. 整理初衷 2022年下半年的软考成绩出来了&#xff0c;查了一下&#xff0c;上午58分&#xff0c;下午61分&#xff0c;虽然不高&#xff0c;但是也过了&#xff0c;还是值得开心的&#xff0c;毕竟在最初报考的时候&#xff0c;会的知识点寥寥无几。 先解释下为什么我会报考…

富勒烯C60,131159-39-2,水溶性富勒烯,CARBON C60

产品描述&#xff1a;富勒烯C60与金刚石、石墨是碳的三种同素异形体&#xff0c;富勒烯分子是一种由60个碳原子结合形成的稳定分子&#xff0c;它具有60个顶点和32个面&#xff0c;其中12个为正五边形&#xff0c;20个为正六边形&#xff0c;它形似足球&#xff0c;所以又称为富…

OpenMMLab AI实战营Day2 图像分类

目录 一、图像分类 二、卷积神经网络 三、超越ResNet的图像分类模型 1、神经结构搜索 2、Transformer 3、ConvNext 四、轻量化神经网络 五、Vision Transformer 六、模型学习 七、学习率与优化器调整策略 八、数据增强 一、图像分类 图像分类&#xff1a;识别图像中…

网络骗局丨典型案例分析,大家一起来避雷!

作者&#xff1a;黑蛋因为疫情的困扰&#xff0c;总体经济都不是很好&#xff0c;春节前后&#xff0c;网络诈骗高发期&#xff0c;以下是几种典型案例&#xff0c;一起来看看。比较常见的有以下几种&#xff1a;1、网络购物骗局小红在某平台网购一件产品&#xff0c;几天后&am…

Nacos+Springcloud+mybatis-plus+oracle的整合

NacosSpringcloudmybatis-plusoracle的整合 1、项目结构 2、父类的依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance&q…

shell脚本基本使用

目录 1.是什么&#xff1f; 2.写法 3.shell脚本语法 3.1第一个shell脚本 3.2交互式shell脚本 3.3shell脚本的数值计算 3.4test命令 3.5中括号【】判断符 3.6默认变量 4.shell脚本条件判断 4.1 if fi 4.2 if then else 4.3 if elif else 4.4 case 5.shell脚本函数…

Linux 学习笔记 正则、管道、进程与任务定时

一、筛选与搜索 1.1 grep 命令 筛选数据 grep 是 Globally search a regular expression and print 的缩写。意思是全局搜索一个正则表达式&#xff0c;并且打印。 考虑这样的一个名为 a.txt 的文件&#xff1a; 执行 grep apple ./a.txt 即可匹配所有含有 apple 的字符 默认…

IDEA搭建Finchley.SR2版本的SpringCloud父子基础项目-------zuul和SpringConfig

1.Zuul是什么 Zuul包含了对请求的路由和过滤两个最主要的功能&#xff1a; 其中路由功能负责将外部请求转发到具体的微服务实例上&#xff0c;是实现外部访问统一入口的基础而过滤器功能则负责对请求的处理过程进行干预&#xff0c;是实现请求校验、服务聚合等功能的基础. Zu…

4款实用的办公软件,每一款都让你效率翻倍,相见不易

称心的电脑使用体验&#xff0c;总离不开实用的工具&#xff0c;一款高效的工具&#xff0c;能让你的办公体验翻倍。 1、Mem Reduct 这是一款强大到离谱的电脑清理工具&#xff0c;比某安全卫士实用多&#xff0c;没有任何弹屏广告&#xff0c;完全免费使用&#xff0c;内存清理…

搜索算法基础

一 DFS 深度优先搜索算法&#xff08;Depth First Search&#xff0c;简称DFS&#xff09;&#xff1a;一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点&#xff0c;尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件&#xff0c;搜…