Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >mybatis-plus

mybatis-plus

作者头像
楠羽
发布于 2022-11-18 03:06:00
发布于 2022-11-18 03:06:00
90102
代码可运行
举报
文章被收录于专栏:后端开发笔记后端开发笔记
运行总次数:2
代码可运行

mybatis-plus 简介

MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

愿景是成为 MyBatis 最好的搭档!

官方地址:https://baomidou.com/

文档发布地址:https://baomidou.com/pages/24112f

常用注解(12 个)

1、@MapperScan

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@SpringBootApplication
@MapperScan("com.cabbage.mapper")
public class Mybatisplus01Application {
public static void main(String[] args) {
SpringApplication.run(Mybatisplus01Application.class, args);
}
}

复制代码

结合代码和图片,小伙伴们估计可以猜出来:注解 @MapperScan 是用来扫描 mapper 的映射文件的,只有使用它之后,我们才能够使用官方提供的各种方法。

2、@Mapper

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Mapper
@Repository
public interface UserMapper extends BaseMapper<User> {
/**
* 根据id查询到map集合
* @param id
* @return
*/
Map<String,Object> selectMapById(Long id);
}

复制代码

为什么第二个我会介绍这个注解呢?是因为 @Mapper 作用于数据库中的实体类之后,就不需要再次写注解 @MapperScan,他们之间的区别就是 @Mapper 只能映射一个实体类,而 @MapperScan 可以映射整个包下的实体类,范围更广,操作更简便。

3、@TableName

先看看如下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Data
//设置实体类对应的表名
@TableName("t_user")
public class User {
@TableId(value = "id",type = IdType.AUTO)
private Long uid;
@TableField(value = "name")
private String name;
private Integer age;
private String email;
@TableField(value = "is_deleted")
@TableLogic
private Integer isDeleted;
}

复制代码

大家都知道,当实体类类型的类名和要操作的表的表名不一致时,就会报错,而注解 @TableName 就可以帮助我们解决这个问题。我的数据库表名是 t_user,实体类名是 User,只需要在类名上写入 @TableName("t_user")就可以了

4、@Data

这个注解也极大的简化了我们的开发,为什么这样说呢?是因为,使用这个注解,就可以省略 getter()、setter()、toString()、重写该类的 equals()和 hashCode()方法,这样一听,是不是很吃惊呢?

5、@TableId

MyBatis-Plus 在实现增删改查时,会默认将 id 作为主键列,并在插入数据时,默认基于雪花算法的策略生成 id,这个雪花算法在这里就不明讲了。

当使用 @TableId(value = "id")语句时,若实体类和表中表示主键的不是 id,而是其他字段,例如代码中的 uid,MyBatis-Plus 会自动识别 uid 为主键列,否则就会报这样的错误:

当使用 @TableId(value = "id",type = IdType.AUTO)语句时,代表着使用数据库的自增策略,注意,该类型请确保数据库设置了 id 自增,否则无效!

当然呢,@TableId 的功能,也可以写在 application.yml 配置文件中,配置如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mybatis-plus:
global-config:
banner: false
db-config:
# 配置MyBatis-Plus操作表的默认前缀
table-prefix: "t_"
# 配置MyBatis-Plus的主键策略
id-type: auto
# 配置MyBatis日志
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

复制代码

6、@TableField

MyBatis-Plus 在执行 SQL 语句时,要保证实体类中的属性名和表中的字段名一致,否则就会报错,语句 @TableField(value = "is_deleted")代表着让数据库表中 is_deleted 与实体类中 isDeleted 字段名一样。

注意:

  • 若实体类中的属性使用的是驼峰命名风格,而表中的字段使用的是下划线命名风格 例如实体类属性 userName,表中字段 user_name,此时 MyBatis-Plus 会自动将下划线命名风格转化为驼峰命名风格
  • 若实体类中的属性和表中的字段不满足上述条件,例如实体类属性 name,表中字段 username,此时需要在实体类属性上使用 @TableField("username")设置属性所对应的字段名

7、@TableLogic

在讲这个注解之前,我们先认识一下逻辑删除。

  • 物理删除:真实删除,将对应数据从数据库中删除,之后查询不到此条被删除的数据
  • 逻辑删除:假删除,将对应数据中代表是否被删除字段的状态修改为“被删除状态”,之后在数据库中仍旧能看到此条数据记录
  • 使用场景:可以进行数据恢复

