Springboot3 Mybatis-plus 3.5.9

1. Mybatis-plus

官网:链接

1. 依赖

<dependency>
  <groupId>com.baomidou</groupId>
  <artifactId>mybatis-plus-spring-boot3-starter</artifactId>
  <version>3.5.9</version>
</dependency>

2. 注解配置表名、字段名

一般情况下,数据库映射为实体类对应关系

  1. 数据库表与实体类类名:下划线转为驼峰
  2. 实体类中的id字段对应数据库中的主键字段id
  3. 表中列名与实体类属性名:下划线转驼峰

如不满足以上条件,需在实体类中使用注解

  1. 表名注解:@TableName:用来指定表名
  2. 指定主键:@TableId 指定表中的主键
  3. 实体类属性注解:@TableField 指定表中的字段信息
// 指定该实体类对应的表名是t_vip
@TableName("`t_vip`")
public class Vip {
    // 指定该属性为主键,且在数据表中的列名为id,且自增
    @TableId(value = "id", type = IdType.AUTO)
    private Long vid;
    // 指定该属性对应表中的username列
    @TableField(value = "username")
    private String name;
    // 数据表中不存在该属性对应的列
    @TableField(exist = false)
    private String birthday;
}

@TableId:常见类型

  • 主键最好指定类型,默认是type = IdType.ASSIGN_ID
    @TableId(type = IdType.AUTO)  // 主键自增,数据库自动生成
    @TableId(type = IdType.INPUT) // 通过set方法自行输入,例如uuid作为主键,需要手动赋值
    @TableId( type = IdType.ASSIGN_ID)  // 通过接口生成主键,由mybatis-plus自动生成

@TableField:常见场景

  1. 实体类属性与数据库表中字段不一致,
  	// 属性是name,表中是username
    @TableField("username")
    private String name;
  1. 表中以is开头并且是boolean值
// 表中字段名:is_ban,映射的属性名为ban
   @TableField("is_ban")
    private Boolean name;
  1. 属性名与数据库的关键字一致
// order在数据库中是关键字,注意使用了 ``
   @TableField("`order`")
    private String order;
  1. 属性并不属于数据库表中的字段
    // 数据表中不存在该属性对应的列
    @TableField(exist = false)
    private String birthday;

3. yml中的配置

官方:链接

  • 很多默认配置已经足够了
mybatis-plus:
  type-aliases-package: org.example.learn.domain  # 实体类包
  global-config:
    db-config:
      id-type: auto # id生成策略:自增长
      logic-delete-field: deleted # 表中的逻辑删除字段名
      logic-delete-value: 1 # 逻辑已删除值(默认为 1)
      logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
    banner: false # 是否在控制台打印 MyBatis-Plus 的 LOGO
  configuration:
    default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler  # 枚举类型处理器

4. mapper和service的用法

  1. mapper:继承BaseMapper接口
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.example.learn.bean.User;	// 实体类

@Mapper
public interface UserMapper extends BaseMapper<User> {
}
  1. service:继承IService接口
import com.baomidou.mybatisplus.extension.service.IService;
import org.example.learn.bean.User;	// 实体类

public interface UserService extends IService<User> {
}
  1. service的实现类seviceImpl:继承ServiceImpl

ServiceImpl:两个泛型

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.example.learn.bean.User;
import org.example.learn.dao.UserMapper;
import org.example.learn.service.UserService;

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper,User> implements UserService {
}

2. 使用工具生成mapper和service

在这里插入图片描述

在这里插入图片描述

3. 逻辑删除

  • 在实际应用中很多数据是不能删除的,比如:订单信息,mybatis-plus提供了逻辑删除
  • 逻辑删除:使用数据表中的某一个列,通过列的值表示该数据是否被删除

1. 需要在yml中配置

mybatis-plus:
  global-config:
    db-config:
      logic-delete-field: deleted # 表中的逻辑删除字段名
      logic-delete-value: 1 # 逻辑已删除值(默认为 1)
      logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)

2. 代码

代码还是使用正常的删除和查询操作,mybaits-plus在删除时实际使用的是updata操作,查询时总是会把标志位作为条件带入

  1. 使用remove方法删除时,mybatis-plus使用了updata方法更新了逻辑删除的列
    addressService.removeById(59L);
    /*
    * ==>  Preparing: UPDATE address SET deleted=1 WHERE id=? AND deleted=0
    *  ==> Parameters: 59(Long)
    *  <==    Updates: 0
    * */
  1. 查询时也会自动添加逻辑删除标志位为未删除的条件
    Address address = addressService.getById(59L);
    /*
    * ==>  Preparing: SELECT id,user_id,province,city,town,mobile,street,contact,is_default,notes,deleted FROM address WHERE id=? AND deleted=0
    * ==> Parameters: 59(Long)
    * <==      Total: 0
    * */

4. json类型

在数据表中类型格式为json,在查询、新增、更新等操作时,此数据转为对象形式

在这里插入图片描述

1. 定义json类型字段内容对应的类

{"age": 20, "intro": "佛系青年", "gender": "male"}

@Data
public class UserInfo {
  private Integer age;
  private String intro;
  private String gender;

}

