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

本文分享自华为云社区《那些年,我们一起学过的Mybatis-Plus的常用注解》,作者:我是一棵卷心菜。

最近学习了mybatis-plus,现在带大家来回顾一下在学习的过程中,我们会经常使用哪些注解,这些注解具有哪些功能?如何使用这些注解?特别适合新手的学习以及老手的复习~

废话不多说,咱们速速开始吧!

mybatis-plus简介

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

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

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

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

常用注解(12个)

1、@MapperScan

@SpringBootApplication
@MapperScan("com.cabbage.mapper")
public class Mybatisplus01Application {
public static void main(String[] args) {
SpringApplication.run(Mybatisplus01Application.class, args);
}
}

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

2、@Mapper

@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

先看看如下代码:

@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配置文件中,配置如下:

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分页插件的时候,我们需要配置拦截器,看代码:

@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注解一起使用,相信大家也经常见到此注解,这里也不多讲了~

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

    @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

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

@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

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

@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

@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)。

点击关注,第一时间了解华为云新鲜技术~

适合新手的12个Mybatis-Plus常用注解的更多相关文章

  1. JavaSwing仿QQ登录界面,注释完善,适合新手学习

    使用说明: 这是一个java做的仿制QQ登录界面,界面仅使用一个类, JDK版本为jdk-11 素材包的名字为:素材(下载)请在项目中新建一个名字为“素材”的文件夹. 素材: https://pan. ...

  2. GitHub 上适合新手的开源项目(Python 篇)

    作者:HelloGitHub-卤蛋 随着 Python 语言的流行,越来越多的人加入到了 Python 的大家庭中.为什么这么多人学 Python ?我要喊出那句话了:"人生苦短,我用 Py ...

  3. 最适合和最不适合新手使用的几款 Linux 发行版

    大多数知名的Linux发行版都属于"比较容易使用"这一类.一些观察人士可能会驳斥这个观点,但事实上,说到Linux,大多数并非从事IT或软件开发工作的人会被最容易的使用体验所吸引. ...

  4. MyBatis jdbcType常用类型

    MyBatis jdbcType常用类型 jdbcType与javaType对应关系 javaType jdbctype CHAR String VARCHAR String LONGVARCHAR ...

  5. python环境搭建-requests的简单安装(适合新手)

    安装完python之后,一定要记住安装后的路径.这是我当前的路径. 下面是requests的安装步骤: 我们这里直接用pip安装(这样比较适合新手),新版python自带pip,python3.6.1 ...

  6. Mybatis 常用注解

    Mybatis常用注解对应的目标和标签如表所示: 注解 目标 对应的XML标签 @CacheNamespace 类 <cache> @CacheNamespaceRef 类 <cac ...

  7. 关于富文本编辑器ueditor(jsp版)上传文件到阿里云OSS的简单实例,适合新手

    关于富文本编辑器ueditor(jsp版)上传文件到阿里云OSS的简单实例,适合新手   本人菜鸟一枚,最近公司有需求要用到富文本编辑器,我选择的是百度的ueditor富文本编辑器,闲话不多说,进入正 ...

  8. 适合新手小白的UI学习路线完整版

    UI设计是很多年轻人活着想转行学习的人的新职业目标,越来越多的人看到UI设计良好的就业发展前景,纷纷投入到UI设计的大军中来,想学习UI设计,很多小白并不知道从何开始学起,用什么样的方法去学习,所以今 ...

  9. 适合新手的web开发环境

    学习web开发,环境搭建是必不可少的一个环节.你可以使用wamp一键安装包,或者使用sae.bae.gae这种PaaS平台来部署,或者安装*nix系统在本地部署. 对于一个希望体验LAMP式建站的新手 ...

  10. 2017.12.25 Mybatis物理分页插件PageHelper的使用(二)

    参考来自: 官方文档的说明:https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md 上篇博客 ...

随机推荐

  1. 大白话说Python+Flask入门(三)

    写在前面 今天状态很不好,我发现学这部分知识的时候,会出现溜号或者注意力无法集中的情况. 我能想到的是,大概率是这部分知识,应该是超出了我现在的水平了,也就是说我存在知识断层了,整体感觉真的是一知半解 ...

  2. Vue公共loading升级版(处理并发异步差时响应)

    公共loading是项目系统中很常见的场景,处理方式也不外乎三个步骤: 1.通过全局状态管理定义状态值(vuex.pinia等). 2.在程序主入口监听状态值变化,从而展示/隐藏laoding动画. ...

  3. CD74HC4067高速CMOS16通道模拟多路复用器实践

    咱们在玩arduino或stm32.esp8266时,有时会遇到板子模拟口不够用的情况,这个时候CD74HC4067就派上用场了,它可以将16路数字/模拟信号通过4数字+1模拟=5口来读取. 这货长这 ...

  4. mysql数据库数据同步几种通用方法?

    MySQL数据库数据同步的几种通用方法包括以下几个方面: 一.基于主从同步 主从同步是 MySQL 数据库最为常见和基本的同步方式,即其中一台 MySQL 服务器作为主服务器(Master),另外一台 ...

  5. C++ Qt开发:标准Dialog对话框组件

    Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍标准对话框QI ...

  6. (数据科学学习手札156)地图可视化神器kepler.gl 3.0版本发布

    本文已收录至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 大家好我是费老师,地图可视化神器kepler.gl终于带 ...

  7. 从零玩转QQ登录-clwzqqdlu

    title: 从零玩转QQ登录 date: 2021-05-01 15:55:39.951 updated: 2023-03-30 13:29:03.865 url: https://www.yby6 ...

  8. 2023-12-30:用go语言,给你一个下标从 0 开始的整数数组 nums ,它包含 n 个 互不相同 的正整数, 如果 nums 的一个排列满足以下条件,我们称它是一个特别的排列。 对于 0 <

    2023-12-30:用go语言,给你一个下标从 0 开始的整数数组 nums ,它包含 n 个 互不相同 的正整数, 如果 nums 的一个排列满足以下条件,我们称它是一个特别的排列. 对于 0 & ...

  9. 自定义md-loader来简单高效的维护组件文档

    个人觉得,组件库最难的不是开发,而是使用,怎么才能让组内同事都用起来,这才是关键 背景 虽然现在开源的组件库很多,但每个项目里还是或多或少都会有人封装出一些项目内通用的基础组件.业务组件 我参与过多个 ...

  10. 技本功|Hive优化之建表配置参数调优(一)

    简介: Hive是大数据领域常用的组件之一,主要用于大数据离线数仓的运算,关于Hive的性能调优在日常工作和面试中是经常涉及的一个点,因此掌握一些Hive调优是必不可少的一项技能.影响Hive效率的主 ...