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

MyBatisPlus入门教程:从零开始学习MyBatisPlus

概述

MyBatisPlus是一个基于MyBatis的增强工具,它提供了简化CRUD操作、链式调用、条件构造器等多种功能,使得数据库操作更加简便高效。该工具支持自动填充、逻辑删除等特性,同时内置了分页插件,能够提高开发效率和系统性能。

MyBatisPlus简介
MyBatisPlus是什么

MyBatisPlus是一个基于MyBatis的增强工具,旨在简化开发人员与数据库交互的工作。它为MyBatis提供了一套更友好的API,使得CRUD操作更加简便,同时支持链式调用、条件构造器、分页等功能。

MyBatisPlus的主要功能

MyBatisPlus的主要功能包括但不限于:

  • 简化CRUD操作:通过继承ServiceImplBaseMapper简化了基础的增删改查操作。
  • 链式调用:允许开发人员以链式方式调用函数,提高代码的可读性和简洁性。
  • 条件构造器:提供强大的条件构造器,支持复杂的查询条件。
  • 分页插件:内置分页插件,支持多种分页实现方式。
  • 逻辑删除:支持逻辑删除机制,使数据不会从数据库中物理删除。
  • 自动填充:支持字段的自动填充,如创建时间、更新时间等。
  • 缓存:提供了缓存支持,可以提高查询性能。
MyBatisPlus与MyBatis的关系

MyBatisPlus是一个基于MyBatis的增强工具,而不是替代品。它在MyBatis的基础之上,增加了很多方便的功能和特性,如自动填充、逻辑删除等,使得开发人员在使用MyBatis时更加高效。MyBatisPlus本身并不提供数据库的连接管理,这些功能仍然由MyBatis自身处理。MyBatisPlus的主要作用是扩展MyBatis的功能,使得开发人员可以更专注于业务逻辑的实现。

环境搭建
准备开发环境

为了开始使用MyBatisPlus,首先需要搭建一个开发环境。以下是环境搭建的基本步骤:

  1. 安装JDK:确保你的开发环境中安装了JDK,这是使用MyBatisPlus的基础。
  2. 配置IDE:配置你使用的IDE(如IntelliJ IDEA或Eclipse),以支持Java开发。
  3. 创建Maven项目:使用Maven来管理项目的依赖。
  4. 创建数据库:在数据库中创建需要使用的表。

假设你已经完成了上述步骤,现在我们开始配置Maven项目。

引入MyBatisPlus依赖

在Maven项目中,你需要在pom.xml文件中添加MyBatisPlus依赖。以下是典型的依赖配置:

<dependencies>
    <!-- MyBatisPlus核心依赖 -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.4.3</version>
    </dependency>
    <!-- MyBatis核心依赖 -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus</artifactId>
        <version>3.4.3</version>
    </dependency>
    <!-- 数据库驱动依赖 -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>8.0.25</version>
    </dependency>
    <!-- Spring Boot依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
        <version>2.4.3</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.4.3</version>
    </dependency>
</dependencies>
创建数据库表和实体类

创建数据库表

首先,你需要在数据库中创建一个表。例如,我们创建一个名为user的表,表结构如下:

CREATE TABLE `user` (
  `id` INT(11) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(20) DEFAULT NULL,
  `age` INT(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

创建实体类

接下来,创建一个与数据库表对应的Java实体类UserUser类将映射到数据库中的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(value = "id", type = IdType.AUTO)
    private Long id;
    private String name;
    private Integer age;

    // Getters and Setters
    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;
    }
}

通过上述步骤,你已经完成了开发环境的搭建,并为数据库表创建了对应的实体类。接下来,我们将介绍如何使用MyBatisPlus进行基本的CRUD操作。

基本CRUD操作

在这一部分,我们将介绍如何使用MyBatisPlus的基本CRUD操作,包括添加、查询、更新和删除数据。

添加数据

创建Mapper接口

首先,你需要创建一个Mapper接口,该接口继承自BaseMapper接口,并映射到对应的实体类。

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserMapper extends BaseMapper<User> {
}

编写Service实现类

接下来,创建一个Service实现类,继承自ServiceImpl,并在其中实现添加数据的逻辑。

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

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

调用Service方法进行添加

