为了账号安全,请及时绑定邮箱和手机立即绑定

MybatisPlus资料详解与入门指南

概述

MybatisPlus是一个强大的Mybatis增强工具,提供了丰富的功能简化数据库操作。本文详细介绍了MybatisPlus的基本概念、优势、快速入门以及高级功能,帮助开发者快速上手。文章还涵盖了MybatisPlus与其他框架的整合方法和常见问题的解决技巧,提供了全面的mybatisplus资料。

MybatisPlus简介
MybatisPlus的基本概念

MybatisPlus 是一个 Mybatis 的增强工具,它在 Mybatis 基础上提供了许多开箱即用的功能,简化了开发过程。MybatisPlus 遵循 Mybatis 的设计思路,使得开发者可以专注于业务逻辑的实现,而不需要关心底层的细节。它在 Mybatis 的基础上提供了 CRUD 操作、条件构造器、分页插件、自动填充、逻辑删除等丰富的功能。

MybatisPlus 能够帮助开发者快速地搭建数据库操作的框架,提高了开发效率。它具有以下特点:

  • 高性能: MybatisPlus 在 Mybatis 的基础上做了很多优化,如缓存、批量操作等,从而提高了数据库操作的性能。
  • 简洁性: MybatisPlus 提供了丰富的注解和接口,使得代码更加简洁易读。
  • 扩展性: MybatisPlus 可以轻松地与各种框架进行整合,如 Spring Boot、Spring、Mybatis 等,从而满足不同的开发需求。
  • 易用性: MybatisPlus 提供了丰富的功能,如自动生成 SQL 语句、自动填充字段、逻辑删除等,使得开发变得更加简单。
MybatisPlus的优势和应用场景

MybatisPlus 的主要优势在于它强大的功能和简单易用的特性。以下是一些典型的应用场景:

  • 快速开发: MybatisPlus 提供了丰富的功能,使得开发人员可以更快地完成数据库操作,减少了重复代码的编写。
  • 性能优化: MybatisPlus 自带了多种优化手段,如缓存、批量操作等,能够显著提高系统的性能。
  • 业务逻辑分离: MybatisPlus 允许开发人员将业务逻辑与数据库操作分开,使得代码更加清晰易读。
  • 简化配置: MybatisPlus 提供了默认的配置,使得配置文件更加简洁,减少了配置的复杂度。

MybatisPlus的优势

  • 便捷的CRUD操作: MybatisPlus 提供了丰富的 CRUD 操作接口,使得增删改查操作更加简单。
  • 强大的条件构造器: MybatisPlus 提供了条件构造器,开发者可以轻松地构建复杂的查询条件。
  • 高效的分页插件: MybatisPlus 提供了分页插件,支持多种分页方式,如 Mybatis 的分页插件等。
  • 自动填充和逻辑删除: MybatisPlus 支持自动填充字段和逻辑删除,使得数据库操作更加灵活。
  • 与多种框架的无缝集成: MybatisPlus 可以与 Spring Boot、Spring、Mybatis等框架无缝集成,提供了丰富的整合方案。
  • 支持自定义插件: MybatisPlus 支持自定义插件,可以根据需求进行二次开发。

这些优势使得 MybatisPlus 成为一个非常实用的工具,适用于各种规模的项目。

MybatisPlus快速入门
MybatisPlus的环境搭建

Maven依赖

要使用 MybatisPlus,首先需要在 Maven 项目中引入 MybatisPlus 的依赖。在 pom.xml 文件中添加如下依赖:

<dependencies>
    <!-- Mybatis Plus -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.4.3</version>
    </dependency>
    <!-- MySQL -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.27</version>
    </dependency>
    <!-- Spring Boot Starter JPA -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
</dependencies>

数据库配置

application.yml 文件中配置数据库连接信息:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mybatis_plus?useSSL=false&characterEncoding=UTF-8
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver

实体类定义

创建一个简单的实体类 User,用于表示用户信息:

package com.example.demo.entity;

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

import java.io.Serializable;
import java.util.Date;

@TableName("user")
public class User implements Serializable {
    @TableId
    private Long id;
    private String name;
    private Integer age;
    private String email;
    private Date createTime;

    // 省略 Getter 和 Setter 方法
}

Mapper接口定义

创建一个 UserMapper 接口,继承自 BaseMapper 接口,用于定义数据库操作方法:

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

application.yml 文件中启用 MybatisPlus:

mybatis-plus:
  configuration:
    cache-enabled: false

启动类配置

在 Spring Boot 应用的启动类中配置 MybatisPlus:

package com.example.demo;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration;
import com.baomidou.mybatisplus.core.MybatisSqlSessionFactory;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
@MapperScan("com.example.demo.mapper")
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

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

接口实现

在 Spring Boot 应用中,通过 UserMapper 接口可以直接调用 MybatisPlus 提供的 CRUD 方法,无需编写 SQL 语句。

示例代码

创建一个简单的测试类 UserMapperTest,用于验证 MybatisPlus 的功能:

package com.example.demo.mapper;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.User;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.demo.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class UserMapperTest {

    @Autowired
    private UserMapper userMapper;

    @Test
    public void testCRUD() {
        // 插入数据
        User user = new User();
        user.setName("John Doe");
        user.setAge(30);
        user.setEmail("john.doe@example.com");
        user.setCreateTime(new Date());
        userMapper.insert(user);

        // 查询数据
        User userById = userMapper.selectById(user.getId());
        System.out.println(userById);

        // 更新数据
        user.setAge(31);
        userMapper.updateById(user);

        // 删除数据
        userMapper.deleteById(user.getId());
    }
}
MybatisPlus的核心注解介绍

@TableId

@TableId 注解用于指定实体类的主键字段。默认情况下,MybatisPlus 会根据字段名推断主键字段。如果需要指定主键生成策略,可以使用 value 属性。

@TableId(value = "id", type = IdType.AUTO)
private Long id;

@TableName

@TableName 注解用于指定实体类对应的数据库表名。默认情况下,MybatisPlus 会根据实体类名推断表名。

@TableName("user")
public class User implements Serializable {
    // ...
}

@TableField

@TableField 注解用于指定实体类字段对应的数据库字段名。默认情况下,MybatisPlus 会根据字段名推断对应的数据库字段名。如果需要指定数据库字段名,可以使用 value 属性。

@TableField(value = "create_time")
private Date createTime;

@TableLogic

@TableLogic 注解用于指定逻辑删除字段。默认情况下,MybatisPlus 会将逻辑删除字段设置为 deleted,值为 0 表示未删除,1 表示已删除。

@TableField(value = "deleted")
@TableLogic
private Integer deleted;

@Version

@Version 注解用于指定乐观锁字段。默认情况下,MybatisPlus 会将乐观锁字段设置为 version

@TableField(value = "version")
@Version
private Long version;

@TableField(exist = false)

@TableField(exist = false) 注解用于指定实体类字段对应的数据库字段不存在。这种情况往往在表结构和实体类不匹配时使用。

@TableField(exist = false)
private String nonExistentField;

@TableField(fill = FieldFill.INSERT)

@TableField(fill = FieldFill.INSERT) 注解用于指定在插入数据时自动填充的字段。可以使用 FieldFill 枚举指定填充时机(INSERT、UPDATE 等)。

@TableField(fill = FieldFill.INSERT, value = "create_time")
private Date createTime;

示例代码

package com.example.demo.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.Version;
import java.io.Serializable;
import java.util.Date;

@TableName("user")
public class User implements Serializable {
    @TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    private Integer age;
    @TableField(value = "email")
    private String email;
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    @TableLogic
    private Integer deleted;
    @Version
    private Long version;

    // 省略 Getter 和 Setter 方法
}
MybatisPlus常用功能详解
CRUD操作

