手记

MyBatisPlus教程:新手入门与初级使用指南

概述

本文介绍了 MyBatisPlus,一个强大的 MyBatis 增强工具,提供了简单而强大的 CRUD 操作、支持 Lambda 表达式、自定义主键生成及多种查询方式。文章详细讲解了 MyBatisPlus 的优点、与其他 ORM 框架的比较、环境搭建与依赖配置、基本 CRUD 操作、条件构造器与复杂查询、自动填充与逻辑删除以及插件与扩展功能。

MyBatisPlus简介

MyBatisPlus是什么

MyBatisPlus 是一个 MyBatis 的增强工具,它在 MyBatis 的基础上提供了简单、强大的 CRUD 操作、支持 Lambda 表达式、支持自定义主键、支持自定义生成器、支持链式操作、支持分页插件等特性。MyBatisPlus 旨在简化 MyBatis 的使用,减少代码编写量,提高开发效率。

MyBatisPlus的优点

  1. 简化代码编写:MyBatisPlus 提供了大量的封装方法,可以极大地减少 CRUD 操作的代码量。
  2. 强大的查询功能:支持多种查询方式,如 Lambda 表达式查询、多表关联查询等。
  3. 参数与结果集处理:支持复杂参数和结果集的处理,可以更方便地使用动态参数。
  4. 分页插件:内置了分页插件,能够快速实现分页功能,减少了额外的依赖。
  5. 逻辑删除与自动填充:支持逻辑删除和自动填充策略,简化了数据处理逻辑。
  6. 链式操作:支持链式操作,使代码更具可读性。
  7. 自定义主键:支持自定义主键生成策略,如 UUID、Snowflake 等。

MyBatisPlus与其他ORM框架的比较

与其他 ORM 框架相比,MyBatisPlus 具有以下优势:

  1. 高效的查询性能
    • Hibernate:虽然提供了强大的 ORM 功能,但在查询性能上不如 MyBatisPlus。
    • MyBatis:相比 MyBatis,MyBatisPlus 提供了更简洁的 API 和更多的增强功能。
  2. 灵活的查询方式
    • MyBatisPlus:支持 Lambda 表达式和多表关联查询,提高了查询的灵活性。
    • MyBatis:需要手动编写 SQL 语句和映射文件,较为繁琐。
  3. 易用性
    • MyBatisPlus:提供了大量的封装方法和注解,使得 CRUD 操作更加简单。
    • MyBatis:需要手动编写 SQL 语句,增加了开发复杂度。
  4. 分页插件
    • MyBatisPlus:内置了分页插件,可以快速实现分页功能。
    • MyBatis:需要自行编写分页逻辑,增加了额外的工作量。
  5. 逻辑删除与自动填充
    • MyBatisPlus:提供了逻辑删除和自动填充功能,简化了数据处理逻辑。
    • MyBatis:需要手动实现逻辑删除功能和数据填充逻辑。
环境搭建与依赖配置

开发环境准备

开发环境准备主要包括搭建 Java 开发环境以及配置开发工具。以下是推荐的配置步骤:

  1. 安装 JDK
    • 下载并安装最新版本的 JDK,建议使用 JDK 11 或更高版本。
  2. 安装 IDE
    • 推荐使用 IntelliJ IDEA 或 Eclipse,这两款 IDE 对 Java 开发提供了良好的支持。
    • 在 IntelliJ IDEA 中,可以通过 File -> New -> Project 来创建一个新的 Java 项目。
    • 在 Eclipse 中,可以通过 File -> New -> Java Project 来创建一个新的 Java 项目。
  3. 配置 Maven/Gradle
    • 安装 Maven 或 Gradle,并配置它们的环境变量。
    • 在 IntelliJ IDEA 中配置 Maven 或 Gradle,可以通过 File -> Settings -> Build, Execution, Deployment -> Build Tools -> Maven 或 Gradle 进行配置。
    • 在 Eclipse 中配置 Maven 或 Gradle,可以通过 Window -> Preferences -> Maven 或 Gradle 进行配置。

Maven与Gradle依赖配置

Maven依赖配置

