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

【JavaEE】MyBatis - Plus

目录

  • 一、快速使用
  • 二、CRUD简单使用
  • 三、常见注解
    • 3.1 @TableName
    • 3.2 @TableFiled
    • 3.3 @TableId
  • 四、条件构造器
    • 4.1 QueryWrapper
    • 4.2 UpdateWrapper
    • 4.3 LambdaQueryWrapper
    • 4.4 LambdaUpdateWrapper
  • 五、自定义SQL

一、快速使用

MyBatis Plus官方文档:MyBatis Plus官方文档

添加依赖:官方文档都有。
Spring Boot 3的依赖:

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.10.1</version>
</dependency>

配置文件:

mybatis-plus:configuration:# MyBatis 配置map-underscore-to-camel-case: trueglobal-config:# 全局配置db-config:# 数据库配置id-type: auto

也要配置数据库:

spring:datasource:url: jdbc:mysql://127.0.0.1:3306/mybatis_test?characterEncoding=utf8&useSSL=falseusername: rootpassword: 1234driver-class-name: com.mysql.cj.jdbc.Driver

再写实体类,

package com.example.mybatisplus.demo.model;import lombok.Data;import java.util.Date;
@Data
public class UserInfo {private Integer id;private String username;private String password;private Byte age;private Byte gender;private String phone;private Byte deleteFlag;private Date createTime;private Date updateTime;}

写Mapper接口,要继承BaseMapper,泛型指代要操作的实体类。

package com.example.mybatisplus.demo.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.mybatisplus.demo.model.UserInfo;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface UserInfoMapper extends BaseMapper<UserInfo> {
}

打印日志配置:

mybatis-plus:configuration:# 配置打印 MyBatis⽇志 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

二、CRUD简单使用

直接调用对应方法即可,方法名十分清晰。

  • 增:



  • 查:

三、常见注解

如果我们的数据库设计是按照蛇形标准来设计数据库名以及字段名的话,驼峰方式命名类属性的话,MyBatis Plus会自动帮我们映射,但是如果有不和规范无法映射的话,就需要使用注解来帮我们映射。

3.1 @TableName

@TableName是类注解,用来表示当前类对应的数据库表名。

通过错误日志可以看见mybatis-Plus是通过我们的类名去找表名的,当不符合规范就会找不到,但是加上@TableName注解讲明表名,就可以找到。

3.2 @TableFiled

@TableFiled注解这个是属性注解,跟@TableName作用一样,是用来对应当不符合规范命名时,对应类属性与数据库表字段的。

 @TableField("update_time")private Date updateTime;

3.3 @TableId

@TableId注解,是用来对应主键的。MyBatis - Plus默认主键是id,但是如果主键不是,就可以加上该注解表明这是主键对应的属性。还可以用 @TableId注解的type属性来设置当前是否是自增的。

    @TableId(value = "id",type = IdType.AUTO)private Integer id;

四、条件构造器

前面介绍的都是简单的CRUD,在实际的应⽤场景中,我们还需要使⽤更复杂的操作,MyBatisPlus也给我们提供了相应的⽀持。
MyBatis-Plus 提供了⼀套强⼤的条件构造器(Wrapper),⽤于构建复杂的数据库查询条件。Wrapper 类允许开发者以链式调⽤的⽅式构造查询条件,⽆需编写繁琐的 SQL 语句, 从⽽提⾼开发效率并减少 SQL注⼊的⻛险。

以下是主要的 Wrapper 类及其功能:

  • AbstractWrapper:这是⼀个抽象基类,提供了所有 Wrapper 类共有的⽅法和属性。详情看官网
  • QueryWrapper:⽤于构造查询条件,在AbstractWrapper的基础上拓展了⼀个select⽅法,允许指定查询字段。
  • UpdateWrapper: ⽤于构造更新条件,可以在更新数据时指定条件。
  • LambdaQueryWrapper:基于 Lambda 表达式的查询条件构造器,它通过 Lambda 表达式来引⽤实体类的属性,从⽽避免了硬编码字段名。
  • LambdaUpdateWrapper:基于 Lambda 表达式的更新条件构造器, 它允许你使⽤ Lambda 表达式来指定更新字段和条件,同样避免了硬编码字段名的问题。

