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

米饭7个月前行业资讯406

一、快速入门

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


相关文章

Docker——Windows版本Docker安装

Docker——Windows版本Docker安装

一、简介一、简介  1.1 Docker如何解决大型项目依赖关系复杂,不同组件依赖的兼容性问题?Docker允许开发中将应用、依赖、函数库、配置一起打包,形成可移植镜像Docker应用运行在...

微服务保护和分布式事务(5)

微服务保护和分布式事务(5)

2.3 XA 模式:Seata 支持四种不同的分布式事务解决方案:XATCCATSAGA这里我们以XA模式和AT模式来给大家讲解其实现原理。XA 规范是 X/Open 组织定义的分布式事务处理(DTP...

【Linux】进程状态

【Linux】进程状态

一、进程三状态转换·新建态:操作系统已经分配了资源给进程了。·就绪态:已经具备了执行的所有必有的条件,但是由于各种原因,暂时无法运行,进程进入就绪状态。·运行状态:当进程处于调度队列当中的时候就处于运...

Spring AMQP与RabbitMQ深度整合指南:从基础到高级应用(3)

Spring AMQP与RabbitMQ深度整合指南:从基础到高级应用(3)

3.5 声明交换机和队列:在之前我们都是基于RabbitMQ控制台来创建队列、交换机。但是在实际开发时,队列和交换机是程序员定义的,将来项目上线,又要交给运维去创建。那么程序员就需要把程序中运行的所有...

RabbitMQ 进阶1(发送者和MQ的可靠性)

RabbitMQ 进阶1(发送者和MQ的可靠性)

我们可以通过 MQ 异步调用,来使程序的性能更好和解耦合。但是如果 MQ 的消息没有成功的被对应的程序处理,那么这样不就会造成数据不一致的情况。因此,我们这里必须要尽可能的确保 MQ 消息的可靠性,即...

Linux 配置Tomcat环境(二)

Linux 配置Tomcat环境(二)

二、配置Tomcat1、创建一个Tomcat文件夹用于存放Tomcat压缩包输入指令 cd /usr/local 进入到 usr/local输入指令 ls 查看...

发表评论    

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