当前位置: 首页 > news >正文

在 Spring Boot 中使用 MyBatis-Plus 的详细教程

前言

在现代的 Java Web 开发中,Spring Boot 和 MyBatis 已经成为主流框架组合。为了提升开发效率和简化数据库操作,MyBatis-Plus(简称 MP)应运而生。它是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

本文将详细介绍如何在 Spring Boot 项目中集成并使用 MyBatis-Plus,包括:

  • 环境搭建
  • 基本 CRUD 操作
  • 使用 Wrapper 构造查询条件
  • 注解的使用(如 @TableName@TableId@TableField
  • 分页插件配置
  • 多表关联查询示例

一、环境准备

1. 创建 Spring Boot 项目

你可以使用 Spring Initializr 创建一个基础项目,选择以下依赖:

  • Spring Web
  • MyBatis Framework
  • MySQL Driver

或者使用 IDEA 或 Eclipse 插件创建。

2. 添加 MyBatis-Plus 依赖

pom.xml 文件中添加 MyBatis-Plus 的 Starter 依赖:

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.1</version>
</dependency>

如果你需要使用代码生成器,也可以加上:

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.1</version>
</dependency>

3. 配置数据库连接

application.yml 中配置数据源:

spring:datasource:url: jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC&characterEncoding=utf8username: rootpassword: your_passworddriver-class-name: com.mysql.cj.jdbc.Drivermybatis-plus:mapper-locations: classpath*:mapper/**/*.xmltype-aliases-package: com.example.entity

二、实体类与注解

1. 表结构示例

假设我们有一个用户表 user

CREATE TABLE user (id BIGINT PRIMARY KEY AUTO_INCREMENT,name VARCHAR(50),age INT,email VARCHAR(100)
);

2. 实体类定义

package com.example.entity;import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;@Data
@TableName("user") // 映射到 user 表
public class User {@TableId(value = "id", type = IdType.AUTO) // 主键映射private Long id;@TableField("name") // 字段映射,默认自动识别驼峰命名转下划线private String name;@TableField("age")private Integer age;@TableField("email")private String email;
}

说明:

  • @TableName: 映射实体类与数据库表名。
  • @TableId: 标识主键字段,可指定数据库列名。
  • @TableField: 映射普通字段,若不写则默认按字段名转换成下划线匹配数据库列。
  • IdType.AUTO: 自动识别主键类型(自增、UUID 等),也可手动设置如 IdType.NONE, IdType.INPUT 等。

三、Mapper 接口与 Service 层

1. Mapper 接口

package com.example.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.entity.User;public interface UserMapper extends BaseMapper<User> {
}

继承 BaseMapper 后即可获得基本的 CRUD 方法。

2. Service 层接口与实现

package com.example.service;import com.baomidou.mybatisplus.extension.service.IService;
import com.example.entity.User;public interface UserService extends IService<User> {
}
package com.example.service.impl;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 {
}

四、Wrapper 查询构造器详解

MyBatis-Plus 提供了强大的查询构造器 QueryWrapperUpdateWrapper,可以链式构建 SQL 条件。

示例:使用 QueryWrapper 查询用户

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import java.util.List;public List<User> getUsersByNameAndAge(String name, int minAge) {return userMapper.selectList(new QueryWrapper<User>().like("name", name) // LIKE '%name%'.ge("age", minAge)); // age >= minAge
}

更多常用方法:

方法说明
eq(column, value)等于
ne(column, value)不等于
gt(column, value)大于
ge(column, value)大于等于
lt(column, value)小于
le(column, value)小于等于
like(column, value)LIKE
in(column, collection)IN 查询
between(column, val1, val2)BETWEEN 查询
orderByAsc(column) / orderByDesc(column)排序

LambdaQueryWrapper(推荐)

避免字符串硬编码错误,推荐使用 LambdaQueryWrapper

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;List<User> users = userMapper.selectList(new LambdaQueryWrapper<User>().like(User::getName, "Tom").ge(User::getAge, 18));

五、分页插件配置

1. 配置分页插件

在配置类中启用分页功能:

package com.example.config;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 {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor());return interceptor;}
}

2. 使用分页查询

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;public Page<User> getUsersByPage(int pageNum, int pageSize) {return userMapper.selectPage(new Page<>(pageNum, pageSize), null);
}

你也可以结合 Wrapper:

Page<User> page = userMapper.selectPage(new Page<>(1, 10),new LambdaQueryWrapper<User>().ge(User::getAge, 20)
);

六、多表关联查询(以一对一为例)

1. 新建 Address 表及实体类