2. 在数据表对应的类属性和类上加注解

  • 类上注解:@TableName(autoResultMap = true)
  • 属性注解:@TableField(typeHandler = JacksonTypeHandler.class)
@Data
//@Accessors(chain = true)
@TableName(autoResultMap = true)
public class User implements Serializable {
    /**
     * 详细信息
     */
    @TableField(typeHandler = JacksonTypeHandler.class)
    private UserInfo info;
}

3. 在查询后返回的结果就是对象形式

在这里插入图片描述

5. 自动映射枚举

经常使用数字或布尔值代表一种状态,每次查询或新增时都需要对照状态表来解释状态码。
例如:

  //  private Boolean gender; // 男/女
    private Integer status;	// 使用状态(1正常 2冻结)

1. 配置yml

mybatis-plus:
  configuration:
    default-enum-type-handler: com.baomidou.mybatisplus.core.handlers.MybatisEnumTypeHandler

2. 创建枚举类

@Getter
public enum UserStatus {
    NORMAL(1, "正常"),
    FREEZE(2, "冻结");

    @EnumValue // 在数据库存/取的值是code的属性值
    private final Integer code;
    @JsonValue  // 在序列化时返回的JSON中显示的属性值
    private final String desc;

    UserStatus(Integer code, String desc) {
        this.code = code;
        this.desc = desc;
    }

}

3. 修改数据表对应的实体类中该属性的类型

    /**
     * 使用状态(1正常 2冻结)
     */
    private UserStatus status;

4. 使用

    // 1. 查询id是否存在
    User user = this.getById(id);
    if (user == null || user.getStatus() == UserStatus.FREEZE) {
      throw new RuntimeException("用户不存在或已经被禁用");
    }

pom中所有的依赖

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>com.mysql</groupId>
            <artifactId>mysql-connector-j</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.3.1</version>
        </dependency>
        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.8.11</version>
        </dependency>
        <!--swagger-->
        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>knife4j-openapi2-spring-boot-starter</artifactId>
            <version>4.1.0</version>
        </dependency>
        <!--web-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

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

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

相关文章

android——录制屏幕

录制屏幕 1、界面 2、核心代码 import android.app.NotificationChannel import android.app.NotificationManager import android.app.PendingIntent import android.app.Service import android.content.Context import android.content.Intent import android.graphics.Bi…

js面试题|[2024-12-10]

1.延迟加载JS有哪些方式&#xff1f; 延迟加载&#xff1a;async、defer 例如&#xff1a;<script defer type"text/javascript" srcscript.js></script> defer&#xff1a;等html全部解析完毕&#xff0c;才会执行js代码&#xff0c;顺次执行js脚本 asy…

【数据结构——查找】顺序查找(头歌实践教学平台习题)【合集】

目录&#x1f60b; 任务描述 相关知识 测试说明 我的通关代码: 测试结果&#xff1a; 任务描述 本关任务&#xff1a;实现顺序查找的算法。 相关知识 为了完成本关任务&#xff0c;你需要掌握&#xff1a;1.根据输入数据建立顺序表&#xff0c;2.顺序表的输出&#xff0c;…

基于微信小程序+Springboot+Vue社区超市管理系统的分析与设计(源码+lw+讲解部署等)

&#x1f497; 博主介绍✌ 3Dex&#xff08;全栈开发工程师&#xff09;&#xff0c;专注于4smile等项目的建设与优化&#xff0c;在软件开发与技术实现方面积累了丰富的经验。专注于Java、小程序、前端、Python等技术领域毕业项目实战&#xff0c;以及程序定制化开发。✌ 擅长…

自然语言处理:从入门到精通全指引

一、引言 自然语言处理&#xff08;NLP&#xff09;作为人工智能领域的关键分支&#xff0c;旨在让计算机理解、生成和处理人类语言&#xff0c;近年来取得了令人瞩目的成就&#xff0c;在智能客服、机器翻译、文本分析、语音助手等众多领域发挥着重要作用。从入门到精通自然语…

[leetcode100] 101. 对称二叉树

https://leetcode.cn/problems/symmetric-tree/description/?envTypestudy-plan-v2&envIdtop-100-liked 心血来潮&#xff0c;突然感觉很久没做leetcode&#xff0c;刷一题。 看到“简单”&#xff0c;哦吼&#xff0c;应该很快吧。 结果真是《简单》 题目描述 给你一个…

GPIO在ZYNQ7000中的结构和相关寄存器解析

GPIO MASK DATA LSW和 MASK DATA MSW LSW和MSW分别是LSW (Least Significant Word)和MSW (Most Significant Word)。 因为DATA是u32,所以如果寄存器的基址是XGPIOPS_DATA_LSW_OFFSET&#xff0c;那么32位就能同时让高16位的MASK DATA MSW]31:16和 MASK DATA LSW的bit7同时为…

设计模式-装饰器模式(结构型)与责任链模式(行为型)对比,以及链式设计

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言1.装饰器模式1.1概念1.2作用1.3应用场景1.4特点1.5类与对象关系1.6实现 2责任链模式2.1概念2.2作用2.3应用场景2.4特点2.5类与对象关系2.6实现 3.对比总结 前言…

