Mybatais-plus超详细教程

news2025/3/1 0:35:57

文章目录

  • 前言
  • 什么是Mybatis-plus
  • 特性
  • 引入依赖
  • 配置日志
  • Service CRUD 接口
    • Save
    • SaveOrUpdate
    • Remove
    • Update
    • Get
    • List
    • Page
    • Count
  • Chain
    • query
    • update
  • Mapper CRUD 接口
    • Insert
    • Delete
    • Update
    • Select
  • 赠送

前言

在学习Mybatis-plus之前,这里默认大家都已经对mybatis使用有了一定的了解。都会使用mybatis

什么是Mybatis-plus

MyBatis-Plus(简称 MP)是一个 MyBatis 的一款增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
在这里插入图片描述
我们可以这么理解,就是苞米豆为我们在Mybatis的基础上做了一层封装,减少我们对代码的开发(减少工作量)来完成对数据库的操作

特性

无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑

损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作

强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求

支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错

支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题

支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作

支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )

内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用

内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询

分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库

内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询

内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作

引入依赖

	<dependency>
       <groupId>com.baomidou</groupId>
       <artifactId>mybatis-plus-boot-starter</artifactId>
       <version>3.5.1</version>
   </dependency>

配置日志

默认情况下的所有sql都是不打印的,我们如果调试的时候想要看到所写代码生成的sql,需要在yml文件中配置以下日志规则

#配置日志
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

Service CRUD 接口

注意:
1、通用 Service CRUD 封装IService 接口,进一步封装 CRUD 采用 get 查询单行、remove 删除、list 查询集合、page 分页 前缀命名方式区分Mapper层避免混淆,
2、泛型 T 为任意实体对象
3、如果存在自定义通用 Service 方法的可能,请创建自己的IBaseService继承 Mybatis-Plus 提供的基类对象 Wrapper 为 条件构造器

Save

// 插入一条记录(选择字段,策略插入),entity就是我们要保存的对象
boolean save(T entity);

// 插入(批量),entityList就是我们要保存的对象集合
boolean saveBatch(Collection entityList);

// 插入(批量),bathSize是插入批次数量
boolean saveBatch(Collection entityList, int batchSize);

SaveOrUpdate

// TableId 注解存在更新记录,否插入一条记录
boolean saveOrUpdate(T entity);

// 根据updateWrapper尝试更新,否继续执行saveOrUpdate(T)方法
boolean saveOrUpdate(T entity, Wrapper updateWrapper);

// 批量修改插入
boolean saveOrUpdateBatch(Collection entityList);

// 批量修改插入
boolean saveOrUpdateBatch(Collection entityList, int batchSize);

Remove

// 根据 queryWrapper 设置的条件,删除记录
boolean remove(Wrapper queryWrapper);

// 根据 ID 删除
boolean removeById(Serializable id);

// 根据 columnMap 条件,删除记录
boolean removeByMap(Map<String, Object> columnMap);

// 删除(根据ID 批量删除)
boolean removeByIds(Collection<? extends Serializable> idList);

Update

// 根据 UpdateWrapper 条件,更新记录 需要设置sqlset
boolean update(Wrapper updateWrapper);

// 根据 whereWrapper 条件,更新记录
boolean update(T updateEntity, Wrapper whereWrapper);

// 根据 ID 选择修改
boolean updateById(T entity);

// 根据ID 批量更新
boolean updateBatchById(Collection entityList);

// 根据ID 批量更新
boolean updateBatchById(Collection entityList, int batchSize);

Get

// 根据 ID 查询
T getById(Serializable id);

// 根据 Wrapper,查询一条记录。结果集,如果是多个会抛出异常,随机取一条加上限制条件 wrapper.last(“LIMIT 1”)
T getOne(Wrapper queryWrapper);

// 根据 Wrapper,查询一条记录
T getOne(Wrapper queryWrapper, boolean throwEx);

// 根据 Wrapper,查询一条记录
Map<String, Object> getMap(Wrapper queryWrapper);

// 根据 Wrapper,查询一条记录
V getObj(Wrapper queryWrapper, Function<? super Object, V> mapper);

List

// 查询所有
List list();

// 查询列表
List list(Wrapper queryWrapper);

// 查询(根据ID 批量查询)
Collection listByIds(Collection<? extends Serializable> idList);