介绍一些简写过的方法:

  • lt : “less than” 的缩写,表⽰⼩于.
  • le : "less than or equal to"的缩写, 表⽰⼩于等于
  • ge : “greater than or equal to” 的缩写, 表⽰⼤于等于.
  • gt : “greater than” 的缩写, 表⽰⼤于.
  • eq : “equals” 的缩写, 表⽰等于.
  • ne : “not equals” 的缩写, 表⽰不等于.

4.1 QueryWrapper

QueryWrapper并不只⽤于查询语句, ⽆论是修改, 删除, 查询,后面需要跟条件查询的时候都可以使⽤QueryWrapper来构建查询条件。

例如下面的sql语句:

select id,username, password, age, gender from `user_info` where age = 18 and username  like "%s%"

结果如下:

当我们使用QueryMapper对应的代码如下:

@Testpublic void selectByCondition() {QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();queryWrapper.select(" id","username", "password", "age", "gender").eq("age",18).like("username","s");System.out.println(userInfoMapper.selectList(queryWrapper));}

结果:

默认情况下Mybatis-Plus会根据 @TableFiled ⽣成别名, 当指定了QueryWrapper的select属性后就仅仅是属性值⽽没有了别名. 查询出来的结果会对应不上
解决办法:

  1. ⾃⼰写⾃定义SQL
  2. 实体类名和字段名保持⼀致
  3. 不指定QueryWrapper的select字段
  4. 使⽤LambdaQueryWrapper实现

4.2 UpdateWrapper

完成下面的sql语句:

update user_info set delete_flag = 1, age = age + 10 where id in(1,2,3)

运行前数据:

使用UpdateWrapper的代码:

@Testpublic void updateByCondition() {UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<>();updateWrapper.set("delete_flag",1).setSql("age = age + 10").in("id", List.of(1,2,3));userInfoMapper.update(updateWrapper);}

运行后结果:

4.3 LambdaQueryWrapper

LambdaQueryWrapper是基于Lambda表达式的条件构造器,它通过 Lambda 表达式来引⽤实体类的属性,从⽽避免了硬编码字段名。也提⾼了代码的可读性和可维护性。

查询下面的sql

select id,username, password, age, gender from `user_info` where age = 28 and username  like "%s%"

结果:

对应的使用LambdaQueryWrapper的代码:

    @Testpublic void selectByCondition2() {LambdaQueryWrapper<UserInfo> lambdaQueryWrapper = new LambdaQueryWrapper<>();lambdaQueryWrapper.select(UserInfo::getId, UserInfo::getUsername, UserInfo::getPassword,UserInfo::getAge,UserInfo::getGender, UserInfo::getDeleteFlag).eq(UserInfo::getAge,28).like(UserInfo::getUsername,"s");System.out.println(userInfoMapper.selectList(lambdaQueryWrapper));}

结果:

4.4 LambdaUpdateWrapper

update user_info set delete_flag = 1, age = age - 10 where id in(1,2,3)

运行前数据:

对应使用LambdaUpdateWrapper代码:

@Testpublic void updateByCondition2() {LambdaUpdateWrapper<UserInfo> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();lambdaUpdateWrapper.set(UserInfo::getDeleteFlag, 1).setSql("age = age - 10").in(UserInfo::getId, List.of(1,2,3));userInfoMapper.update(lambdaUpdateWrapper);}

执行结果:

五、自定义SQL

官方文档,MyBatis Plus官方文档介绍自定义SQL如下:

示例一:
SQL语句:

select id,username, password, age from `user_info` where age = 18 or username  like "%s%"

结果:

代码:

@Select(" select id,username, password, age from user_info  ${ew.customSqlSegment}")List<UserInfo> select (@Param(Constants.WRAPPER) Wrapper<UserInfo> wrapper);

测试代码:

    @Testvoid testSelect() {QueryWrapper<UserInfo> queryWrapper = new QueryWrapper<>();queryWrapper.eq("age",18).or().like("username","s");userInfoMapper.select(queryWrapper);}

结果:

示例二:
执行的SQL语句:

update user_info set delete_flag = 0, age = age + 10 where id in(1,2,3)

原始数据:

xml代码:

    <update id="update">update user_info set delete_flag = 0, age = age + #{age} ${ew.customSqlSegment}</update>

