MyBatisPlus从零到一:快速入门与核心功能详解(1)

米饭10个月前行业资讯851

一、快速入门

1.1 引入依赖:

MybatisPlus 提供了 starter,实现了自动 Mybatis 以及MybatisPlus 的自动装配功能,坐标如下:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.3.1</version>
</dependency>

这个 starter 包含对 mybatis 的自动装配,因此完全可以替换掉 Mybatis 的starter。


1.2 定义 Mappper:

为了简化单表的 CRUD,MybatisPlus 提供了一个基础的BaseMapper接口,其中已经实现了单表的 CRUD,具体方法如下图所示:

image-20241108140332697

因此我们自定义的 Mapper 只要继承了这个BaseMapper<T>,就无需自己实现单表 CRUD 了。

注意:继承 baseMapper 需要指定对应的实体类。


1.3 使用演示:

//Mapper:
public interface UserMapper extends BaseMapper<User> {
}
//实体类
@Data
public class User {
    private Long id;
    private String username;
    private String password;
    private String phone;
    private String info;
    private Integer status;
    private Integer balance;
    private LocalDateTime createTime;
    private LocalDateTime updateTime;
}

//测试类
@SpringBootTest
class UserMapperTest {

    @Autowired
    private UserMapper userMapper;

    @Test
    void testInsert() {
        User user = new User();
        user.setId(5L);
        user.setUsername("Lucy");
        user.setPassword("123");
        user.setPhone("18688990011");
        user.setBalance(200);
        user.setInfo("{\"age\": 24, \"intro\": \"英文老师\", \"gender\": \"female\"}");
        user.setCreateTime(LocalDateTime.now());
        user.setUpdateTime(LocalDateTime.now());
        userMapper.insert(user);// MybatisPlus 提供的
    }

    @Test
    void testSelectById() {
        User user = userMapper.selectById(5L);// MybatisPlus 提供的
        System.out.println("user = " + user);
    }


    @Test
    void testQueryByIds() {
        List<User> users = userMapper.selectBatchIds(List.of(1L, 2L, 3L, 4L));// MybatisPlus 提供的
        users.forEach(System.out::println);
    }

    @Test
    void testUpdateById() {
        User user = new User();
        user.setId(5L);
        user.setBalance(20000);
        userMapper.updateById(user);// MybatisPlus 提供的
    }

    @Test
    void testDeleteUser() {
        userMapper.deleteById(5L);// MybatisPlus 提供的
    }
}

效果如下图所示:由于方法格式过多,所以下面这张图片只展示更新部分的。

image-20241108162919294


1.4 常见注解:

MybatisPlus 就是根据 PO 实体(BaseMapper<T>中的T)的信息来推断出表的信息,从而生成 SQL 的。默认情况下:


MybatisPlus 会把 PO 实体的类名驼峰转下划线作为表名。

MybatisPlus 会把 PO 实体的所有变量名驼峰转下划线作为表的字段名,并根据变量类型推断字段类型。

MybatisPlus 会把名为 id 的字段作为主键。

但很多情况下,默认的实现与实际场景不符,因此 MybatisPlus 提供了一些注解便于我们声明表信息。


1.4.1 @TableName:

使用方式:表名注解,标识实体类对应的表。


使用位置:实体类。


使用场景:当实体类的名称和表名的命名不一致时(驼峰和下划线的区别另外),使用该注解。


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

172AFE4A-DE15-4A16-9965-25FD4A9AA797_4_5005_c.jpeg

1.4.2 @TableId:

使用方式:主键注解,标识实体类中的主键字段。

使用位置:实体类的主键字段。

使用场景:需要指定主键时,如果是按照规范进行操作,不需要使用该注解指定,有默认值。

TableId注解支持两个属性:

属性类型必须指定默认值
描述
value
String‘’
主键字段名
typeEnum

IdType.NONE指定主键类型

IdType支持的类型有:

描述
AUTO数据库 ID 自增
NONE无状态,该类型为未设置主键类型(注解里等于跟随全局,全局里约等于 ASSIGN_ID)
INPUTinsert 前自行 set 主键值
ASSIGN_ID

分配 ID(主键类型为 Number(Long 和 Integer)或 String)(since 3.3.0),

使用接口IdentifierGenerator的方法nextId(默认实现类为DefaultIdentifierGenerator雪花算法),

