【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 {

    @Autowired
    private UserMapper userMapper;

    @Test
    void 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);
    }

    @Test
    void testSelectById() {
        // User user = userMapper.queryUserById(5L);
        User user = userMapper.selectById(5L);
        System.out.println("user = " + user);
    }


    @Test
    void 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);
    }

    @Test
    void testUpdateById() {
        User user = new User();
        user.setId(5L);
        user.setBalance(20000);
        // userMapper.updateUser(user);
        userMapper.updateById(user);
    }

    @Test
    void 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 {
    @TableId
    private 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 {
    @TableId
    private 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:是否开启二级缓存。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

安装Redis使用make命令报异常

报错信息如下&#xff1a; 解决方案&#xff1a; 安装 gcc yum install gcc-c -y清空编译失败残留文件&#xff1a; make distclean使用 make 命令进行编译&#xff1a; make -j 2 PREFIX/usr/local/redis install

Jmeter性能 —— 事务控制器

统计性能测试结果一定会关注TPS&#xff0c;TPS表示&#xff1a;每秒处理事务数&#xff0c;JMeter默认每个事务对应一个请求。我们可以用逻辑控制器中的事务控制器将多个请求统计为一个事务。 1、添加事务控制器 2、事务控制器参数说明 Generate parent sample&#xff1a;如…

编写虚拟UART驱动程序-框架

一、框架回顾 二、编写UART驱动要做的事 1.注册一个uart_driver 2. 对于每一个port&#xff0c;都会在设备树里面有一个节点 3. 设备树里的节点和platform_driver节点匹配 4. 当platform_dirver的probe函数被调用时&#xff0c;可以获得设备树里的信息&#xff0c;从而把每个串…

Vue3 封装 element-plus 图标选择器

一、实现效果 效果一&#xff1a; 效果二&#xff1a; 效果一的这个是把全部的icon图标都让它显示出来&#xff0c;让我们自己选择说选图标 二、效果一实现步骤 2.1. 全局注册 icon 组件 // main.ts import App from ./App.vue; import { createApp } from vue; import * a…

代码随想录算法训练营第2天| 977有序数组的平方、209长度最小的子数组。

JAVA代码编写 977. 有序数组的平方 给你一个按 非递减顺序 排序的整数数组 nums&#xff0c;返回 每个数字的平方 组成的新数组&#xff0c;要求也按 非递减顺序 排序。 示例 1&#xff1a; 输入&#xff1a;nums [-4,-1,0,3,10] 输出&#xff1a;[0,1,9,16,100] 解释&…

PDF编辑工具Acrobat Pro DC 2023中文

Acrobat Pro DC 2023是一款全面、高效的PDF编辑和管理软件。它提供了丰富的PDF编辑功能&#xff0c;如创建、编辑、合并、分割、压缩、旋转、裁剪等&#xff0c;让用户可以轻松处理各种PDF文档。同时&#xff0c;该软件还具有智能的PDF处理技术&#xff0c;可以自动识别和修复P…

中国铁路线路数据,分为高速铁路和普通铁路,有shp格式和xlsx格式,免费下载

数据地址&#xff1a; 中国铁路线路数据https://www.xcitybox.com/datamarketview/#/Productpage?id274 基本信息. 数据名称: 中国铁路线路数据 数据格式: ShpXlsx 数据时间: 2018年 数据几何类型: 线 数据坐标系: WGS84坐标系 数据来源&#xff1a;网络公开数据 数据…

Java 使用 poi 和 aspose 实现 word 模板数据写入并转换 pdf 增加水印

本项目所有源码和依赖资源都在文章顶部链接&#xff0c;有需要可以下载使用 1. 需求描述 从指定位置读取一个 word 模板获取业务数据并写入该 word 模板&#xff0c;生成新的 word 文档将新生成的 word 文档转换为 pdf 格式对 pdf 文档添加水印 2. 效果预览 word 模板 带水印的…

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…

Spark On Hive原理和配置

目录 一、Spark On Hive原理 &#xff08;1&#xff09;为什么要让Spark On Hive&#xff1f; 二、MySQL安装配置&#xff08;root用户&#xff09; &#xff08;1&#xff09;安装MySQL &#xff08;2&#xff09;启动MySQL设置开机启动 &#xff08;3&#xff09;修改MySQL…

用 Rust 和 cURL 库制作一个有趣的爬虫

目录 一、介绍 二、准备工作 三、代码实现 四、解析 HTML 并提取特定元素示例 总结 本文将介绍如何使用 Rust 编程语言和 cURL 库制作一个有趣的网络爬虫。我们将通过实例代码来展示如何抓取网页内容、处理数据和解析 HTML 结构。同时&#xff0c;还将探讨爬虫技术的原理、…

YOLOv5 添加 OTA,并使用 coco、CrowdHuman数据集进行训练。

YOLO-OTA 第一步&#xff1a;拉取 YOLOv5 的代码第二步&#xff1a;添加 ComputeLossOTA 函数第二步&#xff1a;修改 train 和 val 中损失函数为 ComputeLossOTA 函数1、在 train.py 中 首先添加 ComputeLossOTA 库。2、在 train.py 修改初始化的损失函数3、在 train.py 修改一…

ChatGPT 与 Python Echarts 完成热力图实例

热力图是一种数据可视化方式&#xff0c;它通过颜色的变化来表示数据的差异和分布。以下是使用热力图的一些作用和好处&#xff1a; 数据可视化&#xff1a;热力图可以将复杂的数据集转化为更直观、更易理解的形式。这对于很多人来说&#xff0c;尤其是那些没有深入统计学或数…

YouTrack 中如何设置邮件通知

在 YouTrack 中&#xff0c;默认是不会邮件通知的。 你可以为你的账号设置邮件通知。 设置的方法为单击用户属性&#xff0c;然后在弹出的小窗口中选择属性选项。 设置邮件通知 在通知 Tab 页面中&#xff0c;选择发送邮件的方式&#xff0c;默认这个选项是不选择的。 用户…

IDEA 断点高阶

一、按钮介绍 1.1 补充 返回断点处&#xff1a; 设置debug配置&#xff1a; 二、增加/切换debugger视图 三、window快捷键 所在行处&#xff1a; CtrlF8断点属性编辑&#xff1a; CtrlShiftF8 四、一些常用的高级功能 4.1 查看对象内存-Attach memory agent 1.勾选Atta…

vscode下ssh免密登录linux服务器

vscode使用ssh免密登录linux 1、安装SSH插件2、生成密钥3、linux安装ssh服务4、linux下配置公钥5、vscode远程登录 注&#xff1a;测试环境为window10Ubuntu1804/Ubuntu2204 1、安装SSH插件 扩展->搜索SSH->点击install进行安装&#xff0c;如下图所示&#xff1a; 2、…

非小米笔记本小米妙享中心安装最新教程 3.2.0.464 兼容所有Windows系统

小米妙享中心 3.2.0.464 版本帮助 : 支持音频流转、屏幕镜像、屏幕拓展、键鼠拓展、无线耳机、小米互传 目录 小米妙享中心 3.2.0.464 版本帮助 : 1.常规教程使用安装包方式安装失败 或者 1.1安装失败可使用大佬的加载补丁方法解决 补充卸载残留 1.2 截图存档 2. 本教程…

原生JavaScript实现的SPA单页应用(hash路由)

什么叫做SPA单页应用 单页Web应用 &#xff08;single page web application&#xff0c;SPA&#xff09; &#xff0c;就是只有一张Web页面的应用&#xff0c;是加载单个HTML 页面并在用户与应用程序交互时动态更新该页面的Web应用程序。 单页应用的说法是在JavaScript和AJA…

每日一练——返回链表的中间结点

&#x1d649;&#x1d65e;&#x1d658;&#x1d65a;!!&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦&#x1f44f;&#x1f3fb;‧✧̣̥̇‧✦ &#x1f44f;&#x1f3fb;‧✧̣̥̇:Solitary-walk ⸝⋆ ━━━┓ - 个性标签 - &#xff1a;来于“云”的“羽球人”。…

Nginx 的配置文件(负载均衡,反向代理)

Nginx可以配置代理多台服务器&#xff0c;当一台服务器宕机之后&#xff0c;仍能保持系统可用。 cmd查找端口是否使用&#xff1a;netstat -ano Nginx出现403 forbidden #解决办法&#xff1a;修改web目录的读写权限&#xff0c;或者是把nginx的启动用户改成目录的所属用户&…