MyBatisPlus--快速入门

MyBatisPlus介绍

从名字中就可以感觉到MybatisPlus与MyBatis之间的渊源,而MyBatis是一个非常流行的持久层框架,主要来做数据库的增删改查,而MyBatisPlus这种命名方式让人不得不往MyBatis的升级版去联想,事实也确实如此,MyBatisPlus就是对MyBatis框架的增强与升级,但MyBatisPlus并不是来替代MyBatis的,MyBatisPlus的官网logo是一只蓝色的小鸟,MyBatis官网的logo是一只红色的小鸟,并且在MyBatisPlus官网下的标语就是 MyBatis 最佳搭档,只做增强不做改变,为简化开发、提高效率而生。因此两者是一种合作的关系。

而且两者搭配使用,可以翻倍提高开发效率。因此MybatisPlus也成为了企业开发的必备工具。

那么MyBatisPlus是如何对MyBatis进行增强的呢?

我们可以从MyBatisPlus的官网文档入手

image-20250530165410823

在实际开发中,书写的大多数SQL语句都是单表得CRUD,花费时间最多的就是单表CRUD的代码编写上,而这些功能往往都是比较重复的,比较基础的,比较浪费时间,而MyBatisPlus就帮助开发者干了一件事情:只需要简单配置,设置不用配置,约定大于配置,那么MyBatisPlus就可以帮助开发者实现单表的CRUD的操作,,开发者只需要直接调用对应的方法就能实现对应的功能,这样就节省了开发中大量去编写单表CRUD的时间,开发效率也会随之水涨船高,这就是MyBatisPlus最重要的功能。

但是MyBatisPlus不仅仅帮我们实现了单表CRUD功能,还有一些拓展功能,比如,代码生成,自动分,逻辑删除等等。

官方文档:简介 | MyBatis-Plus

官方文档主要分为四大部分:

  • 快速入门:快速了解MyBatisPlus的基本特性。

  • 核心功能:以后再开发中写的最多的代码

  • 拓展:拓展的一些高级功能

  • 插件:一些插件功能,比如分页插件,乐观锁插件等等

快速入门

快速开始

入门案例:

需求:基于项目,实现下列功能

  • 新增用户功能

  • 根据ID查询用户

  • 根据ID批量查询用户

  • 根据ID更新用户

  • 根据ID删除用户

以前的MyBatis冗余代码:

 <?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.lyc.mybatisplusdemo.mapper.UserMapper">​<insert id="saveUser" parameterType="com.lyc.mybatisplusdemo.pojo.User">insert into `user` (`id`,`username`,`password`,`phone`,`info`,`status`,`balance`)values (#{id},#{username},#{password},#{phone},#{info},#{status},#{balance})</insert><update id="updateUser" parameterType="com.lyc.mybatisplusdemo.pojo.User">update `user`<set><if test="username != null">username = #{username},</if><if test="password != null">password = #{password},</if><if test="phone != null">phone = #{phone},</if><if test="info != null">info = #{info},</if><if test="status != null">status = #{status},</if><if test="balance != null">balance = #{balance},</if></set>where id = #{id}</update><delete id="deleteUser" parameterType="com.lyc.mybatisplusdemo.pojo.User">delete  from `user` where id = #{id}</delete><select id="getUserById" resultType="com.lyc.mybatisplusdemo.pojo.User">select * from `user` where id = #{id}</select><select id="getUserByIds" resultType="com.lyc.mybatisplusdemo.pojo.User">select * from `user`<if test="ids != null">where id in<foreach collection="ids" item="id" open="(" close=")" separator=",">#{id}</foreach></if>limit 10</select></mapper>

虽然逻辑很简单,就是一些单表的增删改查的语句,浪费了大量的时间,导致开发效率受到了影响,而如果使用MyBatisPlus,这些单表查询语句都不需要书写了,

如何使用MyBatisPlus?

步骤:

  • 引入MyBatisPlus的起步依赖

MyBatisPlus官方提供了Starter,其中集成了MyBatis和MyBatisPlus的所有功能,并且实现了自动装配的效果。

因此我们可以使用MyBatisPlus的starter代替MyBatis的starter:

 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.12</version></dependency>
  • 自定义Mapper

自定义的Mapper集成MyBatisPlus提供的BaseMapper接口:

因为BaseMapper中已经提前定义好了大量的增删改查的方法,而且命名方式简单明了。

那么我们就可以继承BaseMapper,从而调用这些方法。

 public interface UserMapper extends BaseMapper<User> {}