// 查询(根据 columnMap 条件)
Collection listByMap(Map<String, Object> columnMap);

// 查询所有列表
List<Map<String, Object>> listMaps();

// 查询列表
List<Map<String, Object>> listMaps(Wrapper queryWrapper);

// 查询全部记录
List listObjs();

// 查询全部记录
List listObjs(Function<? super Object, V> mapper);

// 根据 Wrapper 条件,查询全部记录
List listObjs(Wrapper queryWrapper);

// 根据 Wrapper 条件,查询全部记录
List listObjs(Wrapper queryWrapper, Function<? super Object, V> mapper);

Page

// 无条件分页查询
IPage page(IPage page);

// 条件分页查询
IPage page(IPage page, Wrapper queryWrapper);

// 无条件分页查询
IPage<Map<String, Object>> pageMaps(IPage page);

// 条件分页查询
IPage<Map<String, Object>> pageMaps(IPage page, Wrapper queryWrapper);

Count

// 查询总记录数
int count();

// 根据 Wrapper 条件,查询总记录数
int count(Wrapper queryWrapper);

Chain

query

// 链式查询 普通
QueryChainWrapper query();

// 链式查询 lambda 式。注意:不支持 Kotlin
LambdaQueryChainWrapper lambdaQuery();

// 示例:
query().eq(“column”, value).one();
lambdaQuery().eq(Entity::getId, value).list();

update

// 链式更改 普通
UpdateChainWrapper update();

// 链式更改 lambda 式。注意:不支持 Kotlin
LambdaUpdateChainWrapper lambdaUpdate();

// 示例:
update().eq(“column”, value).remove();
lambdaUpdate().eq(Entity::getId, value).update(entity);

Mapper CRUD 接口

注意:
1、通用 CRUD 封装BaseMapper (opens new window)接口,为 Mybatis-Plus 启动时自动解析实体表关系映射转换为 Mybatis 内部对象注入容器
泛型 T 为任意实体对象
2、参数 Serializable 为任意类型主键 Mybatis-Plus 不推荐使用复合主键约定每一张表都有自己的唯一 id 主键
3、对象 Wrapper 为 条件构造器

Insert

// 插入一条记录
int insert(T entity);

Delete

// 根据 entity 条件,删除记录
int delete(@Param(Constants.WRAPPER) Wrapper wrapper);

// 删除(根据ID 批量删除)
int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);

// 根据 ID 删除
int deleteById(Serializable id);

// 根据 columnMap 条件,删除记录
int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);

Update

// 根据 whereWrapper 条件,更新记录
int update(@Param(Constants.ENTITY) T updateEntity, @Param(Constants.WRAPPER) Wrapper whereWrapper);

// 根据 ID 修改(在调用updateById方法前,需要在T entity(对应的实体类)中的主键属性上加上@TableId注解。)
int updateById(@Param(Constants.ENTITY) T entity);

Select

// 根据 ID 查询
T selectById(Serializable id);

// 根据 entity 条件,查询一条记录
T selectOne(@Param(Constants.WRAPPER) Wrapper queryWrapper);

// 查询(根据ID 批量查询)
List selectBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> idList);

// 根据 entity 条件,查询全部记录
List selectList(@Param(Constants.WRAPPER) Wrapper queryWrapper);

// 查询(根据 columnMap 条件)
List selectByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);

// 根据 Wrapper 条件,查询全部记录
List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper queryWrapper);

// 根据 Wrapper 条件,查询全部记录。注意: 只返回第一个字段的值
List selectObjs(@Param(Constants.WRAPPER) Wrapper queryWrapper);

// 根据 entity 条件,查询全部记录(并翻页)
IPage selectPage(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper);

// 根据 Wrapper 条件,查询全部记录(并翻页)
IPage<Map<String, Object>> selectMapsPage(IPage page, @Param(Constants.WRAPPER) Wrapper queryWrapper);

// 根据 Wrapper 条件,查询总记录数
Integer selectCount(@Param(Constants.WRAPPER) Wrapper queryWrapper);

赠送

最后附上文档地址:https://mybatis.plus/guide/
源码地址:https://gitee.com/baomidou/mybatis-plus、
https://github.com/baomidou/mybatis-plus