CREATE TABLE address (id BIGINT PRIMARY KEY AUTO_INCREMENT,user_id BIGINT,detail VARCHAR(200)
);
package com.example.entity;import com.baomidou.mybatisplus.annotation.*;@Data
@TableName("address")
public class Address {@TableId(type = IdType.AUTO)private Long id;private Long userId;private String detail;
}

2. 修改 User 类(增加关联字段)

package com.example.entity;import lombok.Data;@Data
public class UserVO extends User {private Address address;
}

3. 自定义 SQL 查询(XML 方式)

<!-- UserMapper.xml -->
<select id="selectUserWithAddress" resultType="com.example.entity.UserVO">SELECT u.*, a.detail AS address_detailFROM user uLEFT JOIN address a ON u.id = a.user_idWHERE u.id = #{id}
</select>

4. Mapper 接口中声明方法

UserVO selectUserWithAddress(Long id);

七、总结

通过本文,你应该已经掌握了:

  • 如何在 Spring Boot 中集成 MyBatis-Plus;
  • 使用 @TableName@TableId@TableField 注解进行 ORM 映射;
  • 使用 Wrapper 构建灵活查询条件;
  • 使用分页插件进行分页;
  • 多表关联查询的基本方式。

MyBatis-Plus 是一个非常实用的 MyBatis 扩展库,能够显著提升开发效率,建议结合官方文档进一步深入学习其高级特性,例如自动填充、乐观锁、逻辑删除、多租户等。


参考资料

  • MyBatis-Plus 官方文档
  • Spring Boot 官方文档

文章转载自:
http://cabriolet.zzgtdz.cn
http://chlamydia.zzgtdz.cn
http://adhibition.zzgtdz.cn
http://banana.zzgtdz.cn
http://butylene.zzgtdz.cn
http://ardency.zzgtdz.cn
http://burrow.zzgtdz.cn
http://catenation.zzgtdz.cn
http://aglimmer.zzgtdz.cn
http://announcing.zzgtdz.cn
http://beadroll.zzgtdz.cn
http://biovular.zzgtdz.cn
http://chenag.zzgtdz.cn
http://besotted.zzgtdz.cn
http://cephalin.zzgtdz.cn
http://adjourn.zzgtdz.cn
http://beadswoman.zzgtdz.cn
http://buffet.zzgtdz.cn
http://ballistocardiogram.zzgtdz.cn
http://autostoper.zzgtdz.cn
http://arfvedsonite.zzgtdz.cn
http://catholic.zzgtdz.cn
http://aeciostage.zzgtdz.cn
http://autotroph.zzgtdz.cn
http://cebu.zzgtdz.cn
http://aluminography.zzgtdz.cn
http://acrodynia.zzgtdz.cn
http://aftermarket.zzgtdz.cn
http://attune.zzgtdz.cn
http://blueing.zzgtdz.cn
http://www.dtcms.com/a/262137.html

相关文章:

  • 实战篇----利用 LangChain 和 BERT 用于命名实体识别-----完整代码
  • Java爬虫实战指南:按关键字搜索京东商品
  • rabbitmq springboot 有哪些配置参数
  • Leetcode 3482. 分析组织层级
  • 状态模式 - Flutter中的状态变身术,让对象随“状态“自由切换行为!
  • 对于“随机种子”的作用的理解
  • 71. 简化路径 —day94
  • 【网络】:DNS协议、ICMP协议、NAT技术
  • Cursor1.1.6安装c++插件
  • .netcore 一个mvc到静态html实现
  • 【数据分析】Python+Tushare实现均线金叉死叉交易策略回测
  • 黑马JVM解析笔记(六):深入理解JVM类加载机制与运行时优化
  • 【JS-6.2-模板字符串】ES6 模板字符串:现代JavaScript的字符串处理利器
  • 可达性分析算法Test
  • 如何将Excel表的内容转化为json格式呢?
  • 深入理解Mysql索引底层数据结构和算法
  • InnoDB的redo日志涉及文件及结构
  • 嵌入式硬件中电容的基本原理与详解
  • WPF学习笔记(13)列表框控件ListBox与数据模板
  • Spring Boot项目开发实战销售管理系统——数据库设计!
  • 大模型在恶性心律失常预测及治疗方案制定中的应用研究
  • 计算机网络基础知识详解
  • 筑牢网络安全屏障
  • RabbitMQ 集群与高可用配置
  • 【安全有效新方案】WSL 默认路径迁移实战:通过 PowerShell 符号链接实现自动重定向
  • 【大语言模型入门】—— 浅析LLM基座—Transformer原理
  • 面试八股---HTML
  • 【51单片机节日彩灯控制器设计】2022-6-11
  • Linux的基础IO
  • Segment Anything in High Quality之SAM-HQ论文阅读