注意事项:在继承BaseMapper接口时,需要将泛型的类型换成实体类的类型。

测试代码:

 package com.lyc.mybatisplusdemo.mapper;​import com.lyc.mybatisplusdemo.pojo.User;import jakarta.annotation.Resource;import org.junit.jupiter.api.Test;import org.springframework.boot.test.context.SpringBootTest;​import java.time.LocalDateTime;import java.util.List;​@SpringBootTestclass UserMapperTest {@Resourceprivate UserMapper userMapper;@Testvoid testInsert(){User user = new User();user.setId(5L);user.setUsername("lyc");user.setPassword("123456");user.setPhone("12345678901");user.setBalance(200);user.setInfo("{\"age\":24,\"intro\":\"英文老师\",\"gender\":\"female\"}");user.setCreateTime(LocalDateTime.now());user.setUpdateTime(LocalDateTime.now());userMapper.saveUser(user);}@Testvoid testSelectById(){User user = userMapper.getUserById(5L);System.out.println("user = "+user);}@Testvoid testSelectByIds(){List<User> users = userMapper.getUserByIds(List.of(1L,2L,3L,4L,5L));users.forEach(System.out::println);}@Testvoid testUpdateById(){User user = new User();user.setId(5L);user.setBalance(20000);userMapper.updateUser(user);}}

因为MyBatisPlus是对MyBatis的增强,因此即使我们将依赖替换成MyBatisPlus,开始在Mapper.xml中的文件依然可以使用。

进行测试:

image-20250530191202267

而使用MyBatisPlus无需再书写SQL语句以及声明方法了。

将这些都删除。

在修改测试单元代码,直接调用父类BaseMapper中的方法即可

 package com.lyc.mybatisplusdemo.mapper;​import com.lyc.mybatisplusdemo.pojo.User;import jakarta.annotation.Resource;import org.junit.jupiter.api.Test;import org.springframework.boot.test.context.SpringBootTest;​import java.time.LocalDateTime;import java.util.List;​@SpringBootTestclass UserMapperTest {@Resourceprivate UserMapper userMapper;@Testvoid testInsert(){User user = new User();user.setId(5L);user.setUsername("lyc");user.setPassword("123456");user.setPhone("12345678901");user.setBalance(200);user.setInfo("{\"age\":24,\"intro\":\"英文老师\",\"gender\":\"female\"}");user.setCreateTime(LocalDateTime.now());user.setUpdateTime(LocalDateTime.now());userMapper.insert(user);}@Testvoid testSelectById(){User user = userMapper.selectById(5L);System.out.println("user = "+user);}@Testvoid testSelectByIds(){List<User> users = userMapper.selectBatchIds(List.of(1L,2L,3L));users.forEach(System.out::println);}@Testvoid testUpdateById(){User user = new User();user.setId(5L);user.setBalance(20000);userMapper.updateById(user);}@Testvoid testDeleteById(){userMapper.deleteById(5L);}}

再次进行测试:

image-20250530192047060

测试成功。

查询数据库看是否插入数据

image-20250530192117561

测试成功。

总结:

使用MyBatisPlus的基本步骤:

  • 使用MyBatisPlus依赖,代替MyBatis依赖

  • 定义Mapper接口并继承BaseMaper

MyBatisPlus确实做到了对Mybatis的无侵入:润物无声

常见注解

MyBatisPlus是如何获取数据库信息的呢?

原因:MyBatisPlus通过扫描实体类,并给予反射获取实体类信息作为数据库表信息。

在前面的入门案例中,在继承BaseMapper类后需要指定泛型,就是对应的实体类的类型,而MyBatisPlus就可以基于反射拿到实体类类型,拿到实体类类型就可以基于反射拿到对应的class对象,即对应字节码,拿到对应字节码就可以拿到实体类信息,就基于实体类信息作为数据库表信息。

为了拿到准确的数据表信息,MyBatisPlus有一系列的约定。

  • 类名驼峰转下划线作为表名

  • 名为id的字段作为主键

  • 变量名驼峰转下划线作为表的字段名

如果实体类不符合约定,就必须自己去定义表明主键名,以及字段名。

如何自定义呢?MyBatisPlus为我们提供了注解来帮助我们自定义设置。

常用注解:

  • @TableName:用来指定表名

  • @Tabled:用来指定表中的主键字段信息

  • @TableField:用来指定表中的普通字段信息

如果实体类和表的对应关系不符合MyBatisPlus的约定,就可以使用这些注解声明。