MybatisPlus 提供了一系列的 CRUD 操作接口,使得数据库操作变得更加简单。以下是 MybatisPlus 常用的 CRUD 操作方法:

插入数据

使用 insert 方法插入一条数据:

User user = new User();
user.setName("John Doe");
user.setAge(30);
user.setEmail("john.doe@example.com");
user.setCreateTime(new Date());

UserMapper userMapper = SpringContextUtils.getBean(UserMapper.class);
userMapper.insert(user);

查询数据

使用 selectById 方法查询一条数据:

User userById = userMapper.selectById(1L);
System.out.println(userById);

更新数据

使用 updateById 方法更新一条数据:

User user = new User();
user.setId(1L);
user.setAge(31);

userMapper.updateById(user);

删除数据

使用 deleteById 方法删除一条数据:

userMapper.deleteById(1L);

批量插入数据

使用 insertBatch 方法批量插入数据:

List<User> users = new ArrayList<>();
users.add(new User("Alice", 25, "alice@example.com"));
users.add(new User("Bob", 30, "bob@example.com"));

userMapper.insertBatch(users);

批量更新数据

使用 updateBatchById 方法批量更新数据:

List<User> users = new ArrayList<>();
users.add(new User(1L, "Alice", 26));
users.add(new User(2L, "Bob", 31));

userMapper.updateBatchById(users);

批量删除数据

使用 deleteBatchIds 方法批量删除数据:

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

示例代码

package com.example.demo.mapper;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class UserMapperTest {

    @Autowired
    private UserMapper userMapper;

    @Test
    public void testCRUD() {
        // 插入数据
        User user = new User();
        user.setName("John Doe");
        user.setAge(30);
        user.setEmail("john.doe@example.com");
        user.setCreateTime(new Date());
        userMapper.insert(user);

        // 查询数据
        User userById = userMapper.selectById(user.getId());
        System.out.println(userById);

        // 更新数据
        user.setAge(31);
        userMapper.updateById(user);

        // 删除数据
        userMapper.deleteById(user.getId());

        // 批量插入数据
        List<User> users = new ArrayList<>();
        users.add(new User("Alice", 25, "alice@example.com"));
        users.add(new User("Bob", 30, "bob@example.com"));
        userMapper.insertBatch(users);

        // 批量更新数据
        List<User> updatedUsers = new ArrayList<>();
        updatedUsers.add(new User(1L, "Alice", 26));
        updatedUsers.add(new User(2L, "Bob", 31));
        userMapper.updateBatchById(updatedUsers);

        // 批量删除数据
        List<Long> ids = Arrays.asList(1L, 2L);
        userMapper.deleteBatchIds(ids);
    }
}
条件构造器的使用

MybatisPlus 提供了条件构造器 QueryWrapperLambdaQueryWrapper,用于构建复杂的查询条件。以下是条件构造器的使用示例:

基本条件构造

使用 QueryWrapper 构建基本的查询条件:

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "John Doe");
List<User> users = userMapper.selectList(queryWrapper);

多条件查询

使用 QueryWrapper 构建多条件查询:

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "John Doe").and(wrapper -> wrapper.gt("age", 30));
List<User> users = userMapper.selectList(queryWrapper);

Lambda表达式查询

使用 LambdaQueryWrapper 构建 Lambda 表达式查询:

LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.eq(User::getName, "John Doe").and(wrapper -> wrapper.gt(User::getAge, 30));
List<User> users = userMapper.selectList(lambdaQueryWrapper);

分组查询

使用 QueryWrapper 构建分组查询:

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.select("name").groupBy("name");
List<User> users = userMapper.selectList(queryWrapper);

排序查询

使用 QueryWrapper 构建排序查询:

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.orderByAsc("name").orderByDesc("age");
List<User> users = userMapper.selectList(queryWrapper);

示例代码

