首页 > 其他分享 >[MyBatis-Plus]快速入门

[MyBatis-Plus]快速入门

时间:2024-10-11 09:21:24浏览次数:10  
标签:实体类 MyBatisPlus 入门 Plus user MyBatis id User

介绍

MyBatis-Plus是MyBatis的好朋友, 与MyBatis配合, 实现开发效率的提高

官网:

特点:

  1. 润物细无声: 只做增强不做改变, 引入它不会对现有工程产生影响, 如丝般顺滑
  2. 效率自上: 只需简单配置, 即可快速进行单表CRUD, 从而节省大量时间
  3. 功能丰富: 代码生产, 自动分页, 逻辑删除, 自动填充等功能一应俱全

单表CRUD

需求: 基于资料中的项目, 实现以下功能

  1. 新增用户
  2. 根据id查询用户
  3. 根据id更新用户
  4. 根据id批量查询用户
  5. 根据id删除用户

准备工作

  1. 打开工程: mp-demo
  2. 修改配置: 修改数据库的连接信息
  3. 建库建表: 执行资料中的sql

使用MP的步骤

  1. 引入依赖
   <dependency>
      <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.3.1</version>
    </dependency>
  • MyBatisPlus官方提供了starter, 其中集成了MyBatis和MyBatisPlus的所有功能, 并且实现了自动装配效果
  • 因此, 我们可以用MyBatisPlus的starter代替Mybatis的的starter

  1. 继承接口
public interface UserMapper extends BaseMapper<User> {
}
  • 自定义的Mapper继承MyBatisPlus提供的BaseMapper接口
  • 自定义的Mapper中看似什么代码都没有, 但是已经继承了强大的CRUD方法
  • 注意要把数据表对应的实体类作为泛型传递给BaseMapper接口, 这样MP才知道CRUD要操作哪个实体

  1. 直接调用继承的增删改查的方法

@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);
    }

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


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

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

    @Test
    void testDeleteUser() {
        userMapper.deleteById(5L);
    }

}

原理

MyBatis-Plus是通过扫描实体类, 并基于反射获取实体类信息作为数据库表信息, 生成CRUD方法

符合以下约定, MyBatisPlus就可以正确的获取到数据库表的信息, 然后进行增删改查操作

  1. 类名驼峰转下划线作为表名, 例如 类名 tbUser -> 表名 tb_user
  2. 名为id的字段作为主键, 如果没有id字段运行会报错
  3. 变量名驼峰转下划线作为表的字段名

常用注解

大多数情况下, 数据表的设计和实体类是符合MyBatisPlus开发约定的, 特殊情况下需要通过注解解决特定问题

指定表名: 数据表与实体类的名称不一致时, 通过@TableName注解, 指定表名

@Data
@TableName(value = "tb_user")
public class User {
  ... ...
}

指定主键: 数据表中主键名不是id时, MP运行就会报错, 需要通过@TableId注解, 指定表中的主键字段

@Data
public class User {
    /**
     * 用户id
     */
    @TableId(value="id", type=IdType.AUTO)
    private Long idNumber;

}
  1. 参数说明:
  • value用来指定主键字段名
  • type用来指定主键类型
  1. IdType枚举:
  • AUTO: 数据库自增长
  • INPUT: 通过set方法自行输入
  • ASSIGN_ID: 分配基于雪花算法的ID (默认)
  1. 如果数据表中指定id是自增长, 那么使用MP时, 一定要给id字段设置类型为AUTO, 因为默认是雪花算法

指定字段: 当实体类的变量名存在特殊情况时, 使用@TableField注解, 处理表中的字段

@Data
public class User {
    //用户名
    //1.成员变量名与数据库字段名不一致
    @TableField("username")
    private String name;

    //状态(1正常 2冻结)
    //2.成员变量名以 is 开头, 且是布尔值
    //如果变量以is开头且是布尔值, MP编译时会去掉is, 造成变量名与字段名不一致,所以需要手动处理
    @TableField("is_status")
    private Boolean isStatus;
  
    //排序
    //3.成员变量名与数据库关键字冲突
    @TableField("`order`")
    private Integer order;

    //地址
    //4.成员变量名不是数据库字段
    @TableField(exist=false)
    private String address;
}