TesseractOCR-GUI:基于WPF/C#构建TesseractOCR简单易用的用户界面

前言 前篇文章使用Tesseract进行图片文字识别介绍了如何安装TesseractOCR与TesseractOCR的命令行使用。但在日常使用过程中&#xff0c;命令行使用还是不太方便的&#xff0c;因此今天介绍一下如何使用WPF/C#构建TesseractOCR简单易用的用户界面。 普通用户使用 参照上一篇教…

解决 IntelliJ IDEA 启动错误:插件冲突处理

引言 在使用 IntelliJ IDEA 进行开发时&#xff0c;我们可能会遇到各种启动错误。本文将详细介绍一种常见的错误&#xff1a;插件冲突&#xff0c;并提供解决方案。 错误背景 最近&#xff0c;有用户在启动 IntelliJ IDEA 时遇到了一个错误&#xff0c;提示信息为&#xff1a…

多线程的知识总结(8):用 thread 类 或全局 async (...) 函数,创建新线程时,谁才是在新线程里第一个被执行的函数

&#xff08;40&#xff09;用 thread 类 或全局 async (…) 函数&#xff0c;创建新线程时&#xff0c;谁才是在新线程里第一个被执行的函数&#xff1f; 弄清楚这个问题&#xff0c;有利于推测和理解线程中代码的执行流程。根据 thread 类 和 async &#xff08;…&#xff0…

ChatGPT 4:解锁AI文案、绘画与视频创作新纪元

文章目录 AI文案&#xff1a;激发文字的魅力&#xff0c;重塑营销与传播AI绘画&#xff1a;解锁艺术的无限可能&#xff0c;激发创意灵感AI视频&#xff1a;重塑视频创作流程&#xff0c;提升制作效率GPTs&#xff1a;构建个性化AI应用&#xff0c;赋能各行各业《ChatGPT 4 应用…

【pyspark学习从入门到精通23】机器学习库_6

目录 分割连续变量 标准化连续变量 分类 分割连续变量 我们经常处理高度非线性的连续特征&#xff0c;而且只用一个系数很难拟合到我们的模型中。 在这种情况下&#xff0c;可能很难只通过一个系数来解释这样一个特征与目标之间的关系。有时&#xff0c;将值划分到离散的桶中…

linux 进程间通信:匿名管道pipe()

进程间内存独立且相互不可见&#xff0c;进程间通信需要特殊方法 匿名管道pipe() /* Create a one-way communication channel (pipe). If successful, two file descriptors are stored in PIPEDES; bytes written on PIPEDES[1] can be read from PIPEDES[0]. Retu…

哈默纳科Harmonic谐波减速机机器人精准高效动力传递的核心力量

在当今科技飞速发展的时代&#xff0c;机器人技术正以惊人的速度改变着我们的生产与生活方式。而在机器人的精密机械结构中&#xff0c;哈默纳科 Harmonic 谐波减速机扮演着不可或缺的角色&#xff0c;成为机器人精准高效动力传递的关键所在。 1.高精度与灵活性&#xff1a;哈默…

Codigger SIDE之Helix编辑器

在Codigger的多维世界中&#xff0c;Helix编辑器以其卓越的性能和灵活性&#xff0c;成为开发者手中的利剑。基于Rust构建&#xff0c;Helix不仅继承了Vim编辑器的经典特性&#xff0c;更以其现代化的功能&#xff0c;重新定义了代码编辑的边界。 模式切换的艺术 Helix的模式切…

Scala的正则表达式二

验证用户名是否合法 规则 1.长度在6-12之间 2.不能数字开头 3.只能包含数字&#xff0c;大小写字母&#xff0c;下划线def main(args: Array[String]): Unit {val name1 "1admin"//不合法&#xff0c;是数字开头val name2 "admin123"//合法val name3 &quo…

C++ 运算符重载 (备查)

基础 运算符重载&#xff0c;就是对已有的运算符重新进行定义&#xff0c;赋予其另一种功能&#xff0c;以适应不同的数据类型。 运算符重载也可以发生函数重载。 语法&#xff1a; void operator(); //代表了被重载的运算符。函数的参数个数取决于两个因素。1)运算符是一元(一…

zerotier实现内网穿透(访问内网服务器)

moo 内网穿透工具 实用工具&#xff1a;zerotier 目录 内网穿透工具 Windows下zerotier安装 ubuntu系统下的zerotier安装 使用moon加速 Windows下zerotier安装 有了网络之后&#xff0c;会给你一个网络id&#xff0c;这个网络id是非常重要的&#xff0c;其它设备要加入…

【C++】刷题强训(day14)--乒乓球匡、组队竞赛、删除相邻数字的最大分数

目录 1、乒乓球匡 1.1题目 1.2 思路 1.3 代码实现 2、组队竞赛 2.1 题目 2.2 思路 2.3 代码实现 3、删除相邻数字的最大分数 3.2 思路 3.3 代码实现 刷题汇总&#xff1a;传送门&#xff01; 1、乒乓球匡 1.1题目 1.2 思路 这道题注意一下示例&#xff0c;<br…