【MyBatis Plus】初识 MyBatis Plus,在 Spring Boot 项目中集成 MyBatis Plus,理解常用注解以及常见配置

文章目录

  • 一、初识 MyBatis Plus
    • 1.1 MyBatis Plus 是什么
    • 1.2 MyBatis Plus 和 MyBatis 的区别
  • 二、在 Spring Boot 项目中集成 MyBatis Plus
    • 2.1 环境准备
    • 2.2 引入 MyBatis Plus 依赖
    • 2.3 定义 Mapper
    • 2.4 测试 MyBatis Plus 的使用
  • 三、MyBatis Plus 常用注解
    • 3.1 为什么需要注解
    • 3.2 @TableName
    • 3.3 @TableId
    • 3.4 @TableField
  • 四、MyBatis Plus 常见配置


一、初识 MyBatis Plus

1.1 MyBatis Plus 是什么

MyBatis Plus(简称 MyBatis-Plus 或 MP)是一个流行的Java持久层框架,它在 MyBatis 的基础上进行了扩展,旨在简化数据库操作和提高开发效率。它提供了丰富的功能和工具,使开发者能够更轻松地进行数据库操作,包括增删改查等常见操作。MyBatis Plus 还提供了一套方便的 API 和注解,可以减少编写重复性代码的工作。

MyBatis Plus 的官网:https://www.baomidou.com

1.2 MyBatis Plus 和 MyBatis 的区别

MyBatis Plus 与原始的 MyBatis 框架有以下主要区别:

  • 功能增强:MyBatis Plus 在 MyBatis 的基础上提供了更多的功能,如通用的 CRUD 操作、分页查询、条件构造器等。这些功能减少了开发人员的工作量,提高了开发效率。

  • 注解支持:MyBatis Plus 引入了一系列注解,如@TableName@TableId@TableField等,使得实体类的映射更加灵活和方便,不再需要 XML 映射文件。

  • 更强大的条件构造器:MyBatis Plus 的条件构造器允许我们以更加直观和链式的方式构建 SQL 查询条件,而不必担心拼接 SQL 字符串。

  • 自动代码生成:MyBatis Plus 提供了代码生成器,可以根据数据库表结构自动生成实体类和 Mapper 接口,极大地简化了开发过程。

总的来说,MyBatis Plus 是 MyBatis 的增强版,旨在提供更多便捷的特性,减少开发工作,同时保留了 MyBatis 的灵活性和强大性能。

二、在 Spring Boot 项目中集成 MyBatis Plus

2.1 环境准备

为了更好的演示 MyBatis Plus 的使用,我首先准备了一个 Spring Boot Demo 示例代码,其中使用了 MyBatis 实现了对一张 User 表的增删改查操作:

这个 Demo 的结构如下:

User 表的结构如下:

并且通过单元测试,使用了对 User 表的增删改查功能的测试:

以上就会整个 Demo 的结构,下面将使用 MyBatis Plus 来代替 MyBatis,实现对 User 表的增删改查操作。

2.2 引入 MyBatis Plus 依赖

MyBatis Plus 提供了 Spring Boot 的自动装配功能starter,并且同时实现了 MyBatis 的相关功能,其 Maven 依赖如下,将其拷贝到 pom,xml文件下即可:

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

注意,由于 MyBatis Plus 同时包含了 MyBatis 的功能,因此以前的 MyBatis 依赖则可以直接删除掉:

2.3 定义 Mapper

为了简化对数据库表的增删改查操作,MyBatis Plus 提供了一个基础的BaseMapper接口,其中以及包含了对单表的增删改查操作:

因此我们自己定义的Mapper只需要继承这个接口,就能够使用这些方法。例如,改造原来的UserMapper

public interface UserMapper extends BaseMapper<User> {
}

此时,原来UserMapper接口中的方法和 UserMapper.xml中写的SQL语句也都可以不要了:

2.4 测试 MyBatis Plus 的使用

最后,我们可以在 UserMapperTest 类中,改造我们的测试方法,将原来增删改查的方法改成从 BaseMapper 中继承过来的方法:

@SpringBootTest
class UserMapperTest {@Autowiredprivate UserMapper userMapper;@Testvoid testInsert() {User user = new User();user.setId(6L);user.setUsername("Lucy");user.setPassword("123");user.setPhone("11111111111");user.setBalance(200);user.setInfo("{\"age\": 24, \"intro\": \"英文老师\", \"gender\": \"female\"}");user.setCreateTime(LocalDateTime.now());user.setUpdateTime(LocalDateTime.now());// userMapper.saveUser(user);userMapper.insert(user);}@Testvoid testSelectById() {// User user = userMapper.queryUserById(5L);User user = userMapper.selectById(5L);System.out.println("user = " + user);}@Testvoid testQueryByIds() {// List<User> users = userMapper.queryUserByIds(List.of(1L, 2L, 3L, 4L));List<User> users = userMapper.selectBatchIds(Arrays.asList(1L, 2L, 3L, 4L));users.forEach(System.out::println);}@Testvoid testUpdateById() {User user = new User();user.setId(5L);user.setBalance(20000);// userMapper.updateUser(user);userMapper.updateById(user);}@Testvoid testDeleteUser() {// userMapper.deleteUser(5L);userMapper.deleteById(5L);}
}

在上面的代码中,注释掉的语句是原来通过 MyBatis 来实现的,在这些注释代码的下一行则是有 MyBatis Plus 提供的功能。运行这些测试代码,全部顺利通过。至此,是不是觉得 MyBatis Plus 比 MyBatis 好用多了啊。

三、MyBatis Plus 常用注解

3.1 为什么需要注解

在上面的例子中,仅仅是引入了 MyBatis Plus 的依赖,然后在自己的 Mapper 接口中继承了 BaseMapper,就实现了对单表的增删改查操作,那么问题来了:就是 MyBatis Plus 是如何知道对哪张表进行操作的呢?

通过观察我们自己的 UserMapper 可以发现,继承的 BaseMapper 是一个泛型接口,我们指定了 user 表对应的 POUser,例如:

此时,泛型中的 User就是与数据库对应的PO类。Mybatis Plus 就是根据 PO 实体的信息来推断出表的信息,从而生成具体的 SQL语句。在默认情况下,MyBatis Plus 会根据 PO 实体进行以下操作:

  • Mybatis Plus 会把 PO 实体的类名按照 驼峰转下划线 的规则将其作为数据库表名;
  • Mybatis Plus 会把 PO 实体的所有变量名按照 驼峰转下划线的规则作为表的字段名,并根据变量类型推断字段类型;
  • Mybatis Plus 会把名为 id 的字段作为该表的主键。

但是,在很多的实际情况下都与上面默认的情况不符。比如,数据库表以tb_开头、主键名不是id、字段是一些特殊的关键字等等。这些情况在MyBatis中,可以在Mapper.xml文件中进行解决,但是在 Mybatis Plus中就可以使用下面的注解进行解决了。

3.2 @TableName

@TableName 注解用于指定数据库表的名称。

默认情况下,MyBatis Plus 会根据实体类的类名转化为数据库表名,但如果数据库表名与实体类的类名不匹配,就可以使用这个注解来明确指定表名。这对于处理表名以特殊前缀开头(例如tb_)的情况非常有用。

示例:

@TableName("user")
public class User {private Long id;private String name;
}

@TableName 注解除了指定表名以外,还可以指定很多其它属性:

属性类型必须指定默认值描述
valuestring“”表名
schemastring“”schema
keepGlobalPrefixbooleanfalse是否保持使用全局的 tablePrefix 的值(当全局tablePrefix生效时)
resultMapstring“”xml 中 resultMap 的 id (用于满足特定类型的实体类对象绑定)
autoResultMapbooleanfalse是否自动构建resultMap 并使用(如果设置 resultMap 则不会进行 resultMap 的自动构建与注入)
excludePropertystring[]{}需要排除的属性名 @since 3.3.1

3.3 @TableId

@TableId 注解用于指定主键字段。

默认情况下,MyBatis Plus 会将名为 "id" 的字段作为主键,但如果表的主键字段名称不是 "id",就可以使用这个注解来指定实体类中的主键字段。

示例:

@TableName("user")
public class User {@TableIdprivate Long id;private String name;
}

@TableId 注解支持两个属性:

属性类型必须指定默认值描述
valueString“”表名
typeEnumIdType.NONE指定主键类型

IdType支持的类型有:

描述
AUTO数据库 ID 自增
NONE无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)
INPUTinsert 前自行 set 主键值
ASSIGN_ID分配 ID(主键类型为 Number(Long 和 Integer)或 String)(since 3.3.0),使用接口IdentifierGenerator的方法nextId(默认实现类为DefaultIdentifierGenerator雪花算法)
ASSIGN_UUID分配 UUID,主键类型为 String(since 3.3.0),使用接口IdentifierGenerator的方法nextUUID(默认 default 方法)
ID_WORKER分布式全局唯一 ID 长整型类型(please use ASSIGN_ID)
UUID32 位 UUID 字符串(please use ASSIGN_UUID)
ID_WORKER_STR分布式全局唯一 ID 字符串类型(please use ASSIGN_ID)