package com.example.demo.mapper;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.User;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.example.demo.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class UserMapperTest {

    @Autowired
    private UserMapper userMapper;

    @Test
    public void testQueryWrapper() {
        // 基本条件构造
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("name", "John Doe");
        List<User> users = userMapper.selectList(queryWrapper);
        System.out.println(users);

        // 多条件查询
        queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("name", "John Doe").and(wrapper -> wrapper.gt("age", 30));
        users = userMapper.selectList(queryWrapper);
        System.out.println(users);

        // Lambda表达式查询
        LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
        lambdaQueryWrapper.eq(User::getName, "John Doe").and(wrapper -> wrapper.gt(User::getAge, 30));
        users = userMapper.selectList(lambdaQueryWrapper);
        System.out.println(users);

        // 分组查询
        queryWrapper = new QueryWrapper<>();
        queryWrapper.select("name").groupBy("name");
        users = userMapper.selectList(queryWrapper);
        System.out.println(users);

        // 排序查询
        queryWrapper = new QueryWrapper<>();
        queryWrapper.orderByAsc("name").orderByDesc("age");
        users = userMapper.selectList(queryWrapper);
        System.out.println(users);
    }
}
分页插件的使用

MybatisPlus 提供了分页插件 PaginationInterceptor,用于支持分页查询。以下是分页插件的使用示例:

配置分页插件

在 Spring Boot 应用的启动类中配置分页插件:

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

使用分页插件

在查询方法中使用 Page 对象进行分页查询:

Page<User> page = new Page<>(1, 10);
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
List<User> users = userMapper.selectPage(page, queryWrapper);
System.out.println(page.getRecords());

示例代码

package com.example.demo.mapper;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class UserMapperTest {

    @Autowired
    private UserMapper userMapper;

    @Test
    public void testPagination() {
        // 使用分页插件
        Page<User> page = new Page<>(1, 10);
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        List<User> users = userMapper.selectPage(page, queryWrapper);
        System.out.println(page.getRecords());
    }
}
MybatisPlus高级功能探索
自动填充

MybatisPlus 支持自动填充字段,开发者可以配置自动填充策略,使得插入和更新数据时自动填充特定字段的值。以下是自动填充的使用示例:

配置自动填充

在实体类中使用 @TableField(fill = FieldFill.INSERT)@TableField(fill = FieldFill.INSERT_UPDATE) 注解配置自动填充字段:

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

application.yml 文件中配置自动填充策略:

mybatis-plus:
  global-config:
    db-config:
      auto-fill-strategy:
        - create-time
        - update-time

示例代码

package com.example.demo.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.TableField;
import java.io.Serializable;
import java.util.Date;

@TableName("user")
public class User implements Serializable {
    @TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    private Integer age;
    @TableField(fill = FieldFill.INSERT)
    private Date createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

    // 省略 Getter 和 Setter 方法
}
mybatis-plus:
  global-config:
    db-config:
      auto-fill-strategy:
        - create-time
        - update-time

示例代码

package com.example.demo.mapper;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class UserMapperTest {

    @Autowired
    private UserMapper userMapper;

    @Test
    public void testAutoFill() {
        // 插入数据
        User user = new User();
        user.setName("John Doe");
        user.setAge(30);
        user.setEmail("john.doe@example.com");
        userMapper.insert(user);

        // 查询数据
        User userById = userMapper.selectById(user.getId());
        System.out.println(userById);
    }
}
逻辑删除

MybatisPlus 支持逻辑删除,开发者可以配置逻辑删除字段,使得删除数据时不会真正删除数据库记录,而是将逻辑删除字段标记为已删除。以下是逻辑删除的使用示例:

配置逻辑删除

在实体类中使用 @TableField@TableLogic 注解配置逻辑删除字段:

@TableField(value = "deleted")
@TableLogic
private Integer deleted;

示例代码

package com.example.demo.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableLogic;
import java.io.Serializable;
import java.util.Date;