欢迎大家点击下方卡片,关注《coder练习生》

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

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

相关文章

召回评价指标NDCG、MAP

【MAP】 1、AP A P ∑ i 1 n r e l ( i ) p i AP \sum_{i1}^{n}\frac{rel(i)}{p_i} APi1∑n​pi​rel(i)​ 其中 n 表示候选序列长度&#xff0c; p i p_i pi​表示第 i 个 item 的位置 本质是对每个位置item的分数加一个基于位置的筛选.简单粗暴&#xff0c;直接除以位置…

NeRF与三维重建专栏(三)nerf_pl源码部分解读与colmap、cuda算子使用

前言 上一章中我们介绍了NeRF原理、传统体渲染方法以及两者之间的联系&#xff0c;本章中我们将讲解colmap的安装以及使用&#xff0c;部分nerf_pl源码&#xff0c;同时在开发过程中&#xff0c;由于部分操作python/torch不支持&#xff0c;我们需要自己造轮子&#xff0c;且在…

37 KVM管理设备-管理设备直通

文章目录 37 KVM管理设备-管理设备直通37.1 PCI直通37.2 SR-IOV直通37.2.1 概述37.2.2 操作方法37.2.2.1 开启网卡的SR-IOV模式37.2.2.2 获取PF和VF的PCI BDF信息37.2.2.3 识别和管理PF/VF对应关系37.2.2.4 挂载SR-IOV网卡到虚拟机中 37.2.3 HPRE加速器SR-IOV直通 37 KVM管理设…

IOS上架流程详解,包含审核避坑指南!

准备 开发者账号完工的项目 上架步骤 一、创建App ID二、创建证书请求文件 &#xff08;CSR文件&#xff09;三、创建发布证书 &#xff08;CER&#xff09;四、创建Provisioning Profiles配置文件 &#xff08;PP文件&#xff09;五、在App Store创建应用六、打包上架 一、…

又一运维利器:资源监控微应用

过去几个月&#xff0c;优维在新的资源监控微应用相关能力的研发上投入大量的时间与精力。 上周三&#xff0c;优维专门召开了一场资源监控微应用发布会&#xff0c;介绍了优维的监控微应用的功能亮点和后续规划。 下面就跟着鹿小U一起来具体了解一下。 01 过去&#xff0c…

需求不完备测试解决方案——分布式微服务架构测试实践

1痛点和研究背景 目前随着分布式核心下移和小型机下线的趋势&#xff0c;主流系统架构已逐步演变为CCETDSQL。而在这一演进过程中也陆续暴露出来一些痛点难点问题&#xff0c;需要我们着力解决。为此&#xff0c;我们聚焦于分布式架构下需求、架构、数据这三个方面的痛点问题探…

【Linux驱动】VScode 环境简单配置

在开始编写驱动之前&#xff0c;我们需要保证良好的编码环境&#xff0c;这里编写代码所使用的编辑器是VScode&#xff0c;如果进行环境配置&#xff0c;可能会提示很多错误&#xff0c;比如头文件找不到、内核函数的定义无法跳转等等。 VScode 在这里只作为编辑器使用&#x…

Springboot配置Yml多环境

文章目录 学习链接前言pom.xmlapplication.ymlapplication-dev.yml 开发环境配置application-prod.yml 线上环境配置logback.xml 日志配置 学习链接 easypan Spring Boot手把手教学(2)&#xff1a;使用yml多环境配置和创建多环境profile打包 springboot 配置多环境使用yml配置…

自动化测试介绍和分类,看这一篇就够了

自动化测试介绍及分类 什么是自动化测试? 自动化测试是软件测试活动中一个重要的分支和组成部分,即利用工具或脚本达到测试目的,没有人工或者极少人工参与的软件测试活动称为自动化测试. 自动化测试的优势有哪些? 方便进行回归测试,当软件的版本发布比较频繁的时候,自动化…

平台工程是 DevOps 的未来

Gartner 预测到 2026 年时&#xff0c;将有 80% 的软件工程组织会建立平台团队 DevOps 与平台工程 DevOps 是一种文化和理念。平台工程&#xff0c;是我们实现**“谁构建、谁运行”**的唯一方式。这是 DevOps 的核心初衷&#xff0c;也是后来企业级规模和云原生时代的实现基础…