在我的数据库表中,is_delete 为 1 时,代表着逻辑上的删除,is_delete 为 0 时,表示没有删除

注解 @TableLogic 的使用,就代表着该类中的属性是逻辑删除的属性

注意:

  • 在测试逻辑删除的时候,真正执行的是修改 UPDATE t_user SET is_deleted=1 WHERE id=? AND is_deleted=0
  • 测试查询功能,被逻辑删除的数据默认不会被查询 SELECT id,username AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0

在学习 mybatis-plus 分页插件的时候,我们需要配置拦截器,看代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor =
new MybatisPlusInterceptor();


interceptor.addInnerInterceptor
(new PaginationInnerInterceptor(DbType.MYSQL));
return interceptor;
}
}

复制代码

8、@Configuration

这个注解相信大家已经见过很多次了,可能都有些不耐烦了,但是我还是要在这里提一下,使用该注解的类代表着是一个配置类,该类本身也是一个 bean。也可以在该类中加载 bean,使用 @Bean 注解

9、@Bean

注解 @Bean 表示的是将方法中的对象注入到 spring 容器中,以后方便于之后在容器中拿出对象,简化开发。常与 @Configuration 注解一起使用,相信大家也经常见到此注解,这里也不多讲了~

既然讲到了分页插件,那就简单的看看他们的基本使用方法吧

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Test
void test01() {
//设置分页参数
Page<User> page = new Page<>(1, 3);
userMapper.selectPage(page, null);
//获取分页数据
List<User > list = page.getRecords();
list.forEach(System.out::println);
System.out.println("当前页:" + page.getCurrent());
System.out.println("每页显示的条数:" + page.getSize());
System.out.println("总记录数:" + page.getTotal());
System.out.println("总页数:" + page.getPages());
System.out.println("是否有上一页:" + page.hasPrevious());
System.out.println("是否有下一页:" + page.hasNext());
}

复制代码

运行结果:

10、@Param

当我使用自定义的分页语句时:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Mapper
@Repository
public interface UserMapper extends BaseMapper<User> {
/**
* 通过年龄查询用户信息并分页
* @param page
* @param age
* @return
*/
Page<User> selectPageByAge( Page<User> page, @Param("age") Integer age);
}
<mapper namespace="cabbage.mapper.UserMapper">
<select id="selectPageByAge" resultType="User">
SELECT id,`name`,age,email FROM `user` where age > #{age}
</select>
</mapper>

复制代码

@Param 是 MyBatis 所提供的,作为 Dao 层的注解,作用是用于传递参数,从而可以与 SQL 中的的字段名相对应,简化了开发~

11、@Version

在我们学习乐观锁的时候,肯定见过如下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Data
@TableName("t_product")
public class Product {
private Long id;
private String name;
private Integer price;
@Version
private Integer version;
}
@Configuration
public class MybatisPlusConfig {
@Bean
public MybatisPlusInterceptor mybatisPlusInterceptor() {
MybatisPlusInterceptor interceptor =
new MybatisPlusInterceptor();
//分页插件
interceptor.addInnerInterceptor
(new PaginationInnerInterceptor(DbType.MYSQL));
//乐观锁插件
interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
return interceptor;
}
}

复制代码

而这个注解 @Version 就是实现乐观锁的重要注解,当要更新数据库中的数据时,例如价格,version 就会加 1,如果 where 语句中的 version 版本不对,则更新失败。

12、@EnumValue

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Getter
public enum SexEnum {
MALE(1, "男"),
FEMALE(2, "女");
@EnumValue
private Integer sex;
private String sexName;
SexEnum(Integer sex, String sexName) {
this.sex = sex;
this.sexName = sexName;
}
}
mybatis-plus:
global-config:
banner: false
db-config:
# 配置MyBatis-Plus操作表的默认前缀
table-prefix: "t_"
# 配置MyBatis-Plus的主键策略
id-type: auto
# 配置MyBatis日志
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
# 配置类型别名所对应的包
type-aliases-package: cabbage.pojo
# 配置扫描通用枚举
type-enums-package: cabbage.pojo

复制代码

而注解 @EnumValue 所标识的属性值会存储到数据库,相当于语句 INSERT INTO t_user ( username, age, sex ) VALUES ( ?, ?, ? )

