手记

MybatisPlus入门教程:快速掌握数据库操作

概述

本文将带你快速掌握Mybatisplus入门,涵盖MybatisPlus的基本概念、环境搭建、基础操作及常用功能,帮助你更高效地进行数据库操作。

MybatisPlus简介

MybatisPlus是什么

MybatisPlus 是一个 Mybatis 的增强工具,它在 Mybatis 的基础上提供了简化操作的扩展。通过 MybatisPlus,可以方便地使用 Java 代码进行数据库操作。它提供了许多便捷的功能,如分页查询、条件构造器、动态 SQL 生成等。

MybatisPlus的主要特点和优势

  1. 无侵入:基于 Mybatis 实现,无任何第三方依赖。
  2. CRUD增强:在不改变接口和方法的前提下,实现了对数据库操作的简化。
  3. 分页插件:基于 Mybatis 的分页插件,支持多种数据库的分页实现。
  4. 代码生成器:可以自动生成数据库表的实体类、Mapper 接口等。
  5. 性能优化:内置的性能优化,如逻辑删除、缓存等。
  6. 动态 SQL:支持根据条件动态生成 SQL 语句。
  7. 条件构造器:提供了强大的条件构造器,简化查询操作。

MybatisPlus与Mybatis的区别

MybatisPlus 是在 Mybatis 的基础上进行的封装和增强,相较于 Mybatis,MybatisPlus 的主要区别在于:

  • CRUD操作简化:MybatisPlus 提供了对 CRUD 操作的简化,可以通过注解或方法实现快速的数据库操作。
  • 分页插件:MybatisPlus 内置了分页插件,可以方便地实现分页查询。
  • 代码生成器:MybatisPlus 提供了代码生成工具,可以自动生成实体类、Mapper 接口等。
  • 动态 SQL:MybatisPlus 支持动态生成 SQL 语句,简化了复杂的查询操作。
MybatisPlus环境搭建

准备开发环境

在开始使用 MybatisPlus 之前,需要准备一个 Java 开发环境。具体步骤如下:

  1. 下载并安装 JDK。
  2. 下载并安装 IDE(例如 IntelliJ IDEA 或 Eclipse)。
  3. 创建一个新的 Maven 项目。
  4. 配置 Maven 仓库。

引入MybatisPlus依赖

在项目中添加 MybatisPlus 的依赖。在 pom.xml 文件中添加以下依赖:

<dependencies>
    <!-- MybatisPlus 的依赖 -->
    <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 依赖 -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
        <version>2.5.6</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.5.6</version>
    </dependency>
</dependencies>

配置MybatisPlus相关参数

application.yml 文件中配置数据库连接信息和 MybatisPlus 相关设置:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mybatisplus?useUnicode=true&characterEncoding=utf-8&useSSL=false
    username: root
    password: root
    driver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:
    mapper-locations: classpath*:mapper/*.xml
    type-aliases-package: com.baomidou.mybatisplus.samples.quickstart.entity
MybatisPlus基础操作

新增数据

使用 MybatisPlus,可以通过 save 方法将实体对象插入到数据库中。

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.core.conditions.wrapped.Wraps;
import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments;

import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.extension.service.impl.BaseServiceImpl;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

import org.springframework.stereotype.Service;

public class UserService extends ServiceImpl<UserMapper, User> {

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

查询数据

MybatisPlus 提供了 selectByIdselectListselectMaps 等方法进行查询。

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.core.conditions.wrapped.Wraps;
import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments;

import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.extension.service.impl.BaseServiceImpl;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

import org.springframework.stereotype.Service;

public class UserService extends ServiceImpl<UserMapper, User> {

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

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

更新数据

使用 update 方法可以更新数据库中的数据。

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.core.conditions.wrapped.Wraps;
import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments;

import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.extension.service.impl.BaseServiceImpl;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

import org.springframework.stereotype.Service;

public class UserService extends ServiceImpl<UserMapper, User> {

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

    public boolean updateUserById(Long id, String newName) {
        UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("id", id);
        updateWrapper.set("name", newName);
        return this.update(updateWrapper);
    }
}

删除数据

使用 removeById 方法可以删除数据库中的数据。

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.core.conditions.wrapped.Wraps;
import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments;

import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.extension.service.impl.BaseServiceImpl;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

import org.springframework.stereotype.Service;

public class UserService extends ServiceImpl<UserMapper, User> {

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

    public boolean deleteUserByName(String name) {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("name", name);
        return this.remove(queryWrapper);
    }
}
MybatisPlus常用功能介绍

分页插件使用

MybatisPlus 提供了内置的分页插件 PageLimit,可以通过以下方式使用分页查询。

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.core.conditions.wrapped.Wraps;
import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments;

import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.extension.service.impl.BaseServiceImpl;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

import org.springframework.stereotype.Service;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

public class UserService extends ServiceImpl<UserMapper, User> {

    public Page<User> getUsersPage(Integer pageNum, Integer pageSize) {
        Page<User> page = new Page<>(pageNum, pageSize);
        return this.page(page, new QueryWrapper<>());
    }
}

条件构造器使用

MybatisPlus 提供了强大的条件构造器 QueryWrapperUpdateWrapper,可以方便地构建复杂的查询条件。

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.core.conditions.wrapped.Wraps;
import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments;

import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.extension.service.impl.BaseServiceImpl;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

import org.springframework.stereotype.Service;

public class UserService extends ServiceImpl<UserMapper, User> {

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

自动填充和逻辑删除

MybatisPlus 提供了自动填充和逻辑删除的功能,可以方便地实现字段的自动填充和逻辑删除。

自动填充

通过实现 MetaObjectHandler 接口,可以实现对实体类字段的自动填充。

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.baomidou.mybatisplus.core.toolkit.MetaObjectUtils;

import java.util.Date;

public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        MetaObjectUtils.setFieldValByName("createTime", new Date(), metaObject);
        MetaObjectUtils.setFieldValByName("updateTime", new Date(), metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        MetaObjectUtils.setFieldValByName("updateTime", new Date(), metaObject);
    }
}

逻辑删除

通过 @TableLogic 注解和配置,可以实现逻辑删除。

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

public class User {

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

    private String name;

    private Integer age;

    @TableLogic
    private Integer deleted;
}

批量操作

MybatisPlus 支持批量操作,可以通过批量插入、批量更新和批量删除来提高操作效率。

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.core.conditions.wrapped.Wraps;
import com.baomidou.mybatisplus.core.conditions.segments.MergeSegments;

import com.baomidou.mybatisplus.extension.service.IService;
import com.baomidou.mybatisplus.extension.service.impl.BaseServiceImpl;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;

import org.springframework.stereotype.Service;

import java.util.List;

public class UserService extends ServiceImpl<UserMapper, User> {

    public boolean saveBatch(List<User> users) {
        return this.saveBatch(users);
    }

    public boolean updateBatch(List<User> users) {
        return this.updateBatchById(users);
    }

    public boolean removeBatch(List<User> users) {
        return this.removeByIds(users.stream().map(User::getId).collect(Collectors.toList()));
    }
}
MybatisPlus高级特性

动态SQL生成

MybatisPlus 支持动态生成 SQL 语句,通过 SqlInjector 接口可以实现自定义 SQL 生成规则。

import com.baomidou.mybatisplus.core.injector.AbstractMethod;
import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
import com.baomidou.mybatisplus.core.listener.SqlSessionListener;
import com.baomidou.mybatisplus.core.toolkit.ReflectionKit;
import com.baomidou.mybatisplus.core.toolkit.StringPool;
import com.baomidou.mybatisplus.core.toolkit.TableUtils;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.core.toolkit.PluginUtils;

import java.util.List;

public class MySqlInjector extends DefaultSqlInjector {

    @Override
    public List<AbstractMethod> getMethodList(Class<?> mapperClass) {
        List<AbstractMethod> methodList = super.getMethodList(mapperClass);
        // 自定义 SQL 生成逻辑
        return methodList;
    }
}

自动填充与逻辑删除的详细使用

通过 MetaObjectHandler@TableLogic 注解可以实现自动填充和逻辑删除。

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import com.baomidou.mybatisplus.core.toolkit.MetaObjectUtils;

import java.util.Date;

public class MyMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        MetaObjectUtils.setFieldValByName("createTime", new Date(), metaObject);
        MetaObjectUtils.setFieldValByName("updateTime", new Date(), metaObject);
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        MetaObjectUtils.setFieldValByName("updateTime", new Date(), metaObject);
    }
}
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;

public class User {

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

    private String name;

    private Integer age;

    @TableLogic
    private Integer deleted;
}

性能优化和日志打印

MybatisPlus 提供了多种性能优化和日志打印功能,如缓存、分页插件等。

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
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 PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        paginationInterceptor.setLimit(100); // 限制每页最多显示 100 条数据
        return paginationInterceptor;
    }
}

通过以上配置,可以实现数据库操作的性能优化和日志打印。

总结

通过本教程,我们学习了 MybatisPlus 的基本概念、环境搭建、基础操作、常用功能和高级特性。MybatisPlus 是一个强大的工具,可以帮助我们更高效地进行数据库操作。希望读者在实际项目中能够灵活运用 MybatisPlus 的各项功能,提高开发效率。

0人推荐
随时随地看视频
慕课网APP