游泳健身馆预约小程序开发 助力门店拓客引流

暑假快要到了&#xff0c;很多游泳健身馆都想方设法来招揽顾客&#xff0c;其实无论是派发传单还是媒体投放&#xff0c;都不如开发一款游泳健身类预约小程序来的好。因为有了健身游泳小程序系统不仅能够起到很好的推广宣传效果&#xff0c;对于日后的经营发展也有诸多好处。 …

javaEE在2023年5月21知识复盘(一)

今天讲述了doget()、doPost()方法&#xff0c;介绍了里面参数req,resp的一些实用方法 getParameter()获取请求参数 getParameterValues() 返回参数数组 【post方式】 设置编码格式 req-> setCharacterEncoding() resp->SetContent-Type(“text/html;charsetutf-8”) 获取…

SpringBoot + minio实现文件切片极速上传技术(敢说全网整合完整度前三)

一. 概述 提示&#xff1a;请不要多个博客来回跳着看&#xff0c;此文章之详细绝无仅有&#xff0c;融合多家之长&#xff0c;如果遇见报错&#xff0c;请仔细捋一遍文章&#xff0c;不要忽略&#xff01;我在写的时候因为许多文章不全面&#xff0c;来回跳遇见许多坑&#xf…

Java 集合,你肯定也会被问到这些

作为一位小菜 ”一面面试官“&#xff0c;面试过程中&#xff0c;我肯定会问 Java 集合的内容&#xff0c;同时作为求职者&#xff0c;也肯定会被问到集合&#xff0c;所以整理下 Java 集合面试题 说说常见的集合有哪些吧&#xff1f; HashMap说一下&#xff0c;其中的Key需要重…

傻子都能学会的LNMP部署

LNMP 一、安装 Nginx 服务1、安装依赖包2、创建运行用户3、编译安装4、优化路径5、添加 Nginx 系统服务 二、安装 MySQL 服务】1、安装Mysql环境依赖包2、创建运行用户3、编译安装4、修改mysql 配置文件5、更改mysql安装目录和配置文件的属主属组6、设置路径环境变量7、初始化数…

接口测试测什么?一个简单问题把我难住了

那么设计测试用例时我们主要考虑如下几个方面&#xff1a; 一、功能测试 接口的功能是否正确实现了 接口是否按照设计文档中来实现&#xff08;比如username参数写为了user&#xff0c;那么这就不符合&#xff0c;因为接口文档在整个开发中都需要使用&#xff0c;所以接口实…

MEX 文件 ‘lsd.mexw64‘ 无效: 找不到指定的模块。问题解决方法

问题描述 在跑MATLAB和C混合编程的一个算法时&#xff0c;出现了如下错误&#xff1a; MEX 文件 C:\Project\final code\reference code\lsd.mexw64 无效: 找不到指定的模块。 如下图所示&#xff1a; 原因分析 根据资料[1]的说法&#xff0c;*.mexw64文件无效可能的原因是缺…

GitLab从旧服务器迁移到新服务器(空间不足,gitlab安装报错)

注意事项&#xff1a;迁移前首先要保证新旧服务器上的GitLab版本号一致&#xff0c;而且gitlab的包要符合安装的系统gitlab安装&#xff0c;系统与安装包不一致导致的安装错误。 1.查看当前GitLab版本 cat /opt/gitlab/embedded/service/gitlab-rails/VERSION显示为 12.5.5。…

Linux之Ubuntu 22.04实现微信双开

Linux之Ubuntu 22.04实现微信双开 基于deepin-wine仓库安装第一个微信添加仓库安装对应软件包com.qq.weixin.deepin 微信的安装存在的问题补充 Linux下使用模拟器进行微信多开&#xff08;可取&#xff1f;&#xff09;下载Linux模拟器下载完成打开&#xff1a; 安装第二个微信…

zookeeper机制及消息队列kafka集群部署

目录 一、zookeeper1、zookeeper简介2、zookeeper特点3、zookeeper工作模式及机制4、zookeeper应用场景及选举机制5、zookeeper集群部署 二、消息队列kafka1、为什么要有消息队列2、使用消息队列的好处3、kafka简介4、kafka特点5、kafka系统架构名词介绍6、Kafka架构及流程7、k…