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

MyBatis-Plus资料入门教程:快速上手指南

概述

MyBatis-Plus 是一个 MyBatis 的增强工具,它提供了许多便捷功能,简化了 CRUD 操作,提升了开发效率。该工具不仅简化了开发流程,还提供了自动填充、逻辑删除和乐观锁等高级功能。本文将详细介绍 MyBatis-Plus 的使用方法、环境搭建以及高级功能解析,帮助开发者更好地理解和使用 MyBatis-Plus。

MyBatis-Plus简介

MyBatis-Plus 是一个 MyBatis 的增强工具,它在 MyBatis 的基础上提供了大量的便捷功能,使得 CRUD 操作更加简单高效。该工具不仅简化了开发流程,还提升了开发效率,从而降低了开发难度。

MyBatis-Plus的基本概念

MyBatis-Plus 是一个 MyBatis 的增强工具,旨在简化开发、提升效率。它主要通过扩展 MyBatis 提供的 API 和功能,提供了许多便捷的工具和特性,例如:

  • CRUD 操作简化:简化了常见的 CRUD(增删改查)操作,提供了更简洁的 API。
  • 条件构造器:提供了一种链式调用方式,便于构建复杂的查询条件。
  • 分页插件:内置了分页插件,可以方便地进行分页操作。
  • 逻辑删除:支持逻辑删除,即不删除数据库中的记录,而是在记录上添加一个标志位来表示删除状态。
  • 乐观锁:提供了乐观锁机制,支持在数据更新过程中防止数据冲突。
  • 自动生成器:提供了自动生成代码的功能,可以快速生成实体类、Mapper 接口等。
MyBatis-Plus的功能特点

MyBatis-Plus 在 MyBatis 的基础上主要提供了以下功能特点:

  • 自动创建CRUD方法:使用 MyBatis-Plus,用户无需手动编写每个 CRUD 方法,通过继承 BaseMapper 接口,MyBatis-Plus 自动为实体类生成相应的 CRUD 方法。
  • 链式查询:提供了一种链式查询的方式,可以在查询条件中进行多层嵌套,便于构建复杂的查询逻辑。
  • 自定义Sql执行器:支持自定义 SQL 执行器,可以通过 Executor 接口实现自定义的 SQL 查询和更新逻辑。
  • 分页插件:内置了分页插件,简化了分页查询的操作,只需调用 Page 对象即可实现分页。
  • 逻辑删除:支持逻辑删除,即不删除数据库中的记录,而是在记录上添加一个标志位来表示删除状态。
  • 乐观锁:提供了乐观锁机制,支持在数据更新过程中防止数据冲突。
  • 自动填充:支持自动填充字段,例如填充创建时间、更新时间等。
MyBatis-Plus的优势与应用场景

MyBatis-Plus 的主要优势在于其简化了开发流程,提升了开发效率,降低了开发难度。具体优势包括:

  • 简化开发:通过自动创建 CRUD 方法、链式查询等功能,大幅简化了开发流程。
  • 提升效率:提供了丰富的便捷功能,减少了开发人员的手动编写代码的工作量。
  • 降低难度:通过自动填充、逻辑删除等功能,降低了开发难度,使得开发更加便捷。
  • 易维护:通过自动生成代码和内置插件,使得代码更加易维护,减少了手工编码带来的维护成本。

MyBatis-Plus 的应用场景广泛,尤其适用于需要进行 CRUD 操作的场景。例如:

  • 用户管理模块:用户注册、登录、信息修改等操作。
  • 商品管理系统:商品增删改查、库存管理等。
  • 订单管理系统:订单生成、修改、删除等操作。
  • 博客系统:文章发布、编辑、删除等操作。
  • 后台管理系统:权限管理、日志管理等。
MyBatis-Plus环境搭建

在开始使用 MyBatis-Plus 之前,需要搭建好开发环境,并引入 MyBatis-Plus 的依赖,配置数据库连接。

开发环境配置
  • 开发工具:建议使用 IntelliJ IDEA 或 Eclipse 等现代集成开发环境(IDE)。
  • 语言环境:Java 开发环境。
  • 运行环境:JDK 1.8 及以上版本。
  • 构建工具:Maven 或 Gradle。
  • 数据库:支持 MySQL、Oracle、SQL Server、PostgreSQL、SQLite、Derby 等主流数据库。