测试代码:

    @Testvoid testUpdate() {UpdateWrapper<UserInfo> updateWrapper = new UpdateWrapper<>();updateWrapper.in("id", List.of(1,2,3));userInfoMapper.update(10,updateWrapper);}

结果:

相关文章:

【JavaEE】MyBatis - Plus

目录 一、快速使用二、CRUD简单使用三、常见注解3.1 TableName3.2 TableFiled3.3 TableId 四、条件构造器4.1 QueryWrapper4.2 UpdateWrapper4.3 LambdaQueryWrapper4.4 LambdaUpdateWrapper 五、自定义SQL 一、快速使用 MyBatis Plus官方文档&#xff1a;MyBatis Plus官方文档…...

经典卷积神经网络LeNet实现(pytorch版)

LeNet卷积神经网络 一、理论部分1.1 核心理论1.2 LeNet-5 网络结构1.3 关键细节1.4 后期改进1.6 意义与局限性二、代码实现2.1 导包2.1 数据加载和处理2.3 网络构建2.4 训练和测试函数2.4.1 训练函数2.4.2 测试函数2.5 训练和保存模型2.6 模型加载和预测一、理论部分 LeNet是一…...

【2】数据结构的单链表章

目录标题 单链表的定义单链表的初始化单链表的建立头插法创建尾插法创建 查找操作按序号查找按内容查找 插入操作删除操作合并操作 单链表总代码与调试 单链表的定义 结点&#xff08;Node&#xff09;的定义&#xff1a;数据域&#xff08;data&#xff09;和指针域&#xff…...

Linux(十一)fork实例练习、文件操作示例及相关面试题目分享

一、fork实例练习 1、思考下面这段代码的打印结果是什么&#xff1f; #include<stdio.h> #include<unistd.h> #include<assert.h> #include<stdlib.h>int main(){int i0;for(;i<2;i){fork();printf("A\n");} exit(0); }所以一共打印6…...

android Fragment使用

在 Android Fragment 中&#xff0c;导入 id&#xff08;findViewById&#xff09;并给控件赋值的逻辑通常应该写在 onViewCreated() 方法中&#xff0c;而不是 onCreateView()。 Fragment 生命周期 & 适合的位置 方法作用适合的操作onCreateView()创建并返回 Fragment 的…...

open3d教程 (三)点云的显示

官方文档位置&#xff1a; Visualization - Open3D 0.19.0 documentationhttps://www.open3d.org/docs/release/tutorial/visualization/visualization.html核心方法&#xff1a; o3d.visualization.draw_geometries([几何对象列表]) import open3d as o3dprint("Load …...

根据模板将 Excel 明细数据生成 Txt 文档|邮件合并

在日常办公中&#xff0c;我们常常会遇到需要批量生成文档的任务。以往&#xff0c;若要将 Excel 中的每一条数据都转化为单独的文档&#xff0c;且文档部分内容依据 Excel 数据动态变化&#xff0c;手动操作不仅繁琐&#xff0c;还容易出错。现在&#xff0c;有一种便捷的方法…...

【学Rust写CAD】22 双圆径向渐变的结构体(two_circle_radial_gradient.rs)

源码 //two_circle_radial_gradient.rs //! 定义双圆径向渐变的结构体和相关功能/// 表示一个双圆径向渐变的源 /// /// 该结构体描述了两个圆之间的渐变&#xff0c;支持矩阵变换和颜色查找表优化 #[derive(Debug, Clone, PartialEq)] pub struct TwoCircleRadialGradientSou…...

LVGL Dropdown和Calendar详解

LVGL Dropdown和Calendar详解 一、Dropdown详解创建和初始化设置下拉框选项获取选项获取选中项文本&#xff1a;获取选中项索引&#xff1a;设置选中项&#xff1a; 事件处理其他功能和样式设置设置下拉按钮样式&#xff1a;设置下拉框方向&#xff1a;设置最大高度&#xff1a…...

AISEO (GEO )中的知识图谱

一、知识图谱在AI SEO中的概念与结构 1. 知识图谱是什么&#xff1f; 定义&#xff1a;知识图谱&#xff08;Knowledge Graph&#xff09;是一种以图结构组织的语义网络&#xff0c;由实体&#xff08;Entity&#xff09;、**关系&#xff08;Relation&#xff09;和属性&…...

Vulnhub-zico2靶机打靶记录

