本文介绍了 MyBatisPlus,一个强大的 MyBatis 增强工具,提供了简单而强大的 CRUD 操作、支持 Lambda 表达式、自定义主键生成及多种查询方式。文章详细讲解了 MyBatisPlus 的优点、与其他 ORM 框架的比较、环境搭建与依赖配置、基本 CRUD 操作、条件构造器与复杂查询、自动填充与逻辑删除以及插件与扩展功能。
MyBatisPlus简介MyBatisPlus是什么
MyBatisPlus 是一个 MyBatis 的增强工具,它在 MyBatis 的基础上提供了简单、强大的 CRUD 操作、支持 Lambda 表达式、支持自定义主键、支持自定义生成器、支持链式操作、支持分页插件等特性。MyBatisPlus 旨在简化 MyBatis 的使用,减少代码编写量,提高开发效率。
MyBatisPlus的优点
- 简化代码编写:MyBatisPlus 提供了大量的封装方法,可以极大地减少 CRUD 操作的代码量。
- 强大的查询功能:支持多种查询方式,如 Lambda 表达式查询、多表关联查询等。
- 参数与结果集处理:支持复杂参数和结果集的处理,可以更方便地使用动态参数。
- 分页插件:内置了分页插件,能够快速实现分页功能,减少了额外的依赖。
- 逻辑删除与自动填充:支持逻辑删除和自动填充策略,简化了数据处理逻辑。
- 链式操作:支持链式操作,使代码更具可读性。
- 自定义主键:支持自定义主键生成策略,如 UUID、Snowflake 等。
MyBatisPlus与其他ORM框架的比较
与其他 ORM 框架相比,MyBatisPlus 具有以下优势:
- 高效的查询性能:
- Hibernate:虽然提供了强大的 ORM 功能,但在查询性能上不如 MyBatisPlus。
- MyBatis:相比 MyBatis,MyBatisPlus 提供了更简洁的 API 和更多的增强功能。
 
- 灵活的查询方式:
- MyBatisPlus:支持 Lambda 表达式和多表关联查询,提高了查询的灵活性。
- MyBatis:需要手动编写 SQL 语句和映射文件,较为繁琐。
 
- 易用性:
- MyBatisPlus:提供了大量的封装方法和注解,使得 CRUD 操作更加简单。
- MyBatis:需要手动编写 SQL 语句,增加了开发复杂度。
 
- 分页插件:
- MyBatisPlus:内置了分页插件,可以快速实现分页功能。
- MyBatis:需要自行编写分页逻辑,增加了额外的工作量。
 
- 逻辑删除与自动填充:
- MyBatisPlus:提供了逻辑删除和自动填充功能,简化了数据处理逻辑。
- MyBatis:需要手动实现逻辑删除功能和数据填充逻辑。
 
开发环境准备
开发环境准备主要包括搭建 Java 开发环境以及配置开发工具。以下是推荐的配置步骤:
- 安装 JDK:
- 下载并安装最新版本的 JDK,建议使用 JDK 11 或更高版本。
 
- 安装 IDE:
- 推荐使用 IntelliJ IDEA 或 Eclipse,这两款 IDE 对 Java 开发提供了良好的支持。
- 在 IntelliJ IDEA 中,可以通过 File -> New -> Project 来创建一个新的 Java 项目。
- 在 Eclipse 中,可以通过 File -> New -> Java Project 来创建一个新的 Java 项目。
 
- 配置 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.yml 或 application.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.StdOutImplapplication.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.StdOutImplJava代码初始化配置
在 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;
    }
}创建实体类与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 提供了帮助。
共同学习,写下你的评论
评论加载中...
作者其他优质文章
 
                 
             
			 
					