引入MyBatis-Plus依赖

在 pom.xml 文件中添加 MyBatis-Plus 的依赖,以下是 Maven 依赖配置示例:

<dependencies>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.4.3</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.23</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>

对于 Gradle 项目,可以在 build.gradle 文件中添加如下依赖:

dependencies {
    implementation('com.baomidou:mybatis-plus-boot-starter:3.4.3')
    implementation('mysql:mysql-connector-java:8.0.23')
    implementation('org.springframework.boot:spring-boot-starter-jdbc')
    implementation('org.springframework.boot:spring-boot-starter-web')
}
数据库连接配置

application.ymlapplication.properties 文件中配置数据库连接信息。以下是 application.yml 示例:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mybatisplus
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    show-sql: true
    hibernate:
      dialect: org.hibernate.dialect.MySQL5InnoDBDialect

通过以上步骤,MyBatis-Plus 环境搭建完成。接下来可以开始使用 MyBatis-Plus 进行开发。

MyBatis-Plus基本使用

MyBatis-Plus 提供了一系列便捷的功能,使得 CRUD 操作更加简单高效。本节将详细介绍如何定义实体类与 Mapper 接口,以及如何进行 CRUD 操作和条件构造器的使用。

实体类与Mapper接口的定义

实体类是 MyBatis-Plus 操作数据库的基础,通常对应数据库中的表。实体类需要遵循一些命名规范,并且可以添加一些注解来增强功能。

实体类定义

以下是用户实体类 User 的定义示例:

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

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

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

    public void setId(Long 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;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Integer getDeleted() {
        return deleted;
    }

    public void setDeleted(Integer deleted) {
        this.deleted = deleted;
    }
}
  • @TableName 注解用于指定实体类对应的数据库表名。
  • @TableId 注解用于指定主键字段,并且可以通过 type 属性指定主键生成策略,例如 IdType.AUTO 表示自增。
  • private 字段表示实体类的属性。

Mapper接口定义

Mapper 接口继承 BaseMapper 接口,MyBatis-Plus 会自动生成相应的 CRUD 方法。

import com.baomidou.mybatisplus.core.mapper.BaseMapper;

public interface UserMapper extends BaseMapper<User> {
}
  • BaseMapper<User> 表示该接口对应 User 实体类。
CRUD操作实战

MyBatis-Plus 提供了丰富的 CRUD 方法,包括新增、删除、更新、查询等操作。

新增操作

@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;

    public void insertUser(User user) {
        userMapper.insert(user);
    }
}
  • insert 方法用于插入一条新的用户记录。

删除操作

public void deleteUserById(Long id) {
    userMapper.deleteById(id);
}
  • deleteById 方法用于根据主键删除一条用户记录。

更新操作

public void updateUser(User user) {
    userMapper.updateById(user);
}
  • updateById 方法用于更新一条用户记录,需要注意的是,需要传入完整的用户对象。

查询操作

public User getUserById(Long id) {
    return userMapper.selectById(id);
}

public List<User> getAllUsers() {
    return userMapper.selectList(null);
}
  • selectById 方法用于根据主键查询一条用户记录。
  • selectList 方法用于查询所有用户记录,参数可以传入查询条件。
条件构造器的使用

MyBatis-Plus 提供了 QueryWrapperUpdateWrapper 等条件构造器,用于构建复杂的查询条件。

查询条件构造器

public List<User> getUsersByName(String name) {
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    wrapper.eq("name", name);
    return userMapper.selectList(wrapper);
}
  • QueryWrapper 构建查询条件,eq 方法用于构建等于条件。

更新条件构造器

public void updateUsersByName(String name, Integer age) {
    UpdateWrapper<User> wrapper = new UpdateWrapper<>();
    wrapper.eq("name", name).set("age", age);
    userMapper.update(null, wrapper);
}
  • UpdateWrapper 构建更新条件,set 方法用于设置更新值。
MyBatis-Plus高级功能解析

MyBatis-Plus 提供了一些高级功能,例如分页插件、逻辑删除、乐观锁等,这些功能可以进一步提升数据库操作的效率和安全性。

分页插件的使用

MyBatis-Plus 内置了分页插件,可以方便地进行分页操作。

