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

MyBatis Plus资料入门教程

概述

本文详细介绍了MyBatis Plus的基本概念、优势和核心功能,包括环境搭建、快速开始以及常见问题解决方法。MyBatis Plus是一个MyBatis的增强工具,提供了大量辅助方法和高级功能,简化了数据库操作。文章还通过实战案例展示了MyBatis Plus在项目中的应用。

MyBatis Plus简介
MyBatis Plus是什么

MyBatis Plus是一个MyBatis的增强工具,它在MyBatis的基础上提供了简单而强大的条件构造器,简化了MyBatis的使用。它提供了大量的辅助方法,可以减少开发人员的重复代码,提高开发效率。

MyBatis Plus与MyBatis的关系

MyBatis Plus是基于MyBatis开发的,它完全兼容MyBatis的功能和特性。MyBatis Plus并没有对MyBatis的核心功能进行修改,而是通过扩展和封装,提供了一系列更高级的功能和更便捷的操作。

MyBatis Plus的优势
  1. 简化代码:MyBatis Plus提供了大量的辅助方法,可以减少开发人员的重复代码,提高开发效率。
  2. 公共方法:提供了一些公共方法,如countdeleteinsertupdate等,简化了基本的CRUD操作。
  3. 条件构造器:提供了强大的条件构造器,让SQL的拼装变得简单,支持链式操作和多种数据库方言。
  4. 自动生成代码:提供了代码生成器,可以自动生成Mapper、Service、Controller等基本代码。
  5. 逻辑删除:内置了逻辑删除功能,支持乐观锁和分页插件,提供了更丰富的数据库操作。
  6. 数据库层:提供了数据库层的一些功能,如连接池配置、数据库方言支持等。
环境搭建
开发环境准备

在开始使用MyBatis Plus之前,需要先搭建好开发环境。这里我们以Spring Boot为例,介绍如何搭建开发环境。

  1. 安装Java开发环境:确保已经安装好Java开发环境,建议使用Java 8及以上版本。
  2. 安装IDE:选择合适的IDE,如IntelliJ IDEA、Eclipse等。
  3. 安装Maven或Gradle:选择合适的构建工具,这里使用Maven来管理项目依赖。
MyBatis Plus依赖配置

在Spring Boot项目中,可以通过Maven或Gradle来引入MyBatis Plus的依赖。以下是Maven的依赖配置:

<dependencies>
    <!-- Spring Boot Starter Data JPA -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </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.23</version>
    </dependency>
    <!-- Spring Boot Web Starter -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>
数据库连接配置

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

