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

米饭5个月前行业资讯240

一、快速入门

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:namespace隔离实战

Docker:namespace隔离实战

namespacenamespace通过一种内核技术来实现,允许将不同的系统资源隔离和封装到独立的命名空间中。为容器化、虚拟化和隔离提供强大的基础。通过使用namespace技术,Linux内核可以创...

深度学习之经典网络-AlexNet详解

深度学习之经典网络-AlexNet详解

 AlexNet 是一种经典的卷积神经网络(CNN)架构,在 2012 年的 ImageNet 大规模视觉识别挑战赛(ILSVRC)中表现优异,将 CNN 引入深度学习的新时代。AlexNe...

Docker-- cgroups资源控制实战

Docker-- cgroups资源控制实战

什么是cgroups?cgroups是Linux内核中的一项功能,最初由Google的工程师提出,后来被整合进Linux内核;它允许用户将一系列系统任务及其子任务整合或分隔到按资源划分等级的不同组内,...

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

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

1.2 Sentinel:微服务保护的技术有很多,但在目前国内使用较多的还是 Sentinel,所以接下来我们学习 Sentinel 的使用。1.2.1 介绍和安装:Sentinel 是阿里巴巴开源的...

Docker:技术架构的演进之路(下)

Docker:技术架构的演进之路(下)

冷热分离架构六、冷热分离架构为了进一步提高系统的并发性能,系统进入冷热分离架构阶段。在这个阶段,引入缓存,实现冷热分离。将热点数据放入缓存中,冷数据放入数据库中,实现数据库的快速响应。这种架构的优点是...

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

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

一、初识 MQ1.1 同步调用:我们观察下,下面这个余额支付功能的流程图:如果我们采用的是基于 OpenFeign 的同步调用,也就是说业务执行流程是这样的:支付服务需要先调用用户服务完成余额扣减。然...

发表评论    

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