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

news2024/11/19 11:28:56

文章目录

  • 一、初识 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:是否开启二级缓存。

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

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

相关文章

Android12之#pragma clang diagnostic ignored总结(一百六十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

性能卓越 全栈自主 HashData与华为金融数仓一体机联合方案全面解读

​金融业作为数据覆盖广泛、服务社会主体众多、应用场景丰富的关键行业&#xff0c;一直以对数据基础设施的高要求而著称&#xff0c;也是检验产品与方案成熟度的试金石。经过长期的服务与实践&#xff0c;HashData已形成面向金融核心业务的成熟数仓产品。 凭借对金融场景的深…

基于Python Django 的微博舆论、微博情感分析可视化系统(V2.0)

文章目录 1 简介2 意义3 技术栈Django 4 效果图微博首页情感分析关键词分析热门评论舆情预测 5 推荐阅读 1 简介 基于Python的微博舆论分析&#xff0c;微博情感分析可视化系统&#xff0c;项目后端分爬虫模块、数据分析模块、数据存储模块、业务逻辑模块组成。 Python基于微博…

计算文本相似度,输出相似度最高的n个

TF-IDF import jieba import pandas as pd from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.metrics.pairwise import cosine_similarity# 示例句子列表 sentences ["今天天气真好&#xff0c;阳光明媚。","关键字匹配是一种常见的…

什么是虚拟主播?

随着科技的不断发展&#xff0c;人工智能技术已经逐渐渗透到各个行业&#xff0c;为企业带来了前所未有的变革。在视频制作领域&#xff0c;美摄作为一家领先的智能视频技术提供商&#xff0c;针对企业需求推出了一款创新的虚拟主播解决方案&#xff0c;旨在帮助企业实现高效、…

「滚雪球学Java」:常用类(章节汇总)

&#x1f3c6;本文收录于「滚雪球学Java」专栏&#xff0c;专业攻坚指数级提升&#xff0c;助你一臂之力&#xff0c;带你早日登顶&#x1f680;&#xff0c;欢迎大家关注&&收藏&#xff01;持续更新中&#xff0c;up&#xff01;up&#xff01;up&#xff01;&#xf…

机器学习实验六:决策树-海洋生物例子

#创建数据集 import numpy as np import pandas as pd from sklearn import tree from sklearn.tree import DecisionTreeClassifier import graphviz def createDataSet():row_data {no surfacing:[1,1,1,0,0],flippers:[1,1,0,1,1],fish:[yes,yes,no,no,no]}dataSet pd.Dat…

轻松搭建Linux宝塔面板并实现公网访问Discuz论坛,让您的论坛更具吸引力

文章目录 前言1.安装基础环境2.一键部署Discuz3.安装cpolar工具4.配置域名访问Discuz5.固定域名公网地址6.配置Discuz论坛 前言 Crossday Discuz! Board&#xff08;以下简称 Discuz!&#xff09;是一套通用的社区论坛软件系统&#xff0c;用户可以在不需要任何编程的基础上&a…

js中的Formdata数据结构

这里写目录标题 一、基本概念二、常用方法1.append(name, value)、set(name, value)2.get()、getAll()3.has(name)4.delete(name)5.keys(),values(),entries() 三、其他细节1.for of遍历2.转为对象3.结合 URLSearchParams 转为queryString 一、基本概念 FormData 提供了一种表…

推送内容有误怎么办?MobPush撤回/取消推送为您排忧解难

消息推送已成为深度连接APP和用户的利器&#xff0c;对推送内容的准确性和时效性的要求也更为严格&#xff0c;倘若推送的内容出现错误&#xff0c;或推送的内容已经失去了时效性&#xff0c;此时又该怎么办呢&#xff1f;别急&#xff0c;近日MobPush全新上线了取消推送和撤回…

Lightroom学习之路