常用配置

MyBatisPlus的配置项继承了MyBatis原生配置和一些自己的配置, 更多的配置可以去官网查看

  1. 官网: 实体类,MyBatisPlus,入门,Plus,user,MyBatis,id,User
    From: https://blog.csdn.net/CSDN20221005/article/details/142845023

相关文章

  • 模拟一个微服务架构项目来学习包括Nacos、EMQX、GateWay、RabbitMQ、Canal、Mybatis-P
    前言介绍下最近做的项目:为什么做这个项目?项目的核心用户目标是谁?面向新能源电车用户给目标用户提供了什么价值?方便快捷充电服务团队的作用?需求分析,概要设计,详细设计,开发,测试,部署,上线我的作用?1-2两个核心业务详细设计(业务流程,接口入参,接口出参,表结......
  • 前端大模型入门:Langchain的不同文本分割器对比和效果展示-教你根据场景选出最合适的方
    在前端开发大模型应用的时候,处理和分割文本是常见需求,毕竟现在的大模型输入输出都有限-嵌入等也是有token限制的,合理的文本分割能显著提高模型的表现。Langchain提供了多种文本分割方式,本文将对比五种文本分割器:CharacterTextSplitter、RecursiveCharacterTextSplitter、Tok......
  • Linux !ko/5.17-BBRplus AMD64(X86_64)内核致命的 futex_wait 函数死锁问题。
    !ko表示系统内核(system-kernel)致命:在CentOS(RedHat)、Ubuntu、Debian等多个发行版本Linux操作系统上,若人们升级 5.17-BBRplus版本内核,那么在应用程式频繁的futex_wait(syscall)等待唤醒时,或会存在futex_wait函数发生死锁的疑难问题。LMP:futex(2)-Linuxmanualpa......
  • tensorflow快速入门--如何定义张量、定义网络结构、超参数设置、模型训练???
    前言由于最近学习的东西涉及到tensorflow的使用,故先简单的学习了一下tensorflow中如何定义张量、定义网络结构、超参数设置、模型训练的API调用过程;欢迎大家,收藏+关注,本人将持续更新。文章目录1、基本操作1、张量基础操作创建0维度张量创建1维张量创建多维张量2、转换......
  • Python 从入门到实战35(进程-multiprocessing模块)
            我们的目标是:通过这一套资料学习下来,可以熟练掌握python基础,然后结合经典实例、实践相结合,使我们完全掌握python,并做到独立完成项目开发的能力。        上篇文章我们讨论了turtle库绘制图画操作的相关知识。今天学习一下进程的概念和创建方法。1、......
  • Python 从入门到实战36(进程-Process、Pool类)
            我们的目标是:通过这一套资料学习下来,可以熟练掌握python基础,然后结合经典实例、实践相结合,使我们完全掌握python,并做到独立完成项目开发的能力。        上篇文章我们讨论了通过multiprocessing模块创建进程操作的相关知识。今天学习一下Process、Po......
  • C++入门——类和对象(下)
    文章目录一、再探构造函数二、类型转换三、static成员四、友元五、内部类六、匿名对象总结一、再探构造函数不了解构造函数的小伙伴可以先看这篇文章构造函数1.之前我们实现构造函数时,初始化成员变量主要使⽤函数体内赋值,构造函数初始化还有⼀种⽅式,就是初始化列......
  • Boost C++ 库 | 智能指针(共享指针、共享数组、弱指针、介入式指针、指针容器)入门
    点击上方"蓝字"关注我们01、共享指针>>>这是使用率最高的智能指针,但是C++标准的第一版中缺少这种指针。它已经作为技术报告1(TR1)的一部分被添加到标准里了。如果开发环境支持的话,可以使用 memory 中定义的 std::shared_ptr。在BoostC++库里,这个智能指针命名为......
  • Java入门
    下载和卸载Java8*一,卸载1.在此电脑打开属性2.高级设置找的系统变量找的Javahome我们可以看到Javahome的地址方便我们后面卸载Java3.在找的path里面的关于Java删除4.现在Java就删除干净了二下载我们现在知道自己电脑的属性就可以下载了(下载sh'......
  • 轻松入门:Maven核心功能详解
    Whitegraces:个人主页......