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

MyBatis Plus入门:简单教程与实战

标签:
Java 数据库
概述

MyBatis Plus是一个MyBatis的增强工具,旨在简化开发、提高开发效率。它提供了便捷的CRUD操作、分页查询、自动填充等功能,使得数据库操作更加简单高效。本文将详细介绍MyBatis Plus入门的相关内容,帮助开发者快速上手。同时,文章还将涵盖常见问题与解决方案,帮助开发者解决在使用过程中可能遇到的问题。

MyBatis Plus简介

MyBatis Plus 是一个 MyBatis 的扩展,它遵循 MyBatis 的所有设计和规则,旨在简化开发、提高开发效率。MyBatis Plus 提供了一系列便捷的方法来操作数据库,使得 CRUD 操作更加简单和高效。

MyBatis Plus是什么

MyBatis Plus 是一个 MyBatis 的扩展,它遵循 MyBatis 的所有设计和规则,旨在简化开发、提高开发效率。MyBatis Plus 提供了大量的便捷方法来操作数据库,使得 CRUD 操作更加简单和高效。

MyBatis Plus的优势
  • 简化开发:MyBatis Plus 提供了大量的便捷方法,使得 CRUD 操作变得更加简单。
  • 提高效率:通过自动填充和逻辑删除等功能,开发人员可以专注于业务逻辑的实现,而不需要花费大量时间在数据库操作上。
  • 内置分页:MyBatis Plus 内置了分页插件,支持多种分页方式,直接使用即可。
  • 性能优化:MyBatis Plus 提供了缓存机制、批量操作等特性,可以有效提升系统性能。
  • 其他特性:支持乐观锁等特性,进一步简化开发流程。
安装与环境搭建

要使用 MyBatis Plus,首先需要在本地环境搭建好开发工具和相关依赖。以下是环境搭建步骤:

  1. 安装Java环境:确保已经安装了Java环境,并配置好环境变量。
  2. 创建Maven项目:使用 IDE(如 IntelliJ IDEA 或 Eclipse)创建一个新的 Maven 项目。
  3. 添加依赖:在 pom.xml 文件中添加 MyBatis Plus 的依赖。
<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>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>
  1. 配置数据库连接:在 application.properties 或 application.yml 文件中配置数据库连接信息。
