springboot3 mybatisplus 数据库操作入门与实战

MybatisPlus 项目

https://gitee.com/supervol/loong-springboot-study

(记得给个start,感谢)

MybatisPlus 概述

在 Spring Boot 3 环境中,MyBatis-Plus(简称 MP)作为 MyBatis 的增强工具,极大简化了数据库操作开发。它在保留 MyBatis 原生功能的基础上,提供了 CRUD 接口封装、条件构造、分页插件等实用特性,同时完美适配 Spring Boot 3 的特性(如 Jakarta EE 规范、Java 17 + 支持)。

MybatisPlus 核心

  1. 无侵入性:完全兼容 MyBatis,无需修改现有 MyBatis 代码即可平滑迁移。
  2. CRUD 自动化:内置通用 Mapper/Service 接口,无需手写基础 SQL。
  3. 丰富特性:提供条件构造器、分页插件、逻辑删除、乐观锁等功能。
  4. 高效开发:支持代码生成器,自动生成实体类、Mapper、Service 等代码。

MybatisPlus 对比

1. 核心定位

  • Mybatis:一款轻量级的持久层框架,专注于 SQL 映射(将 Java 方法与 SQL 语句关联),通过 XML 或注解方式配置 SQL,保留了原生 SQL 的灵活性,但基础 CRUD 操作需要手动编写 SQL。

  • MybatisPlus :基于 MyBatis 的增强工具,完全兼容 Mybatis ,核心目标是简化开发。它在 Mybatis 基础上封装了通用 CRUD 接口、条件构造器等功能,减少重复代码,同时不丢失 Mybatis 的原生能力。

2. 差异对比

对比维度 Mybatis MybatisPlus
CRUD 操作 需手动编写 SQL(XML 或注解),例如 insert、selectById 等基础操作都要写 SQL。 内置 BaseMapper 和 IService 接口,继承后直接获得全套 CRUD 方法,无需手写 SQL。
SQL 编写方式 依赖 XML 或 @Select 等注解编写 SQL,动态 SQL 需用 <if> <where> 等标签。 提供 条件构造器 (QueryWrapper/LambdaQueryWrapper),通过 Java 代码动态构建条件,减少 XML 配置;同时兼容 Mybatis 的 SQL 编写方式。
功能特性 仅提供基础 SQL 映射能力,无内置高级特性(如分页、逻辑删除等),需手动实现或集成第三方插件。 内置丰富特性:- 分页插件(无需手动写 LIMIT)- 逻辑删除(自动将删除转为更新)- 乐观锁(解决并发更新冲突)- 代码生成器(自动生成实体类、Mapper 等)- 枚举映射、字段填充等。
开发效率 基础操作代码重复度高,需手动维护 SQL 与 Java 方法的映射,开发效率较低。 省去 90% 以上的基础 SQL 编写工作,复杂查询可通过条件构造器快速实现,开发效率显著提升。
学习成本 需掌握 XML 配置、动态 SQL 标签、参数绑定等,初期学习成本略高。 完全兼容 Mybatis,学会 Mybatis 后可快速上手;新增特性(如条件构造器)简单直观,学习成本低。
兼容性 无依赖,独立使用。 完全依赖 Mybatis,可无缝集成到现有 Mybatis 项目中,无需修改原有代码。

3. 适用场景

  • 优先选 Mybatis :当项目需要高度定制 SQL(如复杂多表联查、存储过程调用),且团队更习惯直接编写原生 SQL 时,MyBatis 的灵活性更有优势。

  • 优先选 MybatisPlus:大部分业务场景(尤其是 CRUD 操作频繁的项目),MybatisPlus 能极大减少重复劳动,提升开发效率;同时复杂 SQL 仍可通过 XML 或注解编写,兼顾灵活性。

MybatisPlus 示例

请参考项目地址中 springboot-orm/springboot-mybatisplus 模块代码。

MybatisPlus 集成

1. 依赖配置

Spring Boot 3 使用 Jakarta EE 规范,需选择支持 Spring Boot 3 的 MyBatis-Plus 版本(建议 3.5.3.1 及以上):

XML 复制代码
<!-- Spring Boot 3父工程 -->
<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>3.2.0</version>
    <relativePath/>
</parent>

<!-- MyBatis-Plus Starter(自动集成MyBatis和Spring Boot 3适配) -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.5</version>
</dependency>

<!-- 数据库驱动(以MySQL为例) -->
<dependency>
    <groupId>com.mysql</groupId>
    <artifactId>mysql-connector-j</artifactId>
    <scope>runtime</scope>
</dependency>

<!-- 数据源(HikariCP,Spring Boot 3默认) -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>

2. 配置文件

配置数据源和 MyBatis-Plus 基础参数:

复制代码
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/test_db?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
    username: root
    password: 123456
    driver-class-name: com.mysql.cj.jdbc.Driver

