前言:

采用的是黑马的mybatisPlus教程!
mybatis教程!
使用的springboot3和JDK17完成的!和黑马的有点区别!

知识点:

1.Hutool 是一个由 Java 编写的强大、完善且易用的 Java 工具类库,它封装了很多常用的 Java 方法,包括但不限于日期时间处理、字符串处理、文件操作、网络请求、加密解密、数据验证、反射工具等。通过引入 hutool-all 依赖,开发者可以方便地在项目中使用 Hutool 提供的各种便捷工具方法,以减少重复造轮子的工作,提高开发效率
2.@RequiredArgsConstructor 是 Lombok 库中的一个注解,它能够自动生成构造方法。当类中包含 final 或者非 null 的不可变字段时,Lombok 会为这些字段生成一个构造器,确保在创建对象实例时必须为这些字段提供值。
3.接口中可以有default修饰的方法!default修饰的方法为默认方法可以不用重写!

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService
{
@Override
public void deductBalance(Long id, Integer money) {
// 1.查询用户
User user = super.getById(id);
// 2.判断用户状态
if (user == null || user.getStatus() == UserStatus.FROZEN) {
throw new RuntimeException("用户状态异常");
}
// 3.判断用户余额
if (user.getBalance() < money) {
throw new RuntimeException("用户余额不足");
}
// 4.扣减余额
baseMapper.deductMoneyById(id, money);
}
}
// 上面是mybatisPlus中的代码片段;其中的IUserService接口继承了IService接口,IService中
// 有一个default修饰的getById方法,我们可以super.getById(id);调用该方法实现查询效果!
1
2
3
4
5
6
7
8
9
10
11
12
import lombok.RequiredArgsConstructor;

public class User {
private final String username; // final 字段或 @NonNull 注解的字段
private final int age;

// Lombok 会自动生成以下构造方法:
// public User(String username, int age) {
// this.username = username;
// this.age = age;
// }
}

在这个例子中,由于 username 和 age 都是 final 字段,@RequiredArgsConstructor 会生成一个构造方法,要求在创建 User 类的新实例时必须传入这两个参数的值。这样可以确保这些关键字段在对象初始化时就具有有效的值,有助于防止 NullPointerException 等问题的发生。
3.@RequestParam 和@PathVariable的区别:
@RequestParam从请求中提取查询参数,也就是从url后面的?开始的数据:

1
2
3
4
5
@GetMapping
@Operation(summary = "根据id集合查询用户")
public List<UserVO> queryUserByIds(@RequestParam("ids"z List<Long> ids)
// @RequestParam("ids")注解处理的是请求路径后面的参数:
// http://localhost:8080/users?ids=1,2

@PathVariable是以路径中某段为参数:

1
2
3
4
@GetMapping("/{id}")
@Operation(summary = "根据id查询用户")
public UserVO queryUserById(@PathVariable("id") Long userId)
// http://localhost:8080/users/1

4.主键,外键,虚拟外键:
https://www.cnblogs.com/dgp-zjz/p/16470132.html

1
2
3
4
5
主键:用来保证数据完整性

外键:用来和其他表建立联系用的

索引:是提高查询排序的速度
1
2
3
主键:主键只能有一个
外键:一个表可以有多个外键
索引:一个表可以有多个唯一索引
1
2
3
PRIMARY KEY设置主键 ('设置的主键字段'),
KEY `自定义KEY名` (`定义外键字段名`),
CONSTRAINT限制 `自定义KEY名` FOREIGN KEY外键 (`自定外键字段名`) REFERENCES 引用 `引用表` (`引用字段设为外键`));

外键和主键建立了关系,那么外键所在的表中数据和主键表有关联关系就无法删除外键中的数据的!
虚拟外键表示的是表之间有逻辑上的关联关系!其实际上并没有实际的强制性约束!
5.mybatis-plus 开启与关闭 SQL 日志打印
mybatis-plus 开启与关闭 SQL 日志打印_mybatis plus 开启sql记录-CSDN博客
Mybatis-plus 需要通过下面的方式开启控制台 SQL 日志打印:

1
2
3
4
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

6.DTO(Data Transfer Object)是数据传输对象!一般用来映射传输过程中的数据的!
7.@Date :

1
2
3
4
5
6
使用@Data注解可以简化Java类的编写,减少样板代码,并提高代码的可读性和可维护性。当在类级别上使用@Data注解时,Lombok会自动为该类的所有非静态字段生成以下方法:
Getter方法:自动生成所有非静态字段的对应getter方法。
Setter方法:自动生成所有非静态字段的对应setter方法。
toString()方法:生成一个包含所有字段的字符串表示,方便调试和日志输出。
equals()方法:自动生成基于所有字段的相等比较方法。
hashCode()方法:自动生成基于所有字段的散列码计算方法。

MyBatis Plus的特性:

  • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
  • 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
  • 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
  • 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
  • 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
  • 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
  • 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
  • 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
  • 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
  • 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
  • 内置性能分析插件:可输出 SQL 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
  • 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作.

快速入门:

引入依赖:

1
2
3
4
5
6
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-spring-boot3-starter</artifactId>
<version>3.5.5</version>
</dependency>
<!--由于springboot3和mybatisplus兼容性的问题这里引入的依赖最好是这样的! -->

注意:

mapper接口要继承BaseMapper 这里的User对应查询结果的类型!同时要注意在启动类上添加组件@Mapper注解 不然spring扫描不到Mapper接口类就无法注入到容器中了!当然也可以在Mapper接口上添加@Mapper 注解 ;

1
2
3
4
MybatisPlus就是根据PO实体的信息来推断出表的信息,从而生成SQL的。默认情况下:
- MybatisPlus会把PO实体的类名驼峰转下划线作为表名
- MybatisPlus会把PO实体的所有变量名驼峰转下划线作为表的字段名,并根据变量类型推断字段类型
- MybatisPlus会把名为id的字段作为主键

常见注解:

@TableName:
  • 描述:表名注解,标识实体类对应的表
  • 使用位置:实体类

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

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

@TableId:
  • 描述:主键注解,标识实体类中的主键字段
  • 使用位置:实体类的主键字段

TableId注解支持两个属性:

属性 类型 必须指定 默认值 描述
value String “” 表名
type Enum IdType.NONE 指定主键类型

IdType支持的类型有:

描述
AUTO 数据库 ID 自增
NONE 无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 INPUT)
INPUT insert 前自行 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)
UUID 32 位 UUID 字符串(please use ASSIGN_UUID)
ID_WORKER_STR 分布式全局唯一 ID 字符串类型(please use ASSIGN_ID)

这里比较常见的有三种:

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

描述:普通字段注解
一般情况下我们并不需要给字段添加@TableField注解,一些特殊情况除外:

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

支持的其它属性如下:
支持的其它属性如下:

属性 类型 必填 默认值 描述
value String “” 数据库字段名
exist boolean true 是否为数据库表字段
condition String “” 字段 where 实体查询比较条件,有值设置则按设置的值为准,没有则为默认全局的 %s=#