注意事项:

我们在使用MyBatisPlus,一定要保证自己的实体类以及表中有一个名为id的字段(如果实体类中主键不为ID,那么也要使用注解@Tabled("id")),要使MyBatisPlus找到主键。

在数据库中的主键可以添加约束,比如 Auto_increment(自增),而在实体类中我们可以使用@Tabled(value="id",type = "IdType.AUTO")等等,

IdType枚举:

  • Auto:数据库自增长(数据库自己生成)

  • INPUT:通过set方法自行输入(由调用者填入)

  • ASSIGN_ID:分配id,基于接口IdentiterGenertaor的方法nextld()来生成id(我们也可以重写方法来覆盖原来的方法),默认实现类为DefaultIdentifiterGenerator,它内部自带一种雪花算法来帮助我们生成id,生成的是一个Long型的整数,长度为20位。(由MyBatisPlus帮助生成ID)

使用@TableField的常见场景

  • 成员变量名与数据库字段名不一致

  • 成员名以is开头,且类型为布尔值的字段,MyBatisPlus会基于反射类型的机制去获取字段名称,会将is减去作为变量名,变量名驼峰转下划线作为表的字段名便不起作用了,这时可能就与数据库中的字段名不一致。这种就需要去使用@TableField。

  • 成员变量名与数据库关键字冲突,这时我们需要使用转义字符,例如

 @TableField("`order`")
  • 成员变量不是数据库字段,这时就需要使用@TableField(exist = false)

更多详情在官方文档中查看:注解配置 | MyBatis-Plus