在控制器或任何其他需要添加数据的地方,调用Service方法来进行数据的添加操作。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {
    @Autowired
    private UserService userService;

    @PostMapping("/addUser")
    public void addUser(@RequestBody User user) {
        userService.addUser(user);
    }
}
查询数据

单条查询

你可以通过Mapper接口的方法进行单条数据的查询。例如,通过主键ID查询单条数据。

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

多条查询

你可以通过Mapper接口的方法进行多条数据的查询。例如,查询所有数据。

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

也可以通过条件查询多条数据。

public List<User> getUsersByAge(Integer age) {
    LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
    wrapper.eq(User::getAge, age);
    return userMapper.selectList(wrapper);
}
更新数据

更新单条数据

你可以通过Mapper接口的方法进行单条数据的更新。例如,更新一个用户的姓名。

public void updateUserById(Long id, String newName) {
    User user = new User();
    user.setId(id);
    user.setName(newName);
    userMapper.updateById(user);
}

更新多条数据

你可以通过Mapper接口的方法进行多条数据的更新。例如,更新所有用户的年龄。

public void updateAllUsersAge(Integer newAge) {
    LambdaUpdateWrapper<User> wrapper = new LambdaUpdateWrapper<>();
    wrapper.set(User::getAge, newAge);
    userMapper.update(null, wrapper);
}
删除数据

删除单条数据

你可以通过Mapper接口的方法进行单条数据的删除。例如,删除一个用户。

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

删除多条数据

你可以通过Mapper接口的方法进行多条数据的删除。例如,删除所有年龄小于18岁的用户。

public void deleteUsersByAge(Integer age) {
    LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
    wrapper.lt(User::getAge, age);
    userMapper.delete(wrapper);
}

通过以上步骤,你可以使用MyBatisPlus完成基本的CRUD操作。接下来,我们将介绍如何使用条件构造器和分页插件进行更复杂的查询和操作。

条件构造器与分页插件
使用条件构造器进行复杂查询

条件构造器是MyBatisPlus提供的一个强大功能,它允许开发人员构建复杂的查询条件,并以链式调用的方式进行组合。以下是几个示例,展示了如何使用条件构造器进行复杂查询。

查询多个条件的用户

假设你想查询年龄大于18岁且名字为"张三"的用户,可以使用条件构造器进行如下操作:

public List<User> getUsersByMultiConditions() {
    LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
    wrapper.gt(User::getAge, 18).eq(User::getName, "张三");
    return userMapper.selectList(wrapper);
}

排序查询

为了对查询结果进行排序,可以使用orderByAscorderByDesc方法。

public List<User> getUsersOrderByAgeAsc() {
    LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
    wrapper.orderByAsc(User::getAge);
    return userMapper.selectList(wrapper);
}

分页查询

分页查询是开发中常见的需求,MyBatisPlus提供了内置的分页插件来简化分页操作。

public List<User> getUsersByPage(int currentPage, int pageSize) {
    Page<User> page = new Page<>(currentPage, pageSize);
    LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
    wrapper.orderByDesc(User::getAge);
    userMapper.selectPage(page, wrapper);
    return page.getRecords();
}
分页插件的使用

MyBatisPlus提供了内置的分页插件,使用该插件可以简化分页操作。以下是一个使用分页插件的示例:

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {
    @Autowired
    private UserService userService;

    @GetMapping("/users/page")
    public Page<User> getUsersByPage(@RequestParam int currentPage, @RequestParam int pageSize) {
        Page<User> page = userService.getUsersByPage(currentPage, pageSize);
        return page;
    }
}

通过上述步骤,你可以使用条件构造器和分页插件进行复杂的查询和操作。接下来,我们将介绍如何使用自动填充和逻辑删除功能。

自动填充与逻辑删除
自动填充机制

自动填充是MyBatisPlus提供的一个特性,可以自动填充实体类中的某些字段。例如,你可以自动填充创建时间和更新时间。

创建实体类

首先,你需要在实体类中定义需要自动填充的字段,并使用注解标记这些字段。

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import java.time.LocalDateTime;

@TableName("user")
public class User {
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;

    // Getters and Setters
    public LocalDateTime getCreateTime() {
        return createTime;
    }
    public LocalDateTime getUpdateTime() {
        return updateTime;
    }
}

创建自定义填充策略