基础知识 常用快捷键 双击修改图片下右边布局的属性&#xff0c;快速回到初始值 B站学习笔记 1、导入到图库为图片标星级&#xff0c;后期优先处理星级高的图片 2、修改照片-基础-白平衡有吸管吸颜色会自动平衡照片颜色 3、直方图左右上角三角形&#xff0c;选中后照片会显示…

04 # 手写 apply

apply apply 的作用跟 call 的作用是一样的&#xff0c;只不过传递的参数是以数组的形式 手写 apply <script>Function.prototype.kaimoApply function (content, args) {// 没有东西指向 window&#xff0c;将 content 包装成对象content content ? Object(conten…

LeetCode刷题之分隔链表(图解➕代码)

首先直接进入主题&#xff0c;题目链接&#x1f517;力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 源代码在最后&#xff0c;有更优解的朋友欢迎在评论里指导我一番&#xff01; 1.题目分析 通过题目分析得出结论&#xff1a; 1. 将链表分为k个子…

一文拿捏内网穿透利器之frp(反向代理软件相关)

一文拿捏内网穿透利器之frp 一、什么是 frp 1.1 内网穿透 如下图所示, 一般情况下, 公网内的设备都能够被任意一台设备访问到!! 而不同局域网内的设备是相互隔离的, 局域网 A 的设备是无法访问到局域网 B 内的设备 而内网穿透技术, 顾名思义就是能让公网、或者当前局域网外的任…

一个进程最多可以创建多少个线程

前言 话不多说&#xff0c;先来张脑图~ linux 虚拟内存知识回顾 虚拟内存空间长啥样 在 Linux 操作系统中&#xff0c;虚拟地址空间的内部又被分为内核空间和用户空间两部分&#xff0c;不同位数的系统&#xff0c;地址空间的范围也不同。 比如最常见的 32 位和 64 位系统&…

操作系统:进程与线程(一)进程与线程的概念及处理机调度算法

一战成硕 2.1 进程与线程2.1.1 进程的概念和特征2.1.2 进程的状态与转换2.1.3 进程的组织2.1.4 进程控制2.1.5 进程的通信2.1.6 线程和多线程模型 2.2 处理机调度2.2.1 调度的概念2.2.2 调度的目标2.2.3 调度的实现2.2.4 典型的调度算法 2.1 进程与线程 2.1.1 进程的概念和特征…

MODBUS-TCP通信客户端如何访问服务器端RS485总线上的从站(SMART PLC梯形图程序)

SMART PLC的 MODBUS-TCP通信请参考下面文章链接: S7-200SMART PLC ModbusTCP通信(多服务器多从站轮询)_matlab sumilink 多个modbustcp读写_RXXW_Dor的博客-CSDN博客文章浏览阅读6.2k次,点赞5次,收藏10次。MBUS_CLIENT作为MODBUS TCP客户端通过S7-200 SMART CPU上的以太网…

若依ruoyi-nbcio如何做一个仿钉钉流程设计器的思考

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码&#xff1a; https://gitee.com/nbacheng/ruoyi-nbcio 演示地址&#xff1a;RuoYi-Nbcio后台管理系统 看到有些流程图采用仿钉钉的流程设计&#xff0c;比如下面界面&#xff1a; 这种方式虽然简单&#xff0c…

Python 中的 Pexpect

我们将通过示例介绍Python中的Pexpect。 Python 中的 Pexpect Python 是一种非常流行的语言&#xff0c;用于数据科学和机器学习。 它是一种非常强大的语言&#xff0c;因为 Python 具有可用于不同目的的内置库。 在这篇文章中&#xff0c;我们将研究Python中的pexpect。 Pex…

找不到msvcr90.dll无法继续执行代码怎么解决

msvcr90.dll是Microsoft Visual C 2008 SP1可再发行程序包中的一个动态链接库文件。它包含了用于支持C编程语言的类和函数。动态链接库是一种可重用的代码模块&#xff0c;它可以在多个应用程序之间共享&#xff0c;从而减少代码量并提高开发效率。那么遇到msvcr90.dll丢失怎么…