本篇文章旨在为网络安全渗透测试靶机教学。通过阅读本文&#xff0c;读者将能够对渗透Vulnhub系列zico2靶机有一定的了解 一、信息收集阶段 靶机下载地址&#xff1a;https://download.vulnhub.com/zico/zico2.ova 因为靶机为本地部署虚拟机网段&#xff0c;查看dhcp地址池设…...

(041)05-01-自考数据结构(20331)树与二叉树大题总结

实际考试中,计算题约占40%,推理题约占30%,算法设计题约占30%。建议重点练习遍历序列相关的递归分治解法, 知识拓扑 知识点介绍 一、计算题类型与解法 1. 结点数量计算 题型示例: 已知一棵完全二叉树的第6层有8个叶子结点,求该二叉树最多有多少个结点? 解法步骤: 完…...

Python----机器学习(KNN:使用数学方法实现KNN)

一、原理 以下是K最近邻&#xff08;K-Nearest Neighbors&#xff0c;简称KNN&#xff09;算法的基本流程&#xff0c;用于对给定点进行分类预测。 1. 获得要预测的点 point_predict 。 2. 计算训练点集 point_set_train 中各点到要预测的点 表 l ist_L2_distance 。 3. 对 poi…...

网络攻防快速入门笔记pwn | 02 栈溢出题型 | 2.2 ret2libc

上一篇&#xff1a;网络攻防快速入门笔记pwn | 02 栈溢出题型 | 2.1 ret2text和ret2shellcode 下一篇&#xff1a;网络攻防快速入门笔记pwn | 02 栈溢出题型 | 2.3 ret2syscall 欢迎关注~ ret2libc 一、 什么是ret2libc&#xff08;一&#xff09;ret2lib的概念&#xff08;…...

Edge浏览器快速开启IE模式

一些老旧的网站&#xff0c;仅支持Internet Explorer&#xff08;IE&#xff09;浏览器访问。 然而&#xff0c;出于安全性的考虑&#xff0c;可能会遇到限制IE浏览器使用的情况。 Microsoft Edge浏览器提供了兼容性配置&#xff0c;可以通过IE模式访问这些网站。 以下是两种…...

技术长期主义:用本分思维重构JavaScript逆向知识体系(一)Babel、AST、ES6+、ES5、浏览器环境、Node.js环境的关系和处理流程

基础不牢&#xff0c;地动山摇&#xff0c;逆向越久&#xff0c;越发现基础的重要性&#xff0c;本系列&#xff0c;回顾js逆向基础&#xff0c;让自己的知识体系更加系统化。 以下是 Babel、AST、ES6、ES5、浏览器环境、Node.js环境 的关系和流程的详细说明及图表&#xff1a;…...

Oracle 数据库系统全面详解

Oracle 数据库是全球领先的关系型数据库管理系统(RDBMS)&#xff0c;由 Oracle 公司开发。它为企业级应用提供了高性能、高可用性、安全性和可扩展性的数据管理解决方案。 目录 一、Oracle 数据库体系结构 1. 物理存储结构 主要组件&#xff1a; 存储层次&#xff1a; 2. …...

LeetCode 解题思路 29(Hot 100)

解题思路&#xff1a; 映射关系建立&#xff1a;创建一个哈希表存储数字到字母的映射。递归参数&#xff1a; 给定字符串 digits、结果集 result、当前路径 path、当前位置 start。递归过程&#xff1a; 当当前位置 start 等于 digits 长度时&#xff0c;说明已经遍历完 digi…...

使用Python解析PPT文件并生成JSON结构详解

引言 PowerPoint&#xff08;PPT&#xff09;文件的自动化处理是办公自动化和数据提取的常见需求。本文将介绍如何通过Python的python-pptx库&#xff0c;将PPT文件的样式、结构、文本内容等信息解析为标准化的JSON格式&#xff0c;为后续的自动化处理、数据迁移或样式复用提供…...

LabVIEW永磁同步电机性能测试系统

开发了一种基于LabVIEW的永磁同步电机&#xff08;PMSM&#xff09;性能测试系统的设计及应用。该系统针对新能源汽车使用的电机进行稳态性能测试&#xff0c;解决了传统测试方法成本高、效率低的问题&#xff0c;实现了测试自动化&#xff0c;提高了数据的准确性和客观性。 ​…...