在 Maven 项目中,需要在 pom.xml 文件中添加 MyBatisPlus 的依赖。示例如下:

<dependencies>
    <!-- MyBatisPlus 依赖 -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.5.0</version>
    </dependency>
    <!-- MySQL 依赖 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.22</version>
    </dependency>
    <!-- Spring Boot 依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
        <version>2.5.3</version>
    </dependency>
</dependencies>

Gradle依赖配置

在 Gradle 项目中,需要在 build.gradle 文件中添加 MyBatisPlus 的依赖。示例如下:

dependencies {
    // MyBatisPlus 依赖
    implementation 'com.baomidou:mybatis-plus-boot-starter:3.5.0'
    // MySQL 依赖
    implementation 'mysql:mysql-connector-java:8.0.22'
    // Spring Boot 依赖
    implementation 'org.springframework.boot:spring-boot-starter:2.5.3'
}

MyBatisPlus配置文件详解

在 Spring Boot 项目中,MyBatisPlus 的配置文件通常放在 src/main/resources 目录下的 application.ymlapplication.properties 文件中。

application.yml 配置示例

spring:
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/mydatabase?serverTimezone=UTC
    username: root
    password: root

mybatis-plus:
  mapper-locations: classpath*:mapper/*.xml
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

application.properties 配置示例

spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root

mybatis-plus.mapper-locations=classpath*:mapper/*.xml
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl

Java代码初始化配置

src/main/java 目录下创建一个配置类,用于初始化 MyBatisPlus 和数据库连接。

package com.example.demo.config;

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.annotation.EnableTransactionManagement;

@Configuration
@EnableTransactionManagement
public class MyBatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return interceptor;
    }
}
基本CRUD操作

创建实体类与Mapper接口

首先,创建一个简单的实体类 User 以及对应的 Mapper 接口 UserMapper

实体类 User

package com.example.demo.entity;

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.IdType;

@TableName("user")
public class User {
    @TableId(value="id", type=IdType.AUTO)
    private Integer id;
    private String name;
    private Integer age;

    public User() {
    }

    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    // Getter and Setter methods
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}

Mapper接口 UserMapper

package com.example.demo.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.User;

public interface UserMapper extends BaseMapper<User> {
}

基本增删改查操作

使用 MyBatisPlus 进行基本的增删改查操作非常简单,只需要调用对应的方法即可。

增加记录

package com.example.demo.service;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.springframework.stereotype.Service;

@Service
public class UserService extends ServiceImpl<UserMapper, User> {

    public void addUser(User user) {
        this.save(user);
    }
}

删除记录

public void deleteUser(Integer id) {
    this.removeById(id);
}

修改记录

public void updateUser(User user) {
    this.updateById(user);
}

查询记录

public User getUserById(Integer id) {
    return this.getById(id);
}

参数与返回值处理

MyBatisPlus 支持复杂的参数类型,例如 List、Map 等。以下是一些示例代码。

批量插入

public void batchInsert(List<User> users) {
    this.saveBatch(users);
}

查询多条记录

public List<User> listUsers() {
    return this.list();
}

查询带条件的记录

public List<User> listUsersByName(String name) {
    return this.list(Wrappers.<User>lambdaQuery().eq(User::getName, name));
}
条件构造器与复杂查询

条件构造器Lambda表达式

MyBatisPlus 提供了强大的条件构造器,可以使用 Lambda 表达式构建复杂的查询条件。

示例代码

public List<User> listUsersByAgeGreaterThan(Integer age) {
    return this.list(Wrappers.<User>lambdaQuery().gt(User::getAge, age));
}

多表关联查询

MyBatisPlus 支持多表关联查询,可以使用 @TableField 注解来关联其他表的数据。

示例代码

假设有一个 User 表和一个 Address 表,其中 User 表有一个 addressId 字段关联 Address 表的 id 字段。

package com.example.demo.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;

@TableName("address")
public class Address {
    @TableId(value="id", type=IdType.AUTO)
    private Integer id;
    private String address;

    public Address() {
    }

    public Address(String address) {
        this.address = address;
    }

    // Getter and Setter methods
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}
package com.example.demo.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.example.demo.entity.Address;

public class User {
    // Existing code...

    @TableField(exist = true)
    private Address address;

    // Getter and Setter methods
    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }
}

查询关联表数据

public List<User> listUsersWithAddress() {
    return this.list(Wrappers.<User>lambdaQuery().select(User::getId, User::getName, User::getAge).join(Address.class, User::getAddressId, Address::getId));
}

分页与排序操作

MyBatisPlus 提供了内置的分页插件,可以快速实现分页功能。

示例代码

public Page<User> getUserPage(Integer currentPage, Integer pageSize) {
    return this.page(new Page<>(currentPage, pageSize));
}
自动填充与逻辑删除

自动填充策略配置

MyBatisPlus 支持自动填充策略,可以在实体类中使用 @TableField 注解来配置自动填充策略。

示例代码

package com.example.demo.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.FieldFill;

import java.util.Date;

@TableName("user")
public class User {
    // Existing code...

    @TableField(fill = FieldFill.INSERT)
    private Date createTime;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

    // Getter and Setter methods
    public Date getCreateTime() {
        return createTime;
    }

    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }

    public Date getUpdateTime() {
        return updateTime;
    }

    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }
}

逻辑删除原理与使用

MyBatisPlus 支持逻辑删除,可以使用 @TableLogic 注解来实现。

示例代码

package com.example.demo.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableLogic;

@TableName("user")
public class User {
    // Existing code...

    @TableLogic
    private Integer deleted;

    // Getter and Setter methods
    public Integer getDeleted() {
        return deleted;
    }

    public void setDeleted(Integer deleted) {
        this.deleted = deleted;
    }
}

常用注解详解

MyBatisPlus 提供了多种注解来简化开发过程,以下是一些常用的注解:

  • @TableId:用于指定主键字段。
  • @TableField:用于指定其他字段,可以配置自动填充策略。
  • @TableLogic:用于实现逻辑删除。
  • @TableField(exist = false):用于指定不查询某个字段。
  • @TableField(fill = FieldFill.INSERT):用于在插入时自动填充某个字段。
  • @TableField(fill = FieldFill.INSERT_UPDATE):用于在插入或更新时自动填充某个字段。
插件与扩展功能

MyBatisPlus插件介绍

MyBatisPlus 提供了多种插件来扩展功能,例如:

  • 分页插件:实现分页功能。
  • 性能监控插件:用于监控数据库性能。
  • 乐观锁插件:实现乐观锁功能。

分页插件

MyBatisPlus 内置了分页插件,可以在配置文件中启用。

mybatis-plus:
  global-config:
    db-config:
        id-type: AUTO
    pagination:
        enable: true

扩展功能配置与使用

MyBatisPlus 支持通过配置文件或代码来启用插件功能。

示例代码

package com.example.demo.config;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyBatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

常见问题与解决方法

问题1:数据库表不存在

如果数据库中没有相应的表,MyBatisPlus 会抛出异常。可以通过以下方式解决:

  • 手动创建表:在数据库中手动创建表。
  • 自动创建表:在配置文件中启用自动创建表功能。
mybatis-plus:
  global-config:
    db-config:
        id-type: AUTO
    db-init:
        enable: true

问题2:分页插件无效

如果分页插件不起作用,可以检查以下几点:

  • 插件是否正确配置:确保分页插件已经正确配置在配置文件中。
  • 数据库方言配置正确:确保配置文件中数据库方言配置正确。
mybatis-plus:
  global-config:
    db-config:
        db-type: MYSQL
    pagination:
        enable: true

问题3:查询结果为空

如果查询结果为空,可以检查以下几点:

  • SQL 语句是否正确:确保 SQL 语句正确。
  • 字段映射是否正确:确保实体类字段映射正确。
package com.example.demo.entity;

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;

@TableName("user")
public class User {
    @TableId(value="id", type=IdType.AUTO)
    private Integer id;
    private String name;

    // Getter and Setter methods
    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

通过以上步骤,可以解决常见的 MyBatisPlus 使用问题。希望本文对你学习和使用 MyBatisPlus 提供了帮助。

0人推荐
随时随地看视频
慕课网APP