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 或注解),例如 insertselectById 等基础操作都要写 SQL。 内置 BaseMapperIService 接口,继承后直接获得全套 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 层通过继承IServiceServiceImpl进一步简化业务代码:

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 小时前
Java使用easypoi填充数据到word
java·spring boot·spring cloud·java-ee·easypoi
weixin_419658317 小时前
MyBatis 进阶
mybatis
小蒜学长11 小时前
springboot基于BS的小区家政服务预约平台(代码+数据库+LW)
java·数据库·spring boot·后端
简色11 小时前
预约优化方案全链路优化实践
java·spring boot·后端·mysql·spring·rabbitmq
祈祷苍天赐我java之术13 小时前
Redis 热点数据与冷数据解析
java·redis·mybatis
低音钢琴15 小时前
【碎片化学习】SpringBoot中的自动配置(Auto Configuration)
spring boot·后端
C++chaofan16 小时前
Redisson分布式限流
java·jvm·spring boot·redis·分布式·mvc·redisson
疯癫的老码农16 小时前
【word解析】从OLE到OMML:公式格式转换的挑战与解决方案
java·spring boot·spring·word
元气满满的霄霄17 小时前
Spring Boot整合缓存——Redis缓存!超详细!
java·spring boot·redis·后端·缓存·intellij-idea