Parameters: Enum(String), 20(Integer), 1(Integer)

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-07-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
为什么图像处理如此困难
但为什么会这样呢?你认为经过几十年的研究,我们会很自然地说“这里的问题已经解决了,让我们专注于别的事情”。在某种程度上,我们可以这样说,但仅适用于狭窄和简单的用例(例如,在空的白板上放置红色勺子),而不是一般的计算机视觉(例如,在所有可能的场景中找到一把红色的勺子,就像一个大盒子满了五颜六色的玩具)。
小白学视觉
2019/06/02
1.4K0
FPGA Xilinx Zynq 系列(十四)应用和机会 之 图像和视频处理,及计算机视觉
今天给大侠带来FPGA Xilinx Zynq 系列第十四篇,本篇内容目录简介如下:
FPGA技术江湖
2020/12/30
1.6K0
从.JPG到.AVI,这篇视频编码的最强入门科普,你值得拥有!
剧里主要讲述的,是一群美国硅谷年轻人的创业故事。我觉得挺好看的,一口气追完了(貌似后面还会更新)。同为创业者,对里面的剧情非常有感触。
鲜枣课堂
2019/07/22
8710
从.JPG到.AVI,这篇视频编码的最强入门科普,你值得拥有!
零基础,史上最通俗视频编码技术入门
本文引用了微信公众号“鲜枣课堂”的《视频编码零基础入门》内容。为了更好的内容呈现,引用和收录时内容有改动,转载时请注明原文来源信息,尊重原作者的劳动。
JackJiang
2019/11/21
1.9K0
零基础,史上最通俗视频编码技术入门
PyTorch 图像篇
计算机视觉技术是一门包括计算机科学与工程、神经生理学、物理学、信号处理、认知科学、应用数学与统计等多学科的综合性科学技术, 是人工智能的一个重要分支, 目前在智能安防、自动驾驶汽车、医疗保健、生成制造等领域具有重要的应用价值。
@小森
2024/05/13
1790
PyTorch 图像篇
【AI白身境】深度学习必备图像基础
图像是什么?这个问题大家都有自己的答案。我的答案是,图像是一门语言,是人类文明的象征。
用户1508658
2019/07/26
9870
【AI白身境】深度学习必备图像基础
手把手教你使用图像处理利器OpenCV
在本文中,将学习如何使用Python语言进行图像处理,我们不会局限于一个单独的库或框架,然而,有一个库的使用率将会是最高的,那就是OpenCV。我们一开始会讨论一些图像处理,然后继续探讨不同的应用/场景,也就是图像处理的用武之地。开始吧!
老齐
2020/05/15
1.5K0
手把手教你使用图像处理利器OpenCV
Prophesee:基于帧的传感器到基于事件的视觉系统
基于事件的视觉功能,如眼睛和大脑,以克服传统机器视觉的固有限制。人眼与传统摄像机几乎没有什么共同之处。
AiTechYun
2019/06/18
1.5K0
Prophesee:基于帧的传感器到基于事件的视觉系统
为什么深度学习不能取代传统的计算机视觉技术?
译者 | 王柯凝 编辑 | 周翔 当你辗转于各种论坛时,相信会经常看到这样的问题:深度学习是否会取代传统的计算机视觉?或者说,当深度学习看起来如此有效时,是否还有必要研究传统的计算机视觉技术? 这是一个非常好的问题。 深度学习已经彻底改变了计算机视觉和人工智能这一领域,许多曾经看起来不可能解决的问题,深度学习都能够解决——尤其是在图像识别和分类问题上,机器已经超越人类(短链:http://t.cn/Rnzv2JX)。事实上,深度学习也强化了计算机视觉在行业中的重要地位。 但是,深度学习对计算机视觉来说仅仅是
用户1737318
2018/06/05
6410
观点 | 为什么深度学习仍未取代传统的计算机视觉技术?
选自zbigatron 作者:Zbigatron 机器之心编译 参与:张楚、黄小天 本文作者认为,深度学习只是一种计算机视觉工具,而不是包治百病的良药,不要因为流行就一味地使用它。传统的计算机视觉技术仍然可以大显身手,了解它们可以为你省去很多的时间和烦恼;并且掌握传统计算机视觉确实可以让你在深度学习方面做得更好。这是因为你可以更好地理解深度学习的内部状况,并可执行预处理步骤改善深度学习结果。 本文的灵感同样来自论坛中的一个常见问题: 深度学习已经取代了传统的计算机视觉吗? 或是换种说法: 既然深度学习看起来
机器之心
2018/05/08
6630
观点 | 为什么深度学习仍未取代传统的计算机视觉技术?
图像处理基础知识!!
· 图像 一张图片包含了:维数、高度、宽度、深度、通道数、颜色格式、数据首地址、结束地址、数据量等等。
用户6133654
2019/12/12
1.4K0
机器人视觉的九大挑战
机器人视觉解决方案是我们实现机器人视野的几大挑战。即便变得越来越简单易用,还是有一些棘手的问题。很多因素影响机器人在环境中的视觉,任务设置和工作场所。这里有9个总结出来的机器人视觉挑战:
小白学视觉
2019/07/30
9280
一文囊括图像处理25个高频考点
从非结构化数据中提取有用的信息一直是研究界极为关注的话题。图像就是一种这样的非结构化数据,图像数据分析在商业的各个方面都有应用。
AI算法与图像处理
2020/08/28
4920
一文囊括图像处理25个高频考点
TRTC Android端开发接入学习之音视频基础(一)
是人对视觉感知的物质再现。三维自然场景的对象包括:深度,纹理和亮度信息。二维图像:纹理和亮度信息。
腾讯云-hongyang
2020/08/31
1.4K0
TRTC Android端开发接入学习之音视频基础(一)
【OpenCV】入门教学/了解图像处理的基本原理
本文是基于哔哩哔哩OpenCV入门课程的内容加上我个人的理解而来。 本篇文章的主要内容: 阅读本篇文章,你需要具备python的基本语法的学习。如果你并没有学习过python,可以去看我的python专栏:python
Yui_
2025/02/03
5000
【OpenCV】入门教学/了解图像处理的基本原理
十个python图像处理工具
【磐创AI导读】:本篇文章为大家介绍了十个python图像处理工具,希望对大家有所帮助。想要获取更多的机器学习、深度学习资源,欢迎大家点击上方蓝字关注我们的公众号:磐创AI。
磐创AI
2019/09/03
1.7K0
十个python图像处理工具
整理 Python 中的图像处理利器(共10个)
当今世界充满了各种数据,而图像是其中高的重要组成部分。然而,若想其有所应用,我们需要对这些图像进行处理。图像处理是分析和操纵数字图像的过程,旨在提高其质量或从中提取一些信息,然后将其用于某些方面。
Python知识大全
2021/10/26
1.4K0
整理 Python 中的图像处理利器(共10个)
[Python图像处理] 一.图像处理基础知识及OpenCV入门函数
数字图像处理(Digital Image Processing)又称为计算机图像处理(Computer Image Processing),旨在将图像信号转换成数字信号并利用计算机对其进行处理的过程。其运用领域如下图所示,涉及通信、生物医学、物理化学、经济等。
Eastmount
2021/12/02
2.2K0
[Python图像处理] 一.图像处理基础知识及OpenCV入门函数
Zynq-7000能干什么
因为Zynq-7000 PS(Processing System)端嵌入了Cortex-A9 ARM 处理核以及PL(Programmable Logic)端为基于Kintex-7或者Artix-7的FPGA架构使得Xilinx Zynq-7000更加强悍,应用领域更加广泛。下面将从以下方面介绍Zynq-7000的应用领域:汽车、通信系统、机器人、控制和仪器 、图像和视频处理 、医药、工业控制和许多其他领域。
FPGA开源工作室
2019/10/29
1.4K0
Zynq-7000能干什么
【图像篇】opencv图像处理(一)---图像基础知识
伴随着人类社会历程的不断向前推进,先进的科技就一直承载着人类社会的进步,特别是近年来日渐成熟的AI技术,深远地改变了我们熟悉的各个领域。我们公众号时刻紧跟当前社会发展潮流,考虑到,图像处理技术作为人工智能领域中计算机视觉(CV)的重要基础知识,同时可能也是粉丝朋友们感兴趣的地方,为此,小编决定新开一个专栏——opencv图像处理,期待能够帮助更多想要学习AI技术的小伙伴们,当然,这些知识对于大学三四年级的同学也非常有用哦,期待能够带给大家更多的快乐,我们,一直在前行。
用户5410712
2022/06/01
7140
【图像篇】opencv图像处理(一)---图像基础知识
推荐阅读
相关推荐
为什么图像处理如此困难
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验