spring.datasource.url=jdbc:mysql://localhost:3306/mybatisplus?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
mybatis-plus.mapper-locations=classpath:mapper/*.xml
快速开始
创建第一个MyBatis Plus项目

创建一个新的 Maven 项目,并加入 MyBatis Plus 相关的依赖。例如,使用 IntelliJ IDEA 创建一个新的 Spring Boot 项目,并选择 Maven 作为构建工具。

配置数据库连接

在项目的 src/main/resources 目录下创建 application.properties 文件,并配置数据库连接信息。

spring.datasource.url=jdbc:mysql://localhost:3306/mybatisplus?serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
mybatis-plus.mapper-locations=classpath:mapper/*.xml
添加依赖及初始化设置

在项目的 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>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>
基本操作
实体类的定义

定义一个简单的实体类,该实体类用于映射数据库中的表。

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

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

    // Getter和Setter方法
    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;
    }
}
CRUD操作

使用 MyBatis Plus 进行 CRUD 操作非常简单,可以使用 IService 接口提供的方法快速实现。

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

@Service
public class UserService extends ServiceImpl<UserMapper, User> {
    // CRUD操作方法
    public void addUser(User user) {
        this.save(user);
    }

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

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

    public void deleteUser(Long id) {
        this.removeById(id);
    }
}
查询操作

查询操作可以使用 QueryWrapper 构建复杂的查询条件。

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.demo.entity.User;
import org.springframework.stereotype.Service;

@Service
public class UserService {
    public List<User> getUserByName(String name) {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("name", name);
        return this.list(queryWrapper);
    }
}
分页查询

使用 MyBatis Plus 内置的分页插件,可以方便地实现分页查询。

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.demo.entity.User;
import org.springframework.stereotype.Service;

@Service
public class UserService {
    public Page<User> getUserList(int currentPage, int pageSize) {
        Page<User> page = new Page<>(currentPage, pageSize);
        return this.page(page);
    }
}
常用功能详解
自动填充

自动填充功能可以自动填充一些字段,如创建时间、更新时间等。

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

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

    // Getter和Setter方法
    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 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;
    }
}
逻辑删除

逻辑删除是指不物理删除数据库中的数据,而是通过标志位来标识数据是否已删除。

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

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

    // Getter和Setter方法
    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;
    }
}
插件使用

MyBatis Plus 支持多种插件,如分页插件、逻辑删除插件等。

分页插件

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyBatisPlusConfig {
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }
}

逻辑删除插件

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

@Configuration
public class MyBatisPlusConfig {
    @Bean
    public InnerInterceptor innerInterceptor() {
        return new TenantInnerInterceptor(DbType.MYSQL);
    }
}
实战案例
用户管理系统实现

实体类定义

定义 User 实体类,用于映射数据库中的用户表。

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.util.Date;

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

    // Getter和Setter方法
    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 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;
    }

    public Integer getDeleted() {
        return deleted;
    }

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

服务实现

实现 UserService 类,提供用户管理的方法。

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

@Service
public class UserService extends ServiceImpl<UserMapper, User> {
    public void addUser(User user) {
        this.save(user);
    }

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

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

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

    public List<User> getUserList(int currentPage, int pageSize) {
        Page<User> page = new Page<>(currentPage, pageSize);
        return this.page(page);
    }

    public List<User> getUserByName(String name) {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("name", name);
        return this.list(queryWrapper);
    }
}

数据库表结构

用户表的DDL语句如下:

CREATE TABLE `user` (
    `id` BIGINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `name` VARCHAR(100),
    `age` INT,
    `email` VARCHAR(100),
    `create_time` DATETIME,
    `update_time` DATETIME,
    `deleted` TINYINT
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

持久层实现

持久层实现 UserMapper 接口。

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.User;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserMapper extends BaseMapper<User> {
}
日志记录与异常处理

日志记录

application.properties 中配置日志输出。

logging.level.com.example.demo=DEBUG

异常处理

实现全局的异常处理类,统一处理异常。

import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(value = Exception.class)
    @ResponseBody
    public Map<String, Object> handleException(Exception e) {
        Map<String, Object> map = new HashMap<>();
        map.put("code", 500);
        map.put("message", e.getMessage());
        return map;
    }
}
常见问题与解决方案
常见错误及解决方法

错误一:找不到表

如果程序运行时报错找不到表,可以检查以下几点:

  1. 数据库连接配置是否正确。
  2. 实体类中的 @TableName 注解是否正确标注了表名。

错误二:SQL执行失败

如果 SQL 执行失败,可以检查以下几点:

  1. SQL 语句是否正确。
  2. 数据库中的表结构是否与实体类一致。
性能优化技巧

缓存机制

使用 MyBatis Plus 的缓存机制,可以提高读取性能。

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.CacheInnerInterceptor;
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 CacheInnerInterceptor());
        return interceptor;
    }
}

批量操作

使用批量操作可以减少数据库访问次数,提高性能。

import com.baomidou.mybatisplus.extension.service.IService;
import com.example.demo.entity.User;

public interface UserService extends IService<User> {
    void addUserBatch(List<User> users);
}

通过以上内容的详细讲解,相信你已经对 MyBatis Plus 的使用有了全面的了解。更多详细信息,可以参考 MyBatis Plus 的官方文档。

点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

正在加载中
JAVA开发工程师
手记
粉丝
51
获赞与收藏
178

关注作者,订阅最新文章

阅读免费教程

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

100积分直接送

付费专栏免费学

大额优惠券免费领

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

举报

0/150
提交
取消