接下来,创建一个自定义的填充策略类,并实现MetaObjectHandler接口。

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;

@Component
public class CustomMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        metaObject.setValue("createTime", LocalDateTime.now());
        metaObject.setValue("updateTime", LocalDateTime.now());
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        metaObject.setValue("updateTime", LocalDateTime.now());
    }
}

测试自动填充

在添加数据时,自动填充的字段会自动设置为当前时间。

public void addUser(User user) {
    this.save(user);
}
逻辑删除使用方法

逻辑删除是另一种常见的操作,它允许你标记一个数据为"已删除",但不会从数据库中物理删除该记录。MyBatisPlus提供了支持逻辑删除的功能。

修改实体类

首先,你需要在实体类中定义一个逻辑删除字段,并使用@TableLogic注解标记这个字段。

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

@TableName("user")
public class User {
    @TableField(fill = FieldFill.INSERT)
    @TableLogic
    private Integer deleted;

    // Getters and Setters
    public Integer getDeleted() {
        return deleted;
    }
    public void setDeleted(Integer deleted) {
        this.deleted = deleted;
    }
}

修改Mapper接口

在Mapper接口中,定义逻辑删除的方法。

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserMapper extends BaseMapper<User> {
    void deleteById(Long id);
    void deleteByAge(Integer age);
}

调用逻辑删除方法

在Service中调用逻辑删除的方法。

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

测试逻辑删除

在添加或更新数据时,逻辑删除字段会自动设置为0或1,表示数据是否被逻辑删除。

public void addUser(User user) {
    this.save(user);
}

通过以上步骤,你可以使用自动填充和逻辑删除功能来简化开发过程。

MyBatisPlus的常用注解与配置
常用注解介绍

MyBatisPlus提供了一系列注解,用于简化实体类的定义和数据库操作。以下是几个常用的注解:

@TableId

@TableId注解用于指定实体类中的主键字段,并定义主键生成策略。

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

@TableName("user")
public class User {
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    private String name;
}

@TableField

@TableField注解用于指定实体类中的字段与数据库表中的字段的对应关系。你可以通过fill属性来设置自动填充策略。

import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import java.time.LocalDateTime;

@TableName("user")
public class User {
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
}

@TableLogic

@TableLogic注解用于表示一个逻辑删除字段,MyBatisPlus会自动管理这个字段的逻辑删除操作。

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

@TableName("user")
public class User {
    @TableField(fill = FieldFill.INSERT)
    @TableLogic
    private Integer deleted;
}

@TableName

@TableName注解用于指定实体类对应的数据库表名称。

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

@TableName("user")
public class User {
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    private String name;
}
配置文件设置

application.yml配置

在Spring Boot应用中,可以通过application.yml文件来配置MyBatisPlus的一些设置。

mybatis-plus:
  configuration:
    cache-enabled: false
    auto-mapping-unknown-columns: true
    use-column-label: true
  global-config:
    db-config:
      id-type: auto
      auto-always: false
      logic-delete-value: 1
      logic-not-delete-value: 0
    file-mapper: 
      before: true
    mapper:
      impl: com.baomidou.mybatisplus.mapper.CaseInsensitiveFieldImpl
  mapper:
    lazy-loading: true
  type-aliases-package: com.example.demo.entity
  mapper-locations: classpath*:mapper/*.xml

其他配置

你还可以通过Spring的配置类来配置MyBatisPlus的一些设置。

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.autoconfigure.MybatisPlusAutoConfiguration;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
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();
        // 分页插件配置
        PaginationInnerInterceptor paginationInterceptor = new PaginationInnerInterceptor(DbType.MYSQL);
        interceptor.addInnerInterceptor(paginationInterceptor);
        return interceptor;
    }

    @Bean
    public GlobalConfig globalConfig() {
        GlobalConfig config = new GlobalConfig();
        config.setDbConfig(new GlobalConfig.DbConfig()
                .setIdType(GlobalConfig.IdType.AUTO)
                .setLogicDeleteName("deleted")
                .setLogicDeleteValue(1)
                .setLogicNotDeleteValue(0)
        );
        return config;
    }
}
点击查看更多内容
TA 点赞

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

评论

作者其他优质文章

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

100积分直接送

付费专栏免费学

大额优惠券免费领

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

举报

0/150
提交
取消