MTK Camera 照片切视频Systrace拆解分析

和你一起终身学习&#xff0c;这里是程序员Android 经典好文推荐&#xff0c;通过阅读本文&#xff0c;您将收获以下知识点: 一、Systrace 拆解概览二、Systrace 阶段拆解详解 一、Systrace 拆解概览 MTK Camera 照片切换视频trace 拆解(非切换摄像头类) 照片切换视频模块trace…...

某合约任意提取BNB漏洞

1背景描述 合约是一个在满足特定条件时在区块链上执行代码的程序&#xff0c;各方以数字签署合同的方式准许并维护它的其运行。这些代码可以是向朋友汇款、买卖 NFT 虚拟商品等一系列复杂的内容。 存在漏洞的目标合约是一个结合Meme文化病毒式传播与去中心化金融&#xff08;D…...

Linux_3.2

今天继续学习shell语法 shell类似一个面向过程的语言,要区分好面向过程和面向对象的语言的区别。 循环语句 for循环 for i in a 2 cc doecho $i done #输出a 2 ccfor file in `ls` doecho $file done #输出ls命令的输出for i in $(seq 1 10) doecho $i done #输出1-10,seq…...

插件实现:分别通过winform和WPF界面输入操作CAD——CAD c#二次开发

效果如下图所示&#xff1a; 主程序 using Autodesk.AutoCAD.ApplicationServices; using Autodesk.AutoCAD.DatabaseServices; using Autodesk.AutoCAD.EditorInput; using Autodesk.AutoCAD.Geometry; using Autodesk.AutoCAD.Runtime; using System; using System.Windows…...

【学Rust写CAD】20 平铺模式结构体(spread.rs)

这个 Spread。rs文件定义了渐变超出定义区域时的扩展方式&#xff0c;通常用于处理渐变在边界之外的行为。 源码 //color/spread.rs #[derive(Debug, Clone, Copy)] pub struct Pad; // 空结构体&#xff0c;表示 Pad 模式#[derive(Debug, Clone, Copy)] pub struct Reflect…...

maya调整全局关节显示大小

请按以下步骤操作&#xff1a; 在 Maya 主菜单栏中&#xff0c;找到 Display (显示) 菜单。 在 Display 菜单下&#xff0c;找到 Animation (动画) 子菜单。 在 Animation 子菜单中&#xff0c;点击 Joint Size... (关节大小...)。 这时会弹出一个小窗口或者直接在界面上出现…...

白酒迈入3.0时代,珍酒李渡如何穿越周期高质增长?

当下&#xff0c;白酒行业仍处深度调整期&#xff0c;过往通过渠道拓展、硬广宣传等推动规模扩张、提升市场份额的模式&#xff0c;愈发难以为继。 行业迫切需要构建高质增长新模式&#xff0c;完成增长动能转换。中国酒业协会理事长宋书玉提出&#xff0c;白酒消费亟需进入品…...

HTTP代理:网页加速的隐形引擎

目录 引言&#xff1a;网页加载速度为何至关重要&#xff1f; 一、HTTP代理的核心加速原理 二、四大加速黑科技详解 三、实战场景性能对比 四、代理加速的隐藏代价 五、未来发展趋势 结语&#xff1a;智能代理的选型指南 引言&#xff1a;网页加载速度为何至关重要&#…...

人工智能-LangGraph+ChatUI+DeepSeek API搭建本地智能助手

人工智能-LangGraphChatUIDeepSeek API搭建本地智能助手 0 环境说明1 LangGraph2 Agent Chat UI 0 环境说明 环境项环境说明操作系统Windows11 专业版硬件信息联想拯救者Y9000PcondaAnancondaPython版本3.12NodeJs18.20.0 # 使用conda创建python环境 conda create -n langgra…...

3dmax批量转glb/gltf/fbx/osgb/stl/3ds/dae/obj/skp格式导出转换插件,无需一个个打开max,材质贴图在

3dmax批量转glb/gltf/fbx/osgb/stl/3ds/dae/obj/skp格式导出转换插件&#xff0c;无需一个个打开max&#xff0c;材质贴图在 3dmax批量转glb/gltf/fbx/osgb/stl/3ds/dae/obj/skp格式导出转换插件&#xff0c;无需一个个打开max&#xff0c;材质贴图在...