案例展示:

 @TableName("tb_user")public class User {​//用户ID//主键自增@TableId(type = IdType.AUTO)private Long id;//用户名@TableField("`username`")private String username;//密码@TableField(exist = false)private String password;//注册手机号private String phone;//详细信息private String info;//使用状态(1正常2冻结)private Integer status;//账户余额private Integer balance;//创建时间private LocalDateTime createTime;//更新时间private LocalDateTime updateTime;

image-20250530203106065

使用 @TableId(type = IdType.AUTO)就可以使id自增,但是如果不设置type,那默认策略是什么呢?

进行测试:

将测试单元中的setId()省略,以及实体类的 @TableId(type = IdType.AUTO)注解省略,再次进行测试:

测试成功,检查数据库

发现id值为long型,有20位,证明使用的是MybatisPlus中的雪花算法

image-20250530221920189

证明默认使用的策略就是ASSIGN_ID(雪花算法)。

常见配置

在前面我们只是导入了MyBatisPlus的起步依赖,就可以自动装配,无需配置就可直接使用,十分方便,但是MyBatisPlus也是支持一些自定义配置的,那么MyBatisPlus支持哪些常见的配置呢?

MyBatisPlus的配置项继承了MyBatis原生配置和自己特有的配置。例如:

 mybatis-plus:type-aliases-package: com.lyc.mp.pojo # 别名扫描包mapper-locations: "classpath*:mapper/**/*.xml" # 扫描mapper.xml文件configuration:map-underscore-to-camel-case: true # 开启驼峰命名与下划线命名的映射cache-enabled: false # 是否开启二级缓存global-config: # 全局配置db-config: # 数据库配置id-type: assign_id # 主键策略 雪花算法update-strategy: not_null # 更新策略 只更新非空字段

第一个: type-aliases-package:类型别名的扫描包,需要指定对应的实体类的包,就会扫描实体类

作用:将来在定义Mapper.xml文件中的语句时,如果需要定义实体类的类型,就不需要写全路径名,直接写类的简化名即可。

第二个: mapper-locations:mapper.xml文件的地址,可以扫描到指定包下的Mapper.xml文件。(MyBatisPlus更擅长单表查询,如果业务的SQL语句过于复杂或多表查询,就不建议使用MyBatisPlus,还是建议写Mapper.xml文件)

第三个: map-underscore-to-camel-case: true:开启驼峰命名与下划线命名的映射,开启后实体类与数据库中的字段名就会自动转换格式

第四个:cache-enabled: false:是否开启二级缓存

第五个:id-type:在前面学习的注解@TableId中的type中的默认配置,在配置文件中是全局配置,优先级没有注解高,如果注解配的是主键自增,那么是以注解内容为准,如果注解没有配置,则以配置类中的配置为准。

第六个:update-strategy: 更新策略,我们在前面中学习的MyBatisPlus只更新实体类中存在的字段,实体类中没有而数据库中存在的字段并不更新,这就是更新策略,上述讲的这种策略就是只更新非空字段。

以上的配置大多数都是有默认值的,几乎都不需要配置,除非要自定义修改。

如果要进行自定义修改时记不清配置名,有两种方法:

  • 查询官网:配置 | MyBatis-Plus

  • 根据集成工具代码提示及补全,因此只需要记忆一小部分即可,无需全部记忆

总结:

MyBatisPlus的基本使用流程:

  1. 引入起步依赖

  2. 自定义Mapper接口继承BaseMapper接口

  3. 在实体类添加注解声明表信息

  4. 在application.yml根据需要添加配置。

以上就是MyBatisPlus的快速入门,希望对大家有所帮助!

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

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

相关文章

redis持久化策略

RDB 是通过生成数据快照来实现持久化的&#xff0c;相当于给内存中的数据拍一张"照片"保存到磁盘上。AOF 记录所有写操作命令&#xff0c;以Redis协议格式追加到文件末尾。 RDB 在满足特定条件时触发内存快照&#xff0c;生成新的RDB文件替换旧文件 AOF 先写入内…

Spring Boot中使用@JsonAnyGetter和@JsonAnySetter处理动态JSON属性

Spring Boot 中使用 @JsonAnyGetter 和 @JsonAnySetter 处理动态 JSON 属性 在实际的后端开发中,尤其是使用 Spring Boot 构建 API 时,我们经常会遇到需要处理动态 JSON 属性的场景。例如,前端传递过来的 JSON 数据结构不固定,或者业务需求变更频繁,导致实体类无法预先定…

拉取gitlab项目

一、下载nvm管理node 先下载配置好nvm,再用nvm下载node 下载链接&#xff1a;开始 下载nvm - nvm中文官网 情况&#xff1a;npm i 下载依赖缓慢&#xff0c;可能是node版本不对&#xff0c;可能node版本太高 可能得问题&#xff1a;使用nvm 下载低版本的node时&#xff0c;…

【解决办法】ubuntu重启不起来,输入用户名和密码进不去,又重新返回登录页。

项目场景&#xff1a; ubuntu重启不起来&#xff0c;输入用户名和密码进不去&#xff0c;又重新返回登录页。 问题描述 在华硕天选一代笔记本上面安装了ubuntu22.04.5桌面版&#xff0c;但是重启以后出现&#xff0c;输入了用户名和密码&#xff0c;等待一会还让输入用户名和…

# 云端大模型:智能时代的新引擎

云端大模型&#xff1a;智能时代的新引擎 在人工智能技术的迅猛发展中&#xff0c;云端大模型扮演着至关重要的角色。它们不仅推动了技术的边界&#xff0c;也为各行各业带来了前所未有的机遇。本文将结合一系列图片和代码示例&#xff0c;深入探讨云端大模型的功能、应用及其…

(1)pytest简介和环境准备

1. pytest简介 pytest是python的一种单元测试框架&#xff0c;与python自带的unittest测试框架类似&#xff0c;但是比unittest框架使用起来更简洁&#xff0c;效率更高。根据pytest的官方网站介绍&#xff0c;它具有如下特点&#xff1a; 非常容易上手&#xff0c;入门简单&a…

实验设计与分析(第6版,Montgomery)第5章析因设计引导5.7节思考题5.5 R语言解题

本文是实验设计与分析&#xff08;第6版&#xff0c;Montgomery著&#xff0c;傅珏生译) 第5章析因设计引导5.7节思考题5.5 R语言解题。主要涉及方差分析&#xff0c;正态假设检验&#xff0c;残差分析&#xff0c;交互作用图。 dataframe <-data.frame( wrapc(17,20,12,9,…

线程池的详细知识(含有工厂模式)

前言 下午学习了线程池的知识。重点探究了ThreadPoolExecutor里面的各种参数的含义。我详细了解了这部分的知识。其中有一个参数涉及工厂模式&#xff0c;我将这一部分知识分享给大家~ 线程池的详细介绍(含工厂模式) 结语 分享到此结束啦。byebye~

嵌入式开发学习(第二阶段 C语言笔记)

内存操作 我们对于内存操作需要依赖于string.h头文件中相关的函数库。 内存操作函数 内存填充 头文件&#xff1a;#include <string.h> 函数原型&#xff1a; void* memset(void *s,int c,size_t n)函数功能&#xff1a;将内存块s的前n个字节填充为c&#xff0c;一般…

C++学习-入门到精通【9】面向对象编程:继承

C学习-入门到精通【9】面向对象编程&#xff1a;继承 目录 C学习-入门到精通【9】面向对象编程&#xff1a;继承一、基类与派生类CommunityMember类的继承层次结构如何定义一个派生类呢 二、基类和派生类间的关系1.创建并使用类CommissionEmployee2.不使用继承创建类BasePlusCo…

黑马k8s(十七)

一&#xff1a;高级存储 1.高级存储-pv和pvc介绍 2.高级存储-pv 3.高级存储-pvc 最后一个改成5gi pvc3是没有来绑定成功的 pv3没有绑定 删除pod、和pvc&#xff0c;观察状态&#xff1a; 4.高级存储-pc和pvc的生命周期 二&#xff1a;配置存储 1.配置存储-ConfigMap 2.配…

cf每日刷题c++

目录 Simple Repetition&#xff08;1000&#xff09; Fashionable Array&#xff08;800&#xff09; Kevin and Arithmetic(800) Permutation Warm-Up(800) Game of Mathletes(900) LRC and VIP(800) Simple Repetition&#xff08;1000&#xff09; https://codeforc…

历年中国科学技术大学计算机保研上机真题

2025中国科学技术大学计算机保研上机真题 2024中国科学技术大学计算机保研上机真题 2023中国科学技术大学计算机保研上机真题 在线测评链接&#xff1a;https://pgcode.cn/school?classification1 拆分数字 题目描述 给定一个数字&#xff0c;拆分成若干个数字之和&#xff…

PHP学习笔记(十一)

类常量 可以把在类中始终保持不变的值定义为常量&#xff0c;类常量的默认可见性是public。 接口中也可以定义常量。 可以用一个变量来动态调用类&#xff0c;但该变量的值不能为关键字 需要注意的是类常量只为每个类分配一次&#xff0c;而不是为每个类的实例分配。 特殊的…

Nginx 性能优化全解析:从进程到安全的深度实践

一、进程优化&#xff1a;释放硬件性能潜力 Nginx 通过多工作进程处理请求&#xff0c;合理配置进程参数能充分利用 CPU 资源&#xff0c;避免资源浪费。 1.1 worker_processes 参数详解 worker_processes用于设置 Nginx 工作进程的数量&#xff0c;它直接影响 Nginx 对 CP…

中国移动咪咕助力第五届全国人工智能大赛“AI+数智创新”专项赛道开展

第五届全国人工智能大赛由鹏城实验室主办&#xff0c;新一代人工智能产业技术创新战略联盟承办&#xff0c;华为、中国移动、鹏城实验室科教基金会等单位协办&#xff0c;广东省人工智能与机器人学会支持。 大赛发布“AI图像编码”、“AI增强视频质量评价”、“AI数智创新”三大…

《 PyTorch 2.3革新:torch.compile自动生成CUDA优化内核全解》

CUDA作为NVIDIA推出的并行计算平台和编程模型&#xff0c;为GPU计算提供了强大的支持&#xff0c;但手动优化CUDA代码不仅需要深厚的专业知识&#xff0c;而且过程繁琐、耗时费力&#xff0c;torch.compile的出现&#xff0c;犹如一道曙光&#xff0c;为解决这一困境带来了全新…

mysql-mysql源码本地调试

前言 先进行mysql源码本地编译&#xff1a;mysql源码本地编译 1.本地调试 这里以macbook为例 1.使用vscode打开mysql源码 2.创建basedir目录、数据目录、配置文件目录、配置文件 cd /Users/test/ mkdir mysqldir //创建数据目录和配置目录 cd mysqldir mkdir conf data …

带你手写React中的useReducer函数。(底层实现)

文章目录 前言一、为什么需要 Reducer&#xff1f;二、Reducer 的核心概念1. Reducer 函数2. useReducer 钩子 三&#xff0c;手写react中的useReducer 总结 前言 在 React 开发中&#xff0c;useReducer 是管理复杂状态逻辑的利器。它类似于 Redux 的简化版&#xff0c;允许我…

用wireshark抓了个TCP通讯的包

昨儿个整理了下怎么用wireshark抓包&#xff0c;链接在这里&#xff1a;捋捋wireshark 今天打算抓个TCP通讯的包试试&#xff0c;整体来说比较有收获&#xff0c;给大家汇报一下。 首先就是如何搞到可以用来演示TCP通讯的客户端、服务端&#xff0c;问了下deepseek&#xff0c;…