这里比较常见的有三种:

  • AUTO:利用数据库的id自增长
  • INPUT:手动生成 id
  • ASSIGN_ID:雪花算法生成 Long 类型的全局唯一 id,这是默认的 ID 策略

3.4 @TableField

@TableField 注解用于指定数据库表字段与实体类属性之间的映射关系。

如果字段名与属性名不匹配,或者需要进行特殊的映射,就可以使用这个注解来定义字段名、是否为主键、是否为插入或更新时的条件等。

示例:

@TableName("user")
public class User {@TableIdprivate Long id;private String name;private Integer age;@TableField("isMarried")private Boolean isMarried;@TableField("concat")private String concat;
}

在一般情况下并不需要给字段添加@TableField注解,一些特殊情况除外,例如:

  • 成员变量名与数据库字段名不一致
  • 成员变量是以isXXX命名,按照 JavaBean 的规范,Mybatis Plus 识别字段时会把 is 去除,这就导致与数据库的字段名不符。
  • 成员变量名与数据库一致,但是与数据库的关键字冲突。使用@TableField注解给字段名添加 `` 转义。

另外,@TableField 注解还支持其他参数:

属性类型必填默认值描述
valueString“”数据库字段名
existbooleantrue是否为数据库表字段
conditionString“”字段 where 实体查询比较条件,有值设置则按设置的值为准,没有则为默认全局的 %s=#{%s},参考(opens new window)
updateString“”字段 update set 部分注入,例如:当在version字段上注解update=“%s+1” 表示更新时会 set version=version+1 (该属性优先级高于 el 属性)
insertStrategyEnumFieldStrategy.DEFAULT举例:NOT_NULL insert into table_a(column) values (#{columnProperty})
updateStrategyEnumFieldStrategy.DEFAULT举例:IGNORED update table_a set column=#{columnProperty}
whereStrategyEnumFieldStrategy.DEFAULT举例:NOT_EMPTY where column=#{columnProperty}
fillEnumFieldFill.DEFAULT字段自动填充策略
selectbooleantrue是否进行 select 查询
keepGlobalFormatbooleanfalse是否保持使用全局的 format 进行处理
jdbcTypeJdbcTypeJdbcType.UNDEFINEDJDBC 类型 (该默认值不代表会按照该值生效)
typeHandlerTypeHander类型处理器 (该默认值不代表会按照该值生效)
numericScaleString“”指定小数点后保留的位数

四、MyBatis Plus 常见配置

MyBatis Plus 同样支持使用 yaml 格式的配置,关于 MyBatis Plus 的配置可以从起官网中进行了解:使用配置。

下面是关于 MyBatis Plus 的常用配置:

mybatis-plus:type-aliases-package: com.demo.mp.domain.po # 别名扫描包mapper-locations: "classpath*:/mapper/**/*.xml" # Mapper.xml文件地址,默认值global-config:db-config:id-type: auto # 指定 id 的生成方式configuration:map-underscore-to-camel-case: true # 是否开启下划线和驼峰的映射cache-enabled: false # 是否开启二级缓存

对上述配置的说明:

  • 因为 MyBatis Plus 支持 MyBatis ,因此在 MyBatis Plus 中也支持手写 SQL形式的 Mapper 映射。因为 mapper 文件的读取地址可以由我们自己配置。
  • id-type:可指定在默认情况下 id 的生成方式,比如 auto、 assign_id 等。
  • map-underscore-to-camel-case:开启下划线和驼峰的命名规则直接的映射转换。
  • cache-enabled:是否开启二级缓存。

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

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

相关文章

rust 创建多线程web server

创建一个 http server&#xff0c;处理 http 请求。 创建一个单线程的 web 服务 web server 中主要的两个协议是 http 和 tcp。tcp 是底层协议&#xff0c;http 是构建在 tcp 之上的。 通过std::net库创建一个 tcp 连接的监听对象&#xff0c;监听地址为127.0.0.1:8080. us…

css文字竖向排列

div { writing-mode: vertical-rl;text-orientation: upright;font-size: .25rem; //文字大小letter-spacing: 0.1em; //文字间距}

常用第三方库

Moment GTC(Greenwish Mean Time)&#xff1a;格林威治时间&#xff0c;太阳时&#xff0c;精确到毫秒UTC(Universal Time Coodinated)&#xff1a;世界协调时间&#xff0c;原子种计时&#xff0c;精确到纳秒 GTC和UTC都是以0时区作为标准时间戳&#xff1a;以UTC的1970-1-1 …

python自动化测试(五):按键模拟输入:全选、复制、清空、粘贴、完成

前置条件&#xff1a; 本地部署&#xff1a;ECShop的版本是3.0.0、Google版本是 Google Chrome65.0.3325.162 (正式版本) &#xff08;32 位&#xff09; Google驱动的selenium版本是3.11.0 目录 一、配置代码 二、键盘组合输入 2.1 全选&#xff1a;ctrl a 2.2 复制…

OpenCV官方教程中文版 —— Hough 直线变换

OpenCV官方教程中文版 —— Hough 直线变换 前言一、原理二、OpenCV 中的霍夫变换三、Probabilistic Hough Transform 前言 目标 • 理解霍夫变换的概念 • 学习如何在一张图片中检测直线 • 学习函数&#xff1a;cv2.HoughLines()&#xff0c;cv2.HoughLinesP() 一、原理…

DIY相机(一)libcamera库

相机选型 DIY相机首先是要确定使用的相机型号。兼容树莓派&#xff0c;画质好一些的&#xff0c;目前主要有两款&#xff1a;一是Raspberry Pi Camera Module 3&#xff0c;二是Raspberry Pi HQ Camera。 下图是Raspberry Pi Camera Module 3的相关特性。支持自动对焦和HDR等…

JDK21下载和安装

说明 本文介绍 JDK21&#xff08;Oracle版&#xff09;的下载和安装。 下载 Oracle官网JDK21下载页面 根据操作系统的类型&#xff0c;下载相应的版本。本文下载的是Windows64位的安装版。 下载页面示例 安装包示例 安装 双击安装包&#xff0c;开始安装。 把路径改为自定…

openpnp - SlotSchultzFeeder source code bugfix

文章目录 openpnp - SlotSchultzFeeder source code bugfix概述笔记openpnp源码调试环境排查思路开git分支查到的问题 - 1查到的问题 - 2查到的问题 - 3针对以上问题进行的逻辑修正D:\my_openpnp\openpnp_github\src\main\java\org\openpnp\machine\reference\driver\wizards\G…

【计算机视觉】对极几何

文章目录 一、极线约束&#xff08;Epipolar Constraint&#xff09;二、相机标定过的情况三、相机没有标定过的情况四、八点算法&#xff08;eight-point algorithm&#xff09; 我的《计算机视觉》系列参考UC Berkeley的CS180课程&#xff0c;PPT可以在课程主页看到。 在上一…

Nokogiri库和OpenURI库使用HTTP做一个爬虫

Nokogiri和OpenURI是两个常用的Ruby库&#xff0c;用于编写爬虫程序。它们的主要功能如下&#xff1a; 1、Nokogiri&#xff1a;Nokogiri是一个强大的HTML和XML解析库&#xff0c;可以用于解析网页内容。它提供了一组简单易用的API&#xff0c;可以方便地遍历和操作HTML或XML文…

c++设计模式三:工厂模式

本文通过一个例子简单介绍简单工厂模式、工厂模式和抽象工厂模式。 1.简单工厂&#xff08;静态&#xff09; 假如我想换个手机&#xff0c;换什么手机呢&#xff1f;可以考虑苹果或者华为手机&#xff0c;那我们用简单工厂模式来实现这个功能&#xff1a; 我们关注的产品是手…

selenium判断元素可点击、可见、可选

1、判断元素是否可以点击 判断元素是否可以点击&#xff0c;WebElement对象调用is_enabled() is_enabled()方法返回一个布尔值&#xff0c;若可点击返回&#xff1a;True。若不可点击则返回&#xff1a;False from selenium import webdriver import time from selenium.web…

OpenCV C++ 图像处理实战 ——《缺陷检测》

OpenCV C++ 图像处理实战 ——《缺陷检测》 一、结果演示二、缺陷检测算法2.1、多元模板图像2.2、训练差异模型三、图像配准3.1 功能源码3.1 功能效果四、多元模板图像4.1 功能源码五、缺陷检测5.1 功能源码六、源码测试图像下载总结一、结果演示

ARP和DDOS攻击防御介绍

✍ 如何利用ARP漏洞进行攻击&#xff1f; ✍ 怎样有效地防御ARP攻击&#xff1f; ✍ 如何应对DDOS攻击&#xff1f; ---- ARP -- 地址解析协议 ---- 最简单的协议 pc和交换机通信后就会更新地址表&#xff1a; ARP&#xff1a; PC1要访问百度&#xff1a; 发送一个广播…

基于SSM的个性化美食推荐系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;采用JSP技术开发 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#x…

Websocket传递JWT令牌

在访问带有[Authorize]的方法的时候&#xff0c;需要前端通过自定义报文头的形式将JWT令牌传递给后端进行验证&#xff0c;否则是不能访问带有[Authorize]的方法。 [Authorize]是用于限制对web应用程序中某些操作或控制器的访问。当[授权]属性应用于操作或控制器时&#xff0c;…

vivo自研AI大模型即将问世,智能手机行业加速迈向AI时代

当前&#xff0c;以大模型为代表的人工智能技术已发展为新一轮科技革命和产业变革的重要驱动力量&#xff0c;被视作推动经济社会发展的关键增长极。 AI大模型潮起&#xff0c;千行百业走向百舸争流的AI创新应用期&#xff0c;前沿信息技术向手机、PC、车机等消费级终端加速渗…

Beyond Compare比较规则设置 Beyond Compare怎么对比表格

在对文件进行比较时&#xff0c;文件夹内的文件可能存在不同类型、不同后缀名、不同内容等差异&#xff0c;这些差异会影响具体的比较结果&#xff0c;因此需要我们对软件的比较规则进行一些设置。接下来就让我们一起来学习一下Beyond Compare比较规则设置&#xff0c;Beyond C…

Qt+JSON简单例子

QtJSON简单例子 QtJSONexample2参考 QtJSON #include "mainwindow.h" #include "ui_mainwindow.h" #include <QtDebug> #include <QJsonObject> #include <QJsonArray> #include <QJsonDocument> #include <QTextCodec> #i…

Linux C/C++ 实现网络流量分析(性能工具)

网络流量分析的原理基于对数据包的捕获、解析和统计分析&#xff0c;通过对网络流量的细致观察和分析&#xff0c;帮助管理员了解和优化网络的性能、提高网络安全性&#xff0c;并快速排查和解决网络故障和问题。 Linux中的网络流量常见类型 在Linux中&#xff0c;网络流量可以…