spring.datasource.url=jdbc:mysql://localhost:3306/mybatis_plus?useUnicode=true&characterEncoding=utf-8&useSSL=false
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.mapper-locations=classpath*:mapper/*.xml
mybatis-plus.configuration.cache-enabled=true
mybatis-plus.configuration.use-generated-keys=true
mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
快速开始
创建实体类

创建实体类User,包含基本的属性以及对应的注解:

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

@Data
@TableName("user")
public class User {
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    private String name;
    @TableLogic
    private Integer deleted;
}
创建Mapper接口

创建Mapper接口UserMapper,继承BaseMapper<User>接口:

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

@Mapper
@Repository
public interface UserMapper extends BaseMapper<User> {
    Page<User> page(Page<User> page);
}
基本CRUD操作

MyBatis Plus提供了大量的辅助方法,可以简化基本的CRUD操作。这里以增删改查为例。

插入操作

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

@Service
public class UserService extends ServiceImpl<UserMapper, User> {
    public boolean insertUser(User user) {
        return save(user);
    }
}

查询操作

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

@Service
public class UserService extends ServiceImpl<UserMapper, User> {
    public User getUserById(Long id) {
        return getById(id);
    }
}

更新操作

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

@Service
public class UserService extends ServiceImpl<UserMapper, User> {
    public boolean updateUser(User user) {
        return updateById(user);
    }
}

删除操作

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

@Service
public class UserService extends ServiceImpl<UserMapper, User> {
    public boolean deleteUserById(Long id) {
        return removeById(id);
    }
}
核心功能详解
自动填充

自动填充功能可以自动填充创建或更新时的字段值。这里以create_timeupdate_time两个字段为例。

在实体类中添加TableField注解:

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.extension.handlers.TenantFieldHandler;
import lombok.Data;

@Data
@TableName("user")
public class User {
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    private String name;
    @TableField(fill = FieldFill.INSERT)
    private String createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private String updateTime;
    @TableLogic
    private Integer deleted;
}

自定义填充策略:

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.reflection.MetaObject;

@Slf4j
public class MyMetaObjectHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        log.info("insert fill...");
        this.setFieldValByName("createTime", LocalDateTime.now(), metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        log.info("update fill...");
        this.setFieldValByName("updateTime", LocalDateTime.now(), metaObject);
    }
}

配置自定义填充策略:

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.MetaObjectHandlerInner;
import com.baomidou.mybatisplus.extension.plugins.inner.TenantInnerInterceptor;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
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 MetaObjectHandlerInner(new MyMetaObjectHandler()));
        return interceptor;
    }
}
逻辑删除

逻辑删除功能允许你在删除数据时,不真正删除数据库中的记录,而是通过设置一个字段来标记数据已删除。这里使用@TableLogic注解来实现逻辑删除。

在实体类中添加@TableLogic注解:

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

@Data
@TableName("user")
public class User {
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    private String name;
    @TableField(fill = FieldFill.INSERT)
    private String createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private String updateTime;
    @TableLogic
    private Integer deleted;
}

逻辑删除操作:

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

@Service
public class UserService extends ServiceImpl<UserMapper, User> {
    public boolean deleteUserById(Long id) {
        return update(new QueryWrapper<User>().eq("id", id).set("deleted", 1));
    }
}
分页插件

分页插件可以简化分页操作,避免手动拼接分页SQL。这里使用MybatisPlusInterceptor插件来实现分页功能。

配置分页插件:

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
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 MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInterceptor());
        return interceptor;
    }
}

使用分页插件:

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

@Service
public class UserService extends ServiceImpl<UserMapper, User> {
    public IPage<User> getUsersPage(Page<User> page) {
        return page(page);
    }
}
常见问题解决
常见错误及解决方法
  1. 实体类映射问题:确保实体类中的字段名与数据库中的字段名一致。
  2. Mapper接口问题:确保Mapper接口继承了BaseMapper<T>接口。
  3. SQL执行问题:确保SQL语句正确,可以通过MyBatis Plus提供的SQL日志查看器来查看生成的SQL。
  4. 分页插件问题:确保配置了分页插件,并且插件拦截了所有的查询操作。
  5. 逻辑删除问题:确保使用了@TableLogic注解,并且在更新操作中正确设置了逻辑删除字段。
优化性能技巧
  1. 使用缓存:通过Spring Cache或Redis等缓存技术来减少数据库访问。
  2. 批量操作:使用MyBatis Plus提供的批量插入、删除和更新方法,减少数据库的交互次数。
  3. 合理使用索引:为频繁查询的字段添加索引,提高查询效率。
  4. 分页查询:合理使用分页插件,避免一次性查询大量数据。
  5. 批量加载:使用MyBatis Plus的@SelectBatch注解来实现批量加载。
实战案例
实战项目案例

这里以一个简单的用户管理系统为例,展示如何使用MyBatis Plus进行开发。

实体类

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

@Data
@TableName("user")
public class User {
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    private String name;
    @TableField(fill = FieldFill.INSERT)
    private String createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private String updateTime;
    @TableLogic
    private Integer deleted;
}

Mapper接口

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;

@Mapper
@Repository
public interface UserMapper extends BaseMapper<User> {
    Page<User> page(Page<User> page);
}

服务层实现

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

@Service
public class UserService extends ServiceImpl<UserMapper, User> {
    public boolean insertUser(User user) {
        return save(user);
    }

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

    public boolean updateUser(User user) {
        return updateById(user);
    }

    public boolean deleteUserById(Long id) {
        return removeById(id);
    }

    public IPage<User> getUsersPage(Page<User> page) {
        return page(page);
    }
}

控制器

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

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

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

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

    @PutMapping
    public boolean updateUser(@RequestBody User user) {
        return userService.updateUser(user);
    }

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

    @GetMapping("/page")
    public Page<User> getUsersPage(@RequestParam int currentPage, @RequestParam int pageSize) {
        Page<User> page = new Page<>(currentPage, pageSize);
        return userService.getUsersPage(page);
    }
}
MyBatis Plus在项目中的应用

在实际项目中,MyBatis Plus可以简化大量的数据库操作,减少开发人员的重复代码。以下是一些常见应用场景:

  1. 快速开发:通过自动生成代码,可以快速搭建项目框架,减少开发时间。
  2. 条件构造器:通过链式操作,可以灵活构建复杂的查询条件,提高代码的可读性和可维护性。
  3. 分页插件:简化分页操作,避免手动拼接分页SQL。
  4. 逻辑删除:通过逻辑删除,避免物理删除带来的数据丢失风险。
  5. 批量操作:提供批量插入、删除和更新的方法,减少数据库交互次数。
  6. 自动生成代码:通过代码生成器,可以自动生成Mapper、Service、Controller等基本代码,提高开发效率。

总之,MyBatis Plus简化了MyBatis的使用,提供了丰富的功能和便捷的操作,大大提高了开发效率和代码质量。

点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

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

举报

0/150
提交
取消