分页插件配置

application.yml 中配置分页插件:

mybatis-plus:
  global-config:
    db-config:
      id-type: AUTO
    sequence:
      type: snowflake
      value: 001
  mapper-locations: classpath*:mapper/*.xml
  type-aliases-package: com.example.demo.entity
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

分页查询示例

public List<User> getUsersByPage(int currentPage, int pageSize) {
    Page<User> page = new Page<>(currentPage, pageSize);
    QueryWrapper<User> wrapper = new QueryWrapper<>();
    List<User> users = userMapper.selectPage(page, wrapper).getRecords();
    return users;
}
  • Page 构造器需要传入当前页码和每页大小。
  • selectPage 方法返回 Page 对象,通过 getRecords 方法获取分页后的用户列表。
逻辑删除与乐观锁

逻辑删除

逻辑删除是指不物理删除数据库中的记录,而是通过添加一个标志位来表示删除状态。MyBatis-Plus 支持逻辑删除,可以通过注解配置。

import com.baomidou.mybatisplus.annotation.TableLogic;

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

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

    public void setId(Long 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;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Integer getDeleted() {
        return deleted;
    }

    public void setDeleted(Integer deleted) {
        this.deleted = deleted;
    }
}
  • @TableLogic 注解用于指定逻辑删除字段。

乐观锁

乐观锁是指在数据更新过程中,检查数据是否被其他事务修改过。MyBatis-Plus 支持乐观锁,可以通过注解配置。

import com.baomidou.mybatisplus.annotation.Version;

@TableName("user")
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;
    private String name;
    private Integer age;
    private String email;
    @Version
    private Integer version;

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

    public void setId(Long 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;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Integer getVersion() {
        return version;
    }

    public void setVersion(Integer version) {
        this.version = version;
    }
}
  • @Version 注解用于指定乐观锁字段。

逻辑删除与乐观锁示例

public void deleteLogicById(Long id) {
    userMapper.deleteById(id);
}

public void updateUserWithVersion(User user) {
    userMapper.updateById(user);
}
  • deleteById 方法用于逻辑删除用户记录。
  • updateById 方法用于更新用户记录,并自动更新乐观锁字段。
自动填充与序列表的使用

MyBatis-Plus 提供了自动填充和序列表的功能,可以方便地填充某些字段和生成序列号。

自动填充

自动填充是指在插入或更新数据时,自动填充某些字段,例如创建时间和更新时间。

自动填充配置

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

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

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

    public void setId(Long 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;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Integer getDeleted() {
        return deleted;
    }

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

    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;
    }
}
  • @TableField(fill = FieldFill.INSERT) 表示在插入数据时自动填充字段。
  • @TableField(fill = FieldFill.UPDATE) 表示在更新数据时自动填充字段。

序列表使用

序列表用于生成唯一的序列号,可以用于自增主键等场景。

序列表配置

application.yml 中配置序列表:

mybatis-plus:
  global-config:
    db-config:
      id-type: NONE
    sequence:
      type: snowflake
      value: 001
  • id-type: NONE 表示使用自定义的序列号生成策略。
  • sequence.type 表示序列号生成的类型,例如 snowflake
  • sequence.value 表示序列号生成的值。

自动填充与序列表示例

public void insertUser(User user) {
    userMapper.insert(user);
}

public void updateUser(User user) {
    userMapper.updateById(user);
}
  • insert 方法用于插入用户记录,自动填充 createTime 字段。
  • updateById 方法用于更新用户记录,自动填充 updateTime 字段。
MyBatis-Plus与Spring Boot集成

MyBatis-Plus 可以与 Spring Boot 无缝集成,提供了便捷的配置和使用方式,使得开发更加高效。本节将介绍如何在 Spring Boot 项目中引入 MyBatis-Plus,并配置 MapperScannerConfigurer,最后通过一个用户管理模块的实战案例来展示 MyBatis-Plus 的使用。

Spring Boot项目中引入MyBatis-Plus

在 Spring Boot 项目中引入 MyBatis-Plus 需要添加相关的依赖,并进行相应的配置。

依赖管理

pom.xml 文件中添加 MyBatis-Plus 的依赖:

<dependencies>
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.4.3</version>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.23</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>
``

对于 Gradle 项目,可以在 `build.gradle` 文件中添加如下依赖:

```gradle
dependencies {
    implementation('com.baomidou:mybatis-plus-boot-starter:3.4.3')
    implementation('mysql:mysql-connector-java:8.0.23')
    implementation('org.springframework.boot:spring-boot-starter-jdbc')
    implementation('org.springframework.boot:spring-boot-starter-web')
}

数据库连接配置

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

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mybatisplus
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
  jpa:
    show-sql: true
    hibernate:
      dialect: org.hibernate.dialect.MySQL5InnoDBDialect

MyBatis-Plus配置

在配置文件中配置 MyBatis-Plus 的相关设置:

mybatis-plus:
  global-config:
    db-config:
      id-type: AUTO
    sequence:
      type: snowflake
      value: 001
  mapper-locations: classpath*:mapper/*.xml
  type-aliases-package: com.example.demo.entity
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

配置MapperScannerConfigurer

在 Spring Boot 项目中可以通过 @MapperScan 注解扫描 Mapper 接口。

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("com.example.demo.mapper")
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}
  • @MapperScan 注解用于指定 Mapper 接口的扫描路径。

实体类与Mapper接口

定义实体类和对应的 Mapper 接口:

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

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

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

    public void setId(Long 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;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Integer getDeleted() {
        return deleted;
    }

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

import com.baomidou.mybatisplus.core.mapper.BaseMapper;

public interface UserMapper extends BaseMapper<User> {
}
  • 实体类 User 用于映射数据库表。
  • Mapper 接口 UserMapper 继承 BaseMapper 接口,自动生成对应的 CRUD 方法。
实战案例:用户管理模块

接下来通过一个用户管理模块的实战案例来展示 MyBatis-Plus 的使用。

用户管理模块实现

定义用户服务类 UserService

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;

@Service
public class UserService {
    @Autowired
    private UserMapper userMapper;

    public void insertUser(User user) {
        userMapper.insert(user);
    }

    public void deleteUserById(Long id) {
        userMapper.deleteById(id);
    }

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

    public User getUserById(Long id) {
        return userMapper.selectById(id);
    }

    public List<User> getAllUsers() {
        return userMapper.selectList(null);
    }

    public List<User> getUsersByName(String name) {
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.eq("name", name);
        return userMapper.selectList(wrapper);
    }
}
  • insertUser 方法用于插入用户记录。
  • deleteUserById 方法用于根据主键删除用户记录。
  • updateUser 方法用于更新用户记录。
  • getUserById 方法用于根据主键查询用户记录。
  • getAllUsers 方法用于查询所有用户记录。
  • getUsersByName 方法用于查询指定姓名的用户记录。

用户控制器类 UserController

定义用户控制器类 UserController

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;

@RestController
@RequestMapping("/users")
public class UserController {
    @Autowired
    private UserService userService;

    @PostMapping
    public void insertUser(@RequestBody User user) {
        userService.insertUser(user);
    }

    @DeleteMapping("/{id}")
    public void deleteUserById(@PathVariable Long id) {
        userService.deleteUserById(id);
    }

    @PutMapping("/{id}")
    public void updateUser(@PathVariable Long id, @RequestBody User user) {
        user.setId(id);
        userService.updateUser(user);
    }

    @GetMapping("/{id}")
    public User getUserById(@PathVariable Long id) {
        return userService.getUserById(id);
    }

    @GetMapping
    public List<User> getAllUsers() {
        return userService.getAllUsers();
    }

    @GetMapping("/name/{name}")
    public List<User> getUsersByName(@PathVariable String name) {
        return userService.getUsersByName(name);
    }
}
  • insertUser 方法用于插入用户记录。
  • deleteUserById 方法用于根据主键删除用户记录。
  • updateUser 方法用于更新用户记录。
  • getUserById 方法用于根据主键查询用户记录。
  • getAllUsers 方法用于查询所有用户记录。
  • getUsersByName 方法用于查询指定姓名的用户记录。

测试用户管理模块

通过 Postman 或者其他工具进行测试,可以验证用户管理模块的功能是否正常。

测试插入用户

POST /users
Content-Type: application/json

{
    "name": "张三",
    "age": 22,
    "email": "zhangsan@example.com"
}

测试查询所有用户

GET /users

测试查询指定主键的用户

GET /users/1

测试查询指定姓名的用户

GET /users/name/张三

测试更新用户

PUT /users/1
Content-Type: application/json

{
    "name": "李四",
    "age": 23,
    "email": "lisi@example.com"
}

测试删除用户

DELETE /users/1

通过以上步骤,用户管理模块的实现完成,可以验证通过 MyBatis-Plus 实现的 CRUD 操作是否正常。

常见问题与解决方案

在使用 MyBatis-Plus 过程中,可能会遇到一些常见问题,这些问题通常可以通过查阅相关文档或通过调试来解决。

MyBatis-Plus运行时常见错误

NullPointerException

java.lang.NullPointerException
  • 原因:通常是因为注入的 Mapper 接口为空,检查注入是否正确。
  • 解决方案:检查 @MapperScan 注解是否正确配置,确保 Mapper 接口被正确扫描到。

MapperException

org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: org.apache.ibatis.reflection.SystemMetaObject cannot be cast to java.lang.String
  • 原因:通常是 Mapper 接口的 XML 文件配置错误或 SQL 语法错误。
  • 解决方案:检查 Mapper 接口对应的 XML 文件配置,确保 SQL 语句正确。

SQLGrammarException

org.apache.ibatis.exceptions.PersistenceException: 
### Error querying database.  Cause: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Out of range value for column 'age' at row 1
  • 原因:通常是 SQL 语句中列的数据类型与插入的数据不匹配。
  • 解决方案:检查插入的数据类型是否符合数据库表的定义,调整插入的数据或修改数据库表的定义。

SQLTimeoutException

java.sql.SQLTimeoutException: Statement execute timed out
  • 原因:通常是查询或更新操作超时。
  • 解决方案:增加查询或更新操作的超时时间,优化 SQL 语句。

MybatisPlusException

com.baomidou.mybatisplus.exceptions.MybatisPlusException: 
Error: Can not found column : id in table : user
  • 原因:通常是 Mapper 方法的 SQL 语句与数据库表的字段定义不匹配。
  • 解决方案:检查 Mapper 方法的 SQL 语句是否正确,确保 SQL 语句中的字段名与数据库表的字段名一致。
常见问题排查步骤与解决方法
  1. 检查依赖:确认项目依赖是否完整,是否正确引入了 MyBatis-Plus 的相关依赖。
  2. 检查配置:确认配置文件中的数据库连接信息是否正确,MyBatis-Plus 的相关配置是否正确。
  3. 检查日志:查看应用程序的日志输出,找到错误的日志信息,根据日志信息进行问题定位。
  4. 检查代码:确认实体类和 Mapper 接口的定义是否正确,Mapper 接口的 XML 文件配置是否正确。
  5. 调试工具:使用调试工具(如 IntelliJ IDEA 的调试功能)进行调试,逐步排查问题。
  6. 查阅文档:查阅 MyBatis-Plus 的官方文档,查找相关问题的解决方案。
MyBatis-Plus最佳实践分享
  1. 使用@TableField注解:合理使用 @TableField 注解,例如通过 fill 属性自动填充字段。
  2. 逻辑删除:对于需要撤销的记录,使用逻辑删除而非物理删除,以保留数据的历史信息。
  3. 乐观锁:在数据更新操作中使用乐观锁,防止数据冲突。
  4. 分页插件:使用内置的分页插件简化分页操作,避免手动编写复杂的分页逻辑。
  5. 自动生成代码:利用 MyBatis-Plus 的自动生成器生成 CRUD 方法,减少手动编码。
  6. 链式查询:利用链式查询方式构建复杂的查询条件,提高代码可读性。
  7. 优化 SQL 语句:优化 SQL 语句,避免不必要的查询和更新操作,提高数据库性能。
  8. 依赖注入:通过 Spring 的依赖注入功能,合理配置 Mapper 接口,确保代码的可维护性。
  9. 使用@Transactional:在适当的地方使用 @Transactional 注解,确保事务的正确处理。
  10. 使用@TableLogic注解:在需要逻辑删除的字段上使用 @TableLogic 注解,确保逻辑删除功能的正确实现。

通过以上最佳实践,可以更好地利用 MyBatis-Plus 的功能,提升开发效率和代码质量。

点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

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

举报

0/150
提交
取消