Java研学-MybatisPlus(一)
一 概述
MyBatis-Plus(简称 MP)是一款基于 MyBatis 的增强工具,旨在简化开发、提高效率。它在保留 MyBatis 所有特性的基础上,提供了丰富的功能,减少了大量模板代码的编写。
1 核心特性:
① 无侵入增强:完全兼容原生 MyBatis,仅通过插件和工具类进行功能扩展,无需修改现有 MyBatis 代码。
② 强大的 CRUD 接口:内置通用 Mapper 和 Service,通过继承即可获得单表大部分 CRUD 方法(如 selectById, insert, update 等),无需编写 XML。
③ 条件构造器(Wrapper):提供 QueryWrapper、UpdateWrapper 和 LambdaQueryWrapper 等,支持链式调用,以面向对象的方式构建 SQL 条件,避免手写字符串。
④ 代码生成器:自动生成 Entity、Mapper、Service、Controller 等代码,支持自定义模板,显著提升开发效率。
⑤ 分页插件:简单配置即可实现物理分页,支持多种数据库(如 MySQL、Oracle)。
⑥ 乐观锁支持:通过 @Version 注解实现乐观锁,避免并发更新冲突。
⑦ 逻辑删除:使用 @TableLogic 注解标记逻辑删除字段,删除操作自动变为更新,查询自动过滤已删除数据。
⑧ 自动填充功能:通过 @TableField(fill = FieldFill.INSERT) 注解,实现插入或更新时自动填充字段(如创建时间、更新时间)。
⑨动态表名:支持运行时动态替换表名,适用于分表场景。
⑩SQL 性能分析:内置插件可输出 SQL 执行时间,帮助优化性能
2 核心优势
① 开发效率高:减少 80% 的 CRUD 代码,专注于业务逻辑。
② 功能全面:覆盖常见数据库操作需求,如分页、乐观锁、逻辑删除等。
③ 灵活性与扩展性:支持自定义全局操作、SQL 注入器,可深度定制。
④ 社区活跃:文档齐全,中文支持友好,更新迭代快。
二 入门demo
① 数据库表
# 数据库mp_test 表tb_user
create table tb_user
(id int auto_incrementprimary key,username varchar(15) not null,`order` int(40) not null,is_player bit not null
)comment '用户';
② 导入依赖mybatis-plus-boot-starter
其中集成了Mybatis和MybatisPlus的所有功能,并且实现了自动装配效果。因此可用MybatisPlus的starter代替Mybatis的starter:
<?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"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.tj.mp</groupId><artifactId>demo</artifactId><version>0.0.1-SNAPSHOT</version><name>demo</name><description>demo</description><properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>2.6.13</spring-boot.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.mysql</groupId><artifactId>mysql-connector-j</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.11</version></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version><configuration><mainClass>com.tj.mp.DemoApplication</mainClass><skip>true</skip></configuration><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build>
</project>
③ 启动类
@SpringBootApplication
@MapperScan("com.tj.mp.demo.mapper")
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}
④ 配置文件 – application.yaml
server:port: 8081
spring:application:name: demodatasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/mp_test?serverTimezone=UTC&useUnicode=true&characterEncoding=utf8&useSSL=falseusername: rootpassword: root
logging:level:com.tj.mp.demo: debugpattern:console: "%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"
# mapper/**/表示mapper下的xml与其子目录下的xml都进行加载(默认)
mybatis-plus:# 因mp不善于多表查询,故多表查询仍需手写type-aliases-package: com.tj.mp.demo.domainmapper-locations: classpath*:mapper/**/*.xml
⑤ 实体类 – User
mp通过扫描实体类,基于反射获取实体类信息,约定类名驼峰转下划线做表名,id字段为主键,变量名驼峰转下划线作为表字段名,当实体与表的对应关系不符合时,需使用注解
@Data
@AllArgsConstructor
@NoArgsConstructor
// 可解决类与表不同名的问题,相同可省
@TableName("tb_user")
public class User {// 指定表中主键字段信息,一定要有主键,对应自增长需设置type属性// auto:数据库自增长,INPUT:通过set方法自行输入// ASSIGN_ID:分配ID,接口IdentifierGenerator的方法nextId生成id(MP雪花算法生成ID)// 若不设置主键类型则默认为ASSIGN_ID@TableId(value = "id",type = IdType.AUTO)private Integer id;// 当成员变量与数据库字段名不一致时@TableField("username")private String name;// 当成员变量名以is开头,且是布尔值(反射机制会去掉is,导致成员变量与数据库字段对应不上)@TableField("is_player")private Boolean isPlayer;// 当成员变量名与数据库关键字冲突需要加反引号@TableField("`order`")private Integer order;// 当成员变量不是数据库字段时,需标记为非数据库字段@TableField(exist = false)private String address;
}
⑥ mapper – UserMapper 自定义的Mapper继承MybatisPlus提供的BaseMapper接口(crud)
// 继承后底层已封装好crud
public interface UserMapper extends BaseMapper<User> {
}
⑦ Controller – UserController
@RestController
@CrossOrigin
public class UserController {@AutowiredUserMapper userMapper;// 测试方法@RequestMapping("/insert")public String insert(Integer id,String name,Boolean isplayer,Integer order,String address){return userMapper.insert(new User(id,name,isplayer,order,address))>0?"success":"fail";}
}
⑧ 浏览器地址栏测试
http://localhost:8081/insert?id=2&name=Yellow&iplayer=true&order=1&address=3366
三 常用功能
1 条件构造器 – Wrapper
crud方法的参数统一为Wrapper,构造复杂的sql语句。
// 基于QueryWrapper的查询
@SpringBootTest
class DemoApplicationTests {@AutowiredUserMapper userMapper;// select id,username// from tb_user// where username like ? and order >= ?@Testvoid testQueryWrapper() {// 1.构造查询条件 select与where// 查名字含有ow且order大于10的用户ID与姓名QueryWrapper<User> wrapper = new QueryWrapper<User>().select("id","username").like("username","ow").ge("`order`",10);// 2.查询List<User> users = userMapper.selectList(wrapper);users.forEach(System.out::println);}// update user// set order = 15// where (username = "yellow")@Testvoid testUpdateQueryWrapper() {// 1.更新数据User user = new User();user.setOrder(15);// 2.条件QueryWrapper<User> wrapper = new QueryWrapper<User>().eq("username","yellow");// 3.更新userMapper.update(user,wrapper);}
}
// 基于UpdateWrapper的更新,解决特殊语句
@SpringBootTest
class DemoApplicationTests {@AutowiredUserMapper userMapper;// update user// set order = order - 2// where id in(1,2,3)@Testvoid testUpdateWrapper() {// 1.更新数据List<Long> ids = Arrays.asList(1L, 2L, 3L);// 2.条件UpdateWrapper<User> wrapper = new UpdateWrapper<User>()// setsql可直接写入sql片段,但这相当于将sql代码写到业务层中.setSql("`order`=`order`-2").in("id",ids);// 3.更新,更新内容为null,表示不使用实体对象来指定更新内容,// 更新逻辑已经完全由 UpdateWrapper 控制,不需通过实体对象来指定更新字段的值userMapper.update(null,wrapper);}
}
// 基于LambdaQueryWrapper的查询
@SpringBootTest
class DemoApplicationTests {@AutowiredUserMapper userMapper;@Testvoid testLambdaQueryWrapper() {// 1.构建查询条件LambdaQueryWrapper<User> wrapper=new LambdaQueryWrapper<User>()// 传递对应字段的get函数,利用反射得字段名字,此后不用写死字段名硬编码.select(User::getId, User::getUsername).like( User::getUsername,"ow").ge(User::getOrder,10);// 2.查询List<User> users = userMapper.selectList(wrapper);users.forEach(System.out::println);}
}
2 自定义sql
利用Wrapper构建where条件后,自定义sql仍需处理的部分,把mp构建好的条件传递给mapper层,在mapper或mapper.xml中实现sql的组装,不在业务层编写sql遵守企业规范,在mapper方法参数中Param声明Wrapper变量名称必须是ew
① 基于Wrapper构建where条件
// 基于原有基础批量更新
@Test
void testCustomSql() {// 1.更新数据List<Long> ids = Arrays.asList(1L, 2L, 3L);int amount=2;// 2.构建查询条件QueryWrapper<User> wrapper=new QueryWrapper<User>().in("id",ids);// 3.自定义sql,方法参数中Param声明Wrapper变量名称必须是ewuserMapper.updateOrderByIds(wrapper,amount);
}
② Usermapper接口
public interface UserMapper extends BaseMapper<User> {void updateOrderByIds(@Param("ew")QueryWrapper<User> wrapper, @Param("amount")int amount);
}
③ Usermapper.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.tj.mp.demo.mapper.UserMapper">
<!--只写前半部分即可,mp会自动解析拼接--><update id="updateOrderByIds">UPDATE tb_user SET `order`=`order` - #{amount} ${ew.customSqlSegment}</update>
</mapper>
相关文章:
Java研学-MybatisPlus(一)
一 概述 MyBatis-Plus(简称 MP)是一款基于 MyBatis 的增强工具,旨在简化开发、提高效率。它在保留 MyBatis 所有特性的基础上,提供了丰富的功能,减少了大量模板代码的编写。 1 核心特性: ① 无侵入增强&am…...
2025年03月中国电子学会青少年软件编程(Python)等级考试试卷(六级)真题
青少年软件编程(Python)等级考试试卷(六级) 分数:100 题数:38 答案解析:https://blog.csdn.net/qq_33897084/article/details/147341458 一、单选题(共25题,共50分) 1. 在tkinter的…...
OpenVINO怎么用
目录 OpenVINO 简介 主要组件 安装 OpenVINO 使用 OpenVINO 的基本步骤 OpenVINO 简介 OpenVINO(Open Visual Inference and Neural Network Optimization)是英特尔推出的一个开源工具包,旨在帮助开发者在英特尔硬件平台上高效部署深度学…...
欧拉服务器操作系统安装MySQL
1. 安装MySQL服务器 1. 更新仓库缓存 sudo dnf makecache2. 安装MySQL sudo dnf install mysql-server2. 初始化数据库 sudo mysqld --initialize --usermysql3. 启动数据库服务 # 启动服务 sudo systemctl start mysqld# 设置开机自启 sudo systemctl enable mysql…...
【零基础】基于 MATLAB + Gurobi + YALMIP 的优化建模与求解全流程指南
MATLAB Gurobi YALMIP 综合优化教程(进阶) 本教程系统介绍如何在 MATLAB 环境中使用 YALMIP 建模,并通过 Gurobi 求解器高效求解线性、整数及非线性优化问题。适用于工程、运营研究、能源系统等领域的高级优化建模需求。 一、工具概览 1.…...
Python 浮点数运算之谜:深入解析round(0.675, 2)等输出异常
一、问题背景:当浮点数运算遇见 “反直觉” 结果 在 Python 开发中,以下代码输出常让开发者困惑: print(round(0.675, 2)) # 预期0.67,实际0.68||预期0.68,实际0.67 print(0.1 0.2) # 预期0.3&…...
【C#】Html转Pdf,Spire和iTextSharp结合,.net framework 4.8
🌹欢迎来到《小5讲堂》🌹 🌹这是《C#》系列文章,每篇文章将以博主理解的角度展开讲解。🌹 🌹温馨提示:博主能力有限,理解水平有限,若有不对之处望指正!&#…...
极狐GitLab 注册限制如何设置?
极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 注册限制 (BASIC SELF) 您可以对注册实施以下限制: 禁用新注册。新注册需要管理员批准。需要用户电子邮件确认。…...
利用大模型实现地理领域文档中英文自动化翻译
一、 背景描述 在跨国性企业日常经营过程中,经常会遇到专业性较强的文档翻译的需求,例如法律文书、商务合同、技术文档等;以往遇到此类场景,企业内部往往需要指派专人投入数小时甚至数天来整理和翻译,效率低下&#x…...
SGFormer:卫星-地面融合 3D 语义场景补全
论文介绍 题目:SGFormer: Satellite-Ground Fusion for 3D Semantic Scene Completion 会议:IEEE / CVF Computer Vision and Pattern Recognition Conference 论文:https://www.arxiv.org/abs/2503.16825 代码:https://githu…...
Trinity三位一体开源程序是可解释的 AI 分析工具和 3D 可视化
一、软件介绍 文末提供源码和程序下载学习 Trinity三位一体开源程序是可解释的 AI 分析工具和 3D 可视化。Trinity 提供性能分析和 XAI 工具,非常适合深度学习系统或其他执行复杂分类或解码的模型。 二、软件作用和特征 Trinity 通过结合具有超维感知能力的不同交…...
城市街拍暗色电影胶片风格Lr调色教程,手机滤镜PS+Lightroom预设下载!
调色介绍 城市街拍暗色电影胶片风格 Lr 调色,是借助 Adobe Lightroom 软件,为城市街拍的人像或场景照片赋予独特视觉风格的后期处理方式。旨在模拟电影胶片质感,营造出充满故事感与艺术感的暗色氛围,让照片仿佛截取于某部充满张力…...
【家政平台开发(55)】家政平台数据生命线:备份与恢复策略全解析
本【家政平台开发】专栏聚焦家政平台从 0 到 1 的全流程打造。从前期需求分析,剖析家政行业现状、挖掘用户需求与梳理功能要点,到系统设计阶段的架构选型、数据库构建,再到开发阶段各模块逐一实现。涵盖移动与 PC 端设计、接口开发及性能优化,测试阶段多维度保障平台质量,…...
加密和解密(大语言模型)
看到很多对matlab的p文件加密方案感兴趣的。网络上技术资料比较少,所以,我让大语言模型提供一些概论性质的东西,转发出来自娱自乐。期望了解p文件加密的复杂度,而不是一定要尝试挑战加密算法。 但根据大语言模型提供的材料&#…...
双轮驱动能源革命:能源互联网与分布式能源赋能工厂能效跃迁
在全球能源结构深度转型与“双碳”目标的双重驱动下,工厂作为能源消耗的主力军,正站在节能变革的关键节点。能源互联网与分布式能源技术的融合发展,为工厂节能开辟了全新路径。塔能科技凭借前沿技术与创新实践,深度探索能源协同优…...
React 更新 state 中的数组
更新 state 中的数组 数组是另外一种可以存储在 state 中的 JavaScript 对象,它虽然是可变的,但是却应该被视为不可变。同对象一样,当你想要更新存储于 state 中的数组时,你需要创建一个新的数组(或者创建一份已有数组…...
ubantu18.04HDFS编程实践(Hadoop3.1.3)
说明:本文图片较多,耐心等待加载。(建议用电脑) 注意所有打开的文件都要记得保存。 第一步:准备工作 本文是在之前Hadoop搭建完集群环境后继续进行的,因此需要读者完成我之前教程的所有操作。 第二步&am…...
Spring Boot资源耗尽问题排查与优化
Spring Boot服务运行一段时间后新请求无法处理的问题。服务没有挂掉,也没有异常日志。思考可能是一些资源耗尽或阻塞的问题。 思考分析 首先,资源耗尽可能涉及线程池、数据库连接、内存、文件句柄或网络连接等。常见的如线程池配置不当,导致…...
优化WAV音频文件
优化 WAV 音频文件通常涉及 减小文件体积、提升音质 或 适配特定用途(如流媒体、广播等)。以下是分场景的优化方法,涵盖工具和操作步骤: 一、减小文件体积(无损/有损压缩) 1. 无损压缩 转换格式࿱…...
string函数具体事例
输出所有字串出现的位置 输入两个字符串A和B,输出B在A中出现的位置 输入 两行 第一行是一个含有空格的字符串 第二行是要查询的字串 输出 字串的位置 样例输入 I love c c python 样例输出 -1 样例输入 I love c c c 样例输出 8 12 #include<iostream> #inclu…...
8.Rust+Axum 数据库集成实战:从 ORM 选型到用户管理系统开发
摘要 深入探讨 RustAxum 数据库集成,包括 ORM 选型及实践,助力用户管理系统开发。 一、引言 在现代 Web 应用开发中,数据库集成是至关重要的一环。Rust 凭借其高性能、内存安全等特性,与 Axum 这个轻量级且高效的 Web 框架结合…...
电脑 BIOS 操作指南(Computer BIOS Operation Guide)
电脑 BIOS 操作指南 电脑的BIOS界面(应为“BIOS”)是一个固件界面,允许用户配置电脑的硬件设置。 进入BIOS后,你可以进行多种设置,具体包括: 1.启动配置 启动顺序:设置从哪个设备启动&#x…...
MySQL快速入门篇---库的操作
目录 一、创建数据库 1.语法 2.示例 二、查看数据库 1.语法 三、字符集编码和校验(排序)规则 1.查看数据库支持的字符集编码 2.查看数据库支持的排序规则 3.查看系统默认字符集和排序规则 3.1.查看系统默认字符集 3.2.查看系统默认排序规则 …...
前端:uniapp中uni.pageScrollTo方法与元素的overflow-y:auto之间的关联
在uniapp中,uni.pageScrollTo方法与元素的overflow-y:auto属性之间存在以下关联和差异: 一、功能定位差异 uni.pageScrollTo 属于页面级滚动控制,作用于整个页面容器34。要求页面内容高度必须超过屏幕高度,且由根元素下…...
【已更新完毕】2025华中杯B题数学建模网络挑战赛思路代码文章教学:校园共享单车的调度与维护问题
完整内容请看文末最后的推广群 构建校园共享单车的调度与维护问题 摘要 共享单车作为一种便捷、环保的短途出行工具,近年来在高校校园内得到了广泛应用。然而,共享单车的运营也面临一些挑战。某高校引入共享单车后,委托学生对运营情况进行调…...
NO.92十六届蓝桥杯备战|图论基础-最小生成树-Prim算法-Kruskal算法|买礼物|繁忙的都市|滑雪(C++)
一个具有n个顶点的连通图,其⽣成树为包含n-1条边和所有顶点的极⼩连通⼦图。对于⽣成树来说,若砍去⼀条边就会使图不连通图;若增加⼀条边就会形成回路。 ⼀个图的⽣成树可能有多个,将所有⽣成树中权值之和最⼩的树称为最⼩⽣成树…...
第十四节:实战场景-何实现全局状态管理?
React.createElement调用示例 Babel插件对JSX的转换逻辑 React 全局状态管理实战与 JSX 转换原理深度解析 一、React 全局状态管理实现方案 1. Context API useReducer 方案(轻量级首选) // 创建全局 Context 对象 const GlobalContext createConte…...
数据驱动、精准协同:高端装备制造业三位一体生产管控体系构建
开篇引入 鉴于集团全面推行生产运营体建设以及对二级单位生产过程管控力度逐步加强,某高端装备制造企业生产部长王总正在开展新的一年企业生产管控规划工作,为了能够更好地进行体系规划与建设应用,特邀请智能制造专家小智来进行讨论交流。 王…...
航电系统之通信技术篇
航电系统(航空电子系统)的通信技术是现代航空器的核心技术之一,其核心目标是实现飞行器内部各系统之间以及飞行器与外部设备(如地面控制中心、其他飞行器等)之间高效、可靠的信息交互。随着航空技术的不断发展…...
Linux 日常运维命令大全
Linux 作为一种开源操作系统,在服务器运维中扮演着重要角色。掌握常用的 Linux 命令对于运维人员而言至关重要。本文将整理一份 Linux 服务器运维常用命令大全,帮助你在日常工作中提高效率和准确性。 1. 基础命令 基础命令是Linux操作的起点࿰…...