@TableName("user")
public class User implements Serializable {
    @TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    private Integer age;
    @TableField(value = "email")
    private String email;
    @TableField(value = "deleted")
    @TableLogic
    private Integer deleted;

    // 省略 Getter 和 Setter 方法
}

示例代码

package com.example.demo.mapper;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class UserMapperTest {

    @Autowired
    private UserMapper userMapper;

    @Test
    public void testLogicDelete() {
        // 插入数据
        User user = new User();
        user.setName("John Doe");
        user.setAge(30);
        user.setEmail("john.doe@example.com");
        userMapper.insert(user);

        // 查询数据
        User userById = userMapper.selectById(user.getId());
        System.out.println(userById);

        // 逻辑删除数据
        userMapper.deleteById(user.getId());

        // 查询数据
        userById = userMapper.selectById(user.getId());
        System.out.println(userById);
    }
}
MybatisPlus与其他框架的整合
MybatisPlus与Spring Boot的整合

MybatisPlus 可以与 Spring Boot 进行无缝整合,使得开发更加方便。以下是 MybatisPlus 与 Spring Boot 的整合示例:

配置Spring Boot依赖

pom.xml 文件中添加 Spring Boot 依赖:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <!-- Mybatis Plus -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.4.3</version>
    </dependency>
    <!-- MySQL -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.27</version>
    </dependency>
</dependencies>

配置数据库连接信息

application.yml 文件中配置数据库连接信息:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mybatis_plus?useSSL=false&characterEncoding=UTF-8
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver

配置MybatisPlus

application.yml 文件中配置 MybatisPlus:

mybatis-plus:
  global-config:
    db-config:
      id-type: AUTO
      logic-delete-value: 1
      logic-not-delete-value: 0
  configuration:
    cache-enabled: false

使用Spring Boot启动类

在 Spring Boot 应用的启动类中配置 MybatisPlus:

package com.example.demo;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration;
import com.baomidou.mybatisplus.core.MybatisSqlSessionFactory;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
@MapperScan("com.example.demo.mapper")
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

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

示例代码

package com.example.demo.mapper;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class UserMapperTest {

    @Autowired
    private UserMapper userMapper;

    @Test
    public void testCRUD() {
        // 插入数据
        User user = new User();
        user.setName("John Doe");
        user.setAge(30);
        user.setEmail("john.doe@example.com");
        userMapper.insert(user);

        // 查询数据
        User userById = userMapper.selectById(user.getId());
        System.out.println(userById);

        // 更新数据
        user.setAge(31);
        userMapper.updateById(user);

        // 删除数据
        userMapper.deleteById(user.getId());
    }
}
MybatisPlus与Mybatis的对比

MybatisPlus 是 Mybatis 的增强工具,提供了许多开箱即用的功能,简化了开发过程。以下是 MybatisPlus 与 Mybatis 的对比:

MybatisPlus的功能增强

  • CRUD操作: MybatisPlus 提供了丰富的 CRUD 操作接口,使得数据库操作变得更加简单。
  • 条件构造器: MybatisPlus 提供了条件构造器,开发者可以轻松地构建复杂的查询条件。
  • 分页插件: MybatisPlus 提供了分页插件,支持多种分页方式,如 Mybatis 的分页插件等。
  • 自动填充: MybatisPlus 支持自动填充字段,使得插入和更新数据时自动填充特定字段的值。
  • 逻辑删除: MybatisPlus 支持逻辑删除,使得删除数据时不会真正删除数据库记录,而是将逻辑删除字段标记为已删除。
  • 乐观锁: MybatisPlus 支持乐观锁,可以防止并发操作数据时的数据不一致问题。
  • 自定义插件: MybatisPlus 支持自定义插件,可以根据需求进行二次开发。

MybatisPlus与Mybatis的整合

MybatisPlus 可以与 Mybatis 进行无缝整合,使得开发更加方便。以下是 MybatisPlus 与 Mybatis 的整合示例:

配置Mybatis

pom.xml 文件中添加 Mybatis 依赖:

