MyBatisPlus 用法详解

时间:2024-11-12 17:50:33

MyBatisPlus 用法详解

MyBatis-Plus(简称MP)是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,为简化开发、提高效率而生。它提供了丰富的功能,包括强大的CRUD操作、条件构造器、自动填充、分页插件等,极大地简化了开发工作。以下是对MyBatis-Plus的详细用法介绍。

一、MyBatis-Plus简介

MyBatis-Plus的官网地址为:https://mybatis.plus/https://mp.baomidou.com/

MyBatis-Plus的主要特性包括:

  1. 无侵入:只做增强不做改变,引入它不会对现有工程产生影响。
  2. 损耗小:启动即会自动注入基本CRUD,性能基本无损耗,直接面向对象操作。
  3. 强大的CRUD操作:内置通用Mapper、通用Service,仅仅通过少量配置即可实现单表大部分CRUD操作,更有强大的条件构造器,满足各类使用需求。
  4. 支持Lambda形式调用:通过Lambda表达式,方便地编写各类查询条件,无需再担心字段写错。
  5. 支持主键自动生成:支持多达4种主键策略(内含分布式唯一ID生成器-Sequence),可*配置,完美解决主键问题。
  6. 支持ActiveRecord模式:支持ActiveRecord形式调用,实体类只需继承Model类即可进行强大的CRUD操作。
  7. 支持自定义全局通用操作:支持全局通用方法注入(Write once, use anywhere)。
  8. 内置代码生成器:采用代码或者Maven插件可快速生成Mapper、Model、Service、Controller层代码,支持模板引擎,更有超多自定义配置。
  9. 内置分页插件:基于MyBatis物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通List查询。
  10. 内置性能分析插件:可输出Sql语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询。
二、MyBatis-Plus基本使用
1. 引入依赖

MyBatis-Plus提供了starter,实现了自动Mybatis以及MyBatis-Plus的自动装配功能。在Maven项目的pom.xml文件中添加以下依赖:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>最新版本号</version>
</dependency>

注意:尽量不要同时导入MyBatis和MyBatis-Plus,避免版本差异。

2. 配置数据库连接

application.ymlapplication.properties文件中配置数据库连接信息。例如,使用application.yml文件:

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/数据库名?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8
    username: 账号
    password: 密码
3. 使用

在Spring Boot启动类中添加@MapperScan注解,扫描Mapper文件夹:

@SpringBootApplication
@MapperScan("com.example.mapper") // 替换为你的Mapper所在的类路径
public class MyBatisPlusApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyBatisPlusApplication.class, args);
    }
}

在对应的Mapper上面添加@Mapper注解,并继承BaseMapper<>类:

@Mapper
public interface UserMapper extends BaseMapper<User> {
    // 所有的CRUD都已经完成,不需要像以前一样配置一大堆文件
}

其中,User是实体类,对应数据库中的一张表。

4. 编写实体类

实体类通常使用Lombok库来简化代码。例如:

import lombok.Data;

@Data
public class User {
    private Long id;
    private String name;
    private Integer age;
    // 其他字段...
}

MyBatis-Plus会根据PO实体(BaseMapper<T>中的T)的信息来推断出表的信息,从而生成SQL。默认情况下,MyBatis-Plus会把PO实体的类名驼峰转下划线作为表名,把PO实体的所有变量名驼峰转下划线作为表的字段名,并根据变量类型推断字段类型。如果默认实现与实际场景不符,可以使用注解来声明表信息。

  • @TableName:标识实体类对应的表。当实体类的名称和表名的命名不一致时使用。
  • @TableId:标识实体类中的主键字段。如果主键字段的命名符合规范(如id),则不需要使用该注解。
  • @TableField:标识实体类中的普通属性。当实体类的命名和数据库的字段名有出入时使用。
三、CRUD操作

MyBatis-Plus提供了丰富的CRUD操作方法,这些方法都定义在BaseMapper接口中。

1. 插入

使用insert方法插入一条记录:

User user = new User();
user.setName("张三");
user.setAge(18);
// 其他字段设置...
userMapper.insert(user);
2. 删除

使用deleteById方法根据主键删除一条记录:

userMapper.deleteById(1L);

使用deleteBatchIds方法根据主键批量删除记录:

List<Long> ids = Arrays.asList(1L, 2L, 3L);
userMapper.deleteBatchIds(ids);
3. 更新

使用updateById方法根据主键更新一条记录:

User user = new User();
user.setId(1L);
user.setName("李四");
// 其他字段设置(需要更新的字段)...
userMapper.updateById(user);
4. 查询

使用selectById方法根据主键查询一条记录:

User user = userMapper.selectById(1L);

使用selectList方法查询所有记录:

List<User> userList = userMapper.selectList(null);

使用条件构造器Wrapper进行复杂查询。例如,查询年龄大于18岁的用户:

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.gt("age", 18);
List<User> userList = userMapper.selectList(queryWrapper);
四、条件构造器

MyBatis-Plus提供了强大的条件构造器,用于构建复杂的查询条件。条件构造器的核心类是Wrapper,其子类包括QueryWrapperUpdateWrapper

1. 基本比较操作

使用eqnegtgeltle等方法进行基本比较操作。例如:

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "张三"); // 等价于 WHERE name = '张三'
queryWrapper.ne("age", 18); // 等价于 WHERE age <> 18
2. 模糊查询

使用likenotLikelikeLeftlikeRight等方法进行模糊查询。例如:

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("name", "张"); // 等价于 WHERE name LIKE '%张%'
3. 排序

使用orderByAscorderByDesc等方法进行排序。例如:

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByAsc("age"); // 等价于 ORDER BY age ASC
4. 逻辑查询

使用andornested等方法进行逻辑查询。例如:

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.and(wrapper -> wrapper.eq("name", "张三").ne("age", 18));
// 等价于 WHERE (name = '张三' AND age <> 18)
5. select

使用select方法指定查询的字段。例如:

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.select("name", "age"); // 只查询name和age字段
List<Map<String, Object>> userList = userMapper.selectMaps(queryWrapper);
五、ActiveRecord

MyBatis-Plus支持ActiveRecord模式,实体类只需继承Model类即可进行强大的CRUD操作。不过,需要注意的是,从MyBatis-Plus 3.x版本开始,Model类已经被废弃,推荐使用BaseEntity或自定义实体类配合BaseMapper进行CRUD操作。