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 项目中数据库层的优选方案。

相关推荐
卓怡学长5 分钟前
w192基于springboot“考研情报站”微信小程序设计与实现
java·spring boot·spring·微信小程序·intellij-idea
ym hyd 1114 小时前
宝宝早教服务系统源码 Java+SpringBoot+Vue3 前后分离
java·开发语言·spring boot
FYKJ_20105 小时前
SSM校园互助与闲置交易平台62145-计算机课程设计、毕业设计
java·spring boot·python·mysql·架构·spark·课程设计
卓怡学长5 小时前
w193基于springboot“乐通黄骅”电动车智能充电服务小程序
java·spring boot·spring·小程序·intellij-idea
shuoshuohaohao14 小时前
MyBatis 小知识点
java·spring·mybatis
苏supper18 小时前
Spring Boot多环境配置与打包运行
spring boot·后端·spring
天衍四九-19 小时前
【无标题】
前端·spring boot·mysql·nginx·docker
今年下半年21 小时前
【Spring Boot】多种存储文件(FastDFS / MinIO / 阿里云 OSS)接入设计说明(附源码)
spring boot·分布式·中间件·简单工厂模式·策略模式
光依旧1 天前
MCP实战手记(八):从“能跑“到“能上线“——无状态MCP Server的生产落地清单
java·人工智能·spring boot·架构·ai agent·mcp
MZ_ZXD0011 天前
【关注可白嫖源码】--课程设计--毕业设计-- 29210 Vue.js 3+Springboot中药材基本信息与图片查询系统
javascript·spring boot·课程设计·毕设·大作业·程序开发·毕设代做