<dependencies>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.27</version>
    </dependency>
    <dependency>
        <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>2.2.0</version>
    </dependency>
</dependencies>

application.yml 文件中配置 Mybatis:

mybatis:
  mapper-locations: classpath*:mapper/*.xml
  type-aliases-package: com.example.demo.entity

配置MybatisPlus

pom.xml 文件中添加 MybatisPlus 依赖:

<dependencies>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.4.3</version>
    </dependency>
</dependencies>

application.yml 文件中配置 MybatisPlus:

mybatis-plus:
  global-config:
    db-config:
      id-type: AUTO
      logic-delete-value: 1
      logic-not-delete-value: 0
  configuration:
    cache-enabled: false

使用MybatisPlus

在 Spring Boot 应用的启动类中配置 MybatisPlus:

package com.example.demo;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration;
import com.baomidou.mybatisplus.core.MybatisSqlSessionFactory;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
@MapperScan("com.example.demo.mapper")
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

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

示例代码

package com.example.demo.mapper;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
public class UserMapperTest {

    @Autowired
    private UserMapper userMapper;

    @Test
    public void testCRUD() {
        // 插入数据
        User user = new User();
        user.setName("John Doe");
        user.setAge(30);
        user.setEmail("john.doe@example.com");
        userMapper.insert(user);

        // 查询数据
        User userById = userMapper.selectById(user.getId());
        System.out.println(userById);

        // 更新数据
        user.setAge(31);
        userMapper.updateById(user);

        // 删除数据
        userMapper.deleteById(user.getId());
    }
}
常见问题及解决方法
常见错误及解决办法
  • 找不到Mapper接口

    • 原因: Mapper 接口未被正确扫描。
    • 解决办法: 确保 Mapper 接口被 @MapperScan 注解正确扫描。
@SpringBootApplication
@MapperScan("com.example.demo.mapper")
public class DemoApplication {
    // ...
}
  • 自动填充失败

    • 原因: 自动填充策略未正确配置。
    • 解决办法: 检查 application.yml 文件中的自动填充策略配置是否正确。
mybatis-plus:
  global-config:
    db-config:
      auto-fill-strategy:
        - create-time
        - update-time
  • 乐观锁异常

    • 原因: 乐观锁字段未正确配置。
    • 解决办法: 确保乐观锁字段被 @Version 注解正确配置。
@TableField(value = "version")
@Version
private Long version;
  • 逻辑删除失败

    • 原因: 逻辑删除字段未正确配置。
    • 解决办法: 确保逻辑删除字段被 @TableLogic 注解正确配置。
@TableField(value = "deleted")
@TableLogic
private Integer deleted;
MybatisPlus的优化技巧
  • 缓存优化

    • 原因: 缓存可以提高数据库操作的性能。
    • 解决办法: 配置 MybatisPlus 的缓存策略。
mybatis-plus:
  configuration:
    cache-enabled: true
  • 批量操作优化

    • 原因: 批量操作可以减少数据库访问次数,提高性能。
    • 解决办法: 使用 insertBatchupdateBatchByIddeleteBatchIds 方法进行批量操作。
List<User> users = new ArrayList<>();
users.add(new User("Alice", 25, "alice@example.com"));
users.add(new User("Bob", 30, "bob@example.com"));
userMapper.insertBatch(users);
  • 分页优化

    • 原因: 分页插件可以减少每次查询的数据量,提高性能。
    • 解决办法: 使用分页插件进行分页查询。
Page<User> page = new Page<>(1, 10);
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
List<User> users = userMapper.selectPage(page, queryWrapper);
  • 配置优化

    • 原因: 合理配置可以提高 MybatisPlus 的性能。
    • 解决办法: 检查 application.yml 文件中的配置是否合理。
mybatis-plus:
  global-config:
    db-config:
      id-type: AUTO
  configuration:
    cache-enabled: true
    use-column-label: true
    use-generated-keys: true
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消