简单理解为程序自动利用雪花算法,帮助我们生成 id。


                           

ASSIGN_UUID分配 UUID,主键类型为 String(since 3.3.0),使用接口IdentifierGenerator的方法nextUUID(默认 default 方法)

这里比较常见的有三种:


AUTO:利用数据库的id自增长

INPUT:手动生成id

ASSIGN_ID:雪花算法生成Long类型的全局唯一id,这是默认的ID策略。

1.4.3 @TableField:

使用方式:普通字段注解,标识实体类中的普通属性。


使用位置:实体类的属性。


使用场景:当实体类的命名和数据库的字段名有出路时,使用该注解。


一般情况下我们并不需要给字段添加@TableField注解,一些特殊情况除外(非常重要):


成员变量名与数据库字段名不一致

成员变量是以isXXX命名,按照JavaBean的规范,MybatisPlus识别字段时会把is去除,这就导致与数据库不符。

成员变量名与数据库一致,但是与数据库的关键字冲突。使用@TableField注解给字段名添加转义字符:``。

支持的其它属性如下:

82659611-CC9D-4212-8EAA-AA4BC8ACF594.jpeg

1.5 常见配置:

MybatisPlus 也支持基于 yaml 文件的自定义配置。


大多数的配置都有默认值,因此我们都无需配置。但还有一些是没有默认值的,例如:


实体类的别名扫描包(用来简化,后续引用实体类的路径。这个即使配置,我还是建议大家把路径写全,因为这个有时会不生效,而且编译器会更加支持写全)。


全局 id 类型。

mybatis-plus:
  type-aliases-package: xxxxxx # 填写实体类对应的包名
  global-config:
    db-config:
      id-type: auto # 全局id类型为自增长

需要注意的是,MyBatisPlus 也支持手写 SQL 的,而 mapper 文件的读取地址可以自己配置:

mybatis-plus:
  mapper-locations: "classpath*:/mapper/**/*.xml" # Mapper.xml文件地址,当前这个是默认值。

本文系转载,版权归原作者所有,如若侵权请联系我们进行删除!  

云掣基于多年在运维领域的丰富时间经验,编写了《云运维服务白皮书》,欢迎大家互相交流学习:

《云运维服务白皮书》下载地址:https://fs80.cn/v2kbbq

想了解更多大数据运维托管服务、数据库运维托管服务、应用系统运维托管服务的的客户,欢迎点击云掣官网沟通咨询:https://yunche.pro/?t=shequ


相关文章

从传统运维到SRE的转型路线

从传统运维到SRE的转型路线

从传统运维向SRE(Site Reliability Engineering)转型需要技术技能、思维方式和工作模式的全面转变。以下是详细的转型路线图:一、理解SRE的核心理念SRE的定义SRE是Goo...

Docker:LXC容器操作实战

Docker:LXC容器操作实战

前言通过LXC来完成容器的创建、体会什么是容器。利用LXC容器技术来隔离特定的应用,提供虚拟执行环境,从而优化资源管理和部署效率。什么是LXC?LXC为Linux Container的简写,是一种可以...

Docker--Docker是什么和对Docker的了解

Docker--Docker是什么和对Docker的了解

Docker 的本质Docker的本质是LXC(Linux容器)之类的增强版,它本身不是容器,而是容器的易用工具。Docker通过虚拟化技术,将代码、依赖项和运行环境打包成一个容器,并利用隔离机制来使...

BetaFlight模块设计之三十二:MSP协议模块分析

BetaFlight模块设计之三十二:MSP协议模块分析

基于BetaFlight开源代码框架简介的框架设计,逐步分析内部模块功能设计。1. MSP协议模块1.1 MSP描述MSP是Multiwii Serial Protocol的缩写,截止目前为止有两个版...

Spring AOP 实战指南:从入门到精通(1)

Spring AOP 实战指南:从入门到精通(1)

Spring 框架有两大核心 IoC,AOP。在前面我们已经学习过了 IoC 的相关知识,今天就让我们开始 AOP 的学习。一、AOP 概述Aspect Oriented Programming(面向...

Docker: ubuntu系统下Docker的安装

Docker: ubuntu系统下Docker的安装

安装依赖操作系统版本Ubuntu Kinetic 22.10Ubuntu Jammy 24.04 (LTS)Ubuntu Jammy 22.04 (LTS)Ubuntu Focal 20.04 (LT...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。