mybatis-plus:
  # 实体类包路径(可选,用于类型别名)
  type-aliases-package: com.example.entity
  # XML映射文件路径(若使用XML编写SQL)
  mapper-locations: classpath:mapper/*.xml
  configuration:
    # 日志打印SQL(开发环境启用)
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    # 下划线转驼峰(自动匹配数据库字段与实体类属性)
    map-underscore-to-camel-case: true

3. 启动类配置

通过@MapperScan指定 Mapper 接口扫描路径:

复制代码
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("com.example.mapper") // 扫描Mapper接口所在包
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

MybatisPlus 功能

1. 实体类定义

使用 MybatisPlus 注解映射数据库表:

java 复制代码
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

@Data // Lombok简化get/set
@TableName("user") // 映射数据库表名(默认与类名一致,可省略)
public class User {
    @TableId(type = IdType.AUTO) // 主键自增
    private Long id;
    private String username; // 数据库字段若为user_name,会自动通过驼峰转换匹配
    private Integer age;
    private String email;
}

2. Mapper 接口

无需编写 XML,直接继承BaseMapper获得 CRUD 能力:

java 复制代码
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.entity.User;

public interface UserMapper extends BaseMapper<User> {
    // 继承后自动拥有:insert、deleteById、updateById、selectById、selectList等方法
}

3. Service 层

Service 层通过继承IService和ServiceImpl进一步简化业务代码:

java 复制代码
// Service接口
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.entity.User;

public interface UserService extends IService<User> {
    // 继承后拥有更丰富的方法:saveOrUpdate、list、page、count等
}

// Service实现类
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.entity.User;
import com.example.mapper.UserMapper;
import com.example.service.UserService;
import org.springframework.stereotype.Service;

@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    // 无需额外代码,直接使用父类方法
}

4. 条件构造器

通过QueryWrapper/LambdaQueryWrapper动态构建查询条件,替代手动拼接 SQL:

java 复制代码
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.example.entity.User;
import com.example.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

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

    @GetMapping("/users")
    public List<User> getUsers() {
        // 示例:查询年龄>18且邮箱不为空的用户,按年龄降序排序
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.gt(User::getAge, 18) // 年龄>18
                   .isNotNull(User::getEmail) // 邮箱不为空
                   .orderByDesc(User::getAge); // 按年龄降序

        return userService.list(queryWrapper);
    }
}

5. 分页查询

配置分页插件后,可轻松实现分页功能:

java 复制代码
// 配置分页插件(Spring Boot 3配置类)
import com.baomidou.mybatisplus.annotation.DbType;
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();
        // 添加分页插件(指定数据库类型,如MySQL)
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

// 分页查询示例
@GetMapping("/users/page")
public IPage<User> getUsersByPage() {
    // 第1页,每页10条数据
    Page<User> page = new Page<>(1, 10);
    // 条件:年龄<30
    LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
    queryWrapper.lt(User::getAge, 30);
    
    return userService.page(page, queryWrapper);
}

6. 高级特性

  • 逻辑删除 :通过注解标记逻辑删除字段(如deleted),删除操作自动转为更新:

    java 复制代码
    @TableLogic // 逻辑删除注解(0-未删除,1-已删除)
    private Integer deleted;
  • 乐观锁:解决并发更新冲突,通过版本号字段实现:

    java 复制代码
    @Version // 乐观锁注解
    private Integer version;

    需在分页插件中添加乐观锁插件:

    java 复制代码
    interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
  • 代码生成器 :通过 AutoGenerator 自动生成实体类、Mapper、Service 等代码(需引入mybatis-plus-generator依赖)。

MybatisPlus 注意

  1. 版本兼容性:Spring Boot 3 需使用 MyBatis-Plus 3.5.3.1 及以上版本,避免依赖冲突。
  2. 日志配置 :通过mybatis-plus.configuration.log-impl开启 SQL 日志,方便调试。
  3. 自定义 SQL :复杂查询可通过 XML 或@Select注解编写,MyBatis-Plus 完全兼容。

MybatisPlus 总结

MyBatis-Plus 在 Spring Boot 3 环境中,通过简化 CRUD 操作、提供灵活的条件构造和分页功能,显著提升了数据库开发效率。其无侵入性设计让开发者既能享受便捷,又能保留 MyBatis 的原生能力,是 Spring Boot 项目中数据库层的优选方案。

相关推荐
bksczm15 小时前
Redis数据结构之string
java·redis·mybatis
9527!到!17 小时前
Springboot @value读取配置参数踩坑&推荐解决方案
java·spring boot·spring
十年Java程序媛17 小时前
Java 面试常问 this、super:构造方法调用顺序避坑
java·开发语言·spring boot·面试·个人开发
小蒜学长20 小时前
基于SpingBoot+Vue的定向越野赛事管理系统的设计与开发(代码+数据库+LW)
java·前端·spring boot·后端·前后端分离·定向越野赛事
RuoyiOffice20 小时前
项目预算和交付日期变了,为什么不能直接改台账?
spring boot·项目管理·vue3·flowable·业务建模·ruoyi office·项目变更
小蒜学长20 小时前
基于过程性评价的ai助学平台(代码+数据库+LW)
java·spring boot·后端·微信小程序·过程性评价
博风21 小时前
使用Spring官网下载Springboot骨架
java·spring boot·spring
木井巳1 天前
【JavaEE】SpringBoot 统一功能处理: 拦截器、统一返回与全局异常
java·spring boot·后端·spring·java-ee
Thomas.Sir1 天前
第6课:SpringBoot4.x 核心注解全解:Component、Bean、Scope、Lazy等IOC相关注解
java·spring boot
paopaokaka_luck1 天前
美食推荐系统(协同过滤算法推荐、AI助手、HanLP中文分词、 ECharts可视化分析、菜谱学习与话题交流)
java·spring boot·mysql·tomcat·echarts