MyBatis-Plus 通用 CRUD 操作

MyBatis-Plus 是在 MyBatis 的基础上开发的增强工具,旨在简化 MyBatis 的使用,提升开发效率。它为开发者提供了许多开箱即用的功能,尤其是通用 CRUD 操作,极大地减少了开发中常见的 CRUD 代码编写工作。MyBatis-Plus 通过提供一系列基于注解和模板的通用方法,简化了数据库操作。

一、MyBatis-Plus 的优势

  1. 开箱即用的 CRUD 功能:MyBatis-Plus 提供了通用的 CRUD 方法,开发者无需手动编写常见的增删改查 SQL。
  2. 丰富的分页功能:内置分页插件,支持数据库级别的分页查询,性能优越。
  3. 多种插件支持:提供各种插件支持,如分页、性能分析、乐观锁等,开发者可以根据需要进行扩展。
  4. 自动代码生成器:可以根据数据库表结构自动生成实体类、Mapper 接口、Service 和 Controller 层代码,大大提高开发效率。

二、集成 MyBatis-Plus

1. 引入依赖

pom.xml 文件中引入 MyBatis-Plus 的依赖:

<dependencies><!-- MyBatis-Plus Starter for Spring Boot --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.1</version></dependency><!-- MySQL 数据库驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency>
</dependencies>
2. 配置数据库连接

application.yml 文件中配置数据库连接信息:

spring:datasource:url: jdbc:mysql://localhost:3306/mydatabase?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTCusername: rootpassword: yourpassworddriver-class-name: com.mysql.cj.jdbc.Driver
3. 启动类配置

在 Spring Boot 的启动类中,需要添加 @MapperScan 注解,指定 Mapper 接口所在的包。

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@MapperScan("com.example.demo.mapper") // 扫描 Mapper 接口
public class MyBatisPlusDemoApplication {public static void main(String[] args) {SpringApplication.run(MyBatisPlusDemoApplication.class, args);}
}

三、实体类定义

首先,我们需要定义实体类,它对应数据库中的表结构。MyBatis-Plus 提供了自动生成主键的注解 @TableId,并且支持多种主键生成策略。

package com.example.demo.model;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;@Data
@TableName("users") // 对应数据库中的表名
public class User {@TableId(type = IdType.AUTO) // 主键自增private Long id;private String name;private String email;
}
  • @TableName:指定实体类对应的数据库表名。
  • @TableId:指定主键,type = IdType.AUTO 表示主键自增。

四、Mapper 接口

MyBatis-Plus 提供了通用的 BaseMapper<T> 接口,用户只需继承 BaseMapper,就可以自动拥有常见的 CRUD 操作,无需再手动编写 SQL。

package com.example.demo.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.model.User;
import org.apache.ibatis.annotations.Mapper;@Mapper
public interface UserMapper extends BaseMapper<User> {// 这里不需要定义方法,BaseMapper 已经提供了常用的 CRUD 操作
}

BaseMapper<T> 中内置了大量的 CRUD 方法,开发者无需再重复编写增删改查的 SQL。

五、Service 层

为了进一步分离业务逻辑,我们可以在 Service 层使用 Mapper 进行数据库操作。通过继承 MyBatis-Plus 提供的 IService<T> 接口,我们可以轻松地获得常见的 CRUD 功能。

Service 接口:
package com.example.demo.service;import com.baomidou.mybatisplus.extension.service.IService;
import com.example.demo.model.User;public interface UserService extends IService<User> {
}
Service 实现类:
package com.example.demo.service.impl;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.mapper.UserMapper;
import com.example.demo.model.User;
import com.example.demo.service.UserService;
import org.springframework.stereotype.Service;@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {// 这里无需编写额外代码,通用 CRUD 功能已经由 ServiceImpl 提供
}

通过继承 ServiceImpl,我们可以快速获得 CRUD 的操作,无需手动实现。

六、Controller 层

在控制器中,可以调用 Service 层的方法来处理 HTTP 请求。例如,我们可以实现用户的增删改查操作。

package com.example.demo.controller;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.demo.model.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;@RestController
@RequestMapping("/users")
public class UserController {@Autowiredprivate UserService userService;// 查询所有用户@GetMappingpublic List<User> getAllUsers() {return userService.list();}// 根据 ID 查询用户@GetMapping("/{id}")public User getUserById(@PathVariable Long id) {return userService.getById(id);}// 添加新用户@PostMappingpublic String addUser(@RequestBody User user) {userService.save(user);return "用户添加成功";}// 更新用户@PutMapping("/{id}")public String updateUser(@PathVariable Long id, @RequestBody User user) {user.setId(id);userService.updateById(user);return "用户更新成功";}// 删除用户@DeleteMapping("/{id}")public String deleteUser(@PathVariable Long id) {userService.removeById(id);return "用户删除成功";}
}

七、通用 CRUD 方法

MyBatis-Plus 内置了一系列通用 CRUD 方法,这些方法被 BaseMapperIService 提供。以下是常用的 CRUD 方法:

1. BaseMapper 通用方法
  • int insert(T entity):插入一条记录。
  • int deleteById(Serializable id):根据 ID 删除记录。
  • int updateById(T entity):根据 ID 更新记录。
  • T selectById(Serializable id):根据 ID 查询记录。
  • List<T> selectList(Wrapper<T> queryWrapper):查询所有记录。
2. IService 通用方法
  • boolean save(T entity):保存或新增记录。
  • boolean saveOrUpdate(T entity):保存或更新记录。
  • boolean removeById(Serializable id):根据 ID 删除记录。
  • T getById(Serializable id):根据 ID 查询记录。
  • List<T> list():查询所有记录。
  • boolean updateById(T entity):根据 ID 更新记录。

八、条件构造器

MyBatis-Plus 提供了强大的 条件构造器,可以通过 QueryWrapperUpdateWrapper 灵活地构建查询条件,避免手动拼接 SQL 语句。

示例:根据条件查询
@GetMapping("/search")
public List<User> searchUsers(@RequestParam String name, @RequestParam String email) {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.like("name", name).eq("email", email);return userService.list(queryWrapper);
}
示例:根据条件更新
@PutMapping("/update")
public String updateUserByCondition(@RequestBody User user) {UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();updateWrapper.eq("email", user.getEmail());userService.update(user, updateWrapper);return "用户更新成功";
}

通过条件构造器,MyBatis-Plus 提供了链式操作来实现复杂的条件查询和更新,大大简化了 SQL 拼接的工作。

九、分页查询

MyBatis-Plus 通过分页插件支持数据库级别的分页查询,开发者无需再手动编写分页逻辑。

添加分页插件

首先,在 Spring Boot 配置类中添加分页插件:

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.springframework.context.annotation.Bean;
importorg.springframework.context.annotation.Configuration;@Configuration
public class MyBatisPlusConfig {@Beanpublic PaginationInterceptor paginationInterceptor() {return new PaginationInterceptor();}
}
使用分页查询
@GetMapping("/page")
public IPage<User> getUserPage(@RequestParam int pageNo, @RequestParam int pageSize) {Page<User> page = new Page<>(pageNo, pageSize);return userService.page(page);
}

MyBatis-Plus 自动处理分页参数,并返回分页结果。

十、总结

MyBatis-Plus 极大地简化了 MyBatis 的使用,通过提供通用 CRUD 方法、分页插件、条件构造器等功能,大大减少了样板代码的编写。在实际开发中,MyBatis-Plus 提供了高效的开发体验,适合在多种场景下快速实现数据库操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/147619.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

NLP 文本分类任务核心梳理

解决思路 分解为多个独立二分类任务将多标签分类转化为多分类问题更换 loss 直接由模型进行多标签分类 数据稀疏问题 标注更多数据&#xff0c;核心解决方案&#xff1a; 自己构造训练样本 数据增强&#xff0c;如使用 chatGPT 来构造数据更换模型 减少数据需求增加规则弥补…

《2024中国AI大模型产业图谱2.0版》重磅发布

‍ 数据猿出品 本次“数据猿2024年度三大媒体策划活动——《2024中国AI大模型产业图谱3.0版》”正式发布。下一次版本迭代将于2024年12月底发布2024年3.0版&#xff0c;敬请期待&#xff0c;欢迎报名。 大数据产业创新服务媒体 ——聚焦数据 改变商业 随着科技的飞速发展&…

7.C++程序中的基本数据类型-数据类型之间的转换

在C中&#xff0c;类型转换是将一个数据类型转为另外一个数据类型&#xff0c;其转换过程比较复杂&#xff0c;目前只讨论基本数据类型之间的转换。 类型转换分为两部分&#xff1a;隐式转换和显示转换 隐式转换又称为自动转换&#xff0c;显示转换又称为强制转换。 隐式转换…

文章解读与仿真程序复现思路——电力系统自动化EI\CSCD\北大核心《基于台区剩余电流关联性分析的接线错误漏电用户识别方法》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

基于软件项目开发流程的软件综合实训室解决方案

一、引言 1.1 软件实训室的重要性 软件实训室作为高等教育和职业教育中的不可或缺组成部分&#xff0c;对于培养学生的实践能力和创新思维发挥着重要作用。随着信息技术的快速发展&#xff0c;软件行业对于高素质技术人才的需求日益增长。实训室提供了一个模拟真实工作环境的…

视频监控平台AS-V1000的目录管理和区域管理:实现现有监控视频资源的行政区域划分和管理

目录 一&#xff0e;行政区划相关概念 1.1 视频监控系统中的行政区划 1.2 国标GB28181中行政区划目录定义 二&#xff0e;视频资源管理平台介绍 2.1 AS-V1000视频平台介绍 2.2 平台相关服务的说明 三&#xff0e;区域管理功能介绍 3.1区域管理功能结构树 3.1.1区域管理…

面试经典算法题53-搜索插入位置

面试经典算法题53-搜索插入位置 公众号&#xff1a;阿Q技术站 LeetCode.35 问题描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为…

探索MemGPT:AI界的新宠儿

文章目录 探索MemGPT&#xff1a;AI界的新宠儿1. 背景介绍2. MemGPT是什么&#xff1f;3. 如何安装MemGPT&#xff1f;4. 简单的库函数使用方法5. 场景应用场景一&#xff1a;创建持久聊天机器人场景二&#xff1a;文档分析场景三&#xff1a;多会话聊天互动 6. 常见Bug及解决方…

Nginx笔记-使用alias映射磁盘目录(nginx文件下载)

Nginx 配置中&#xff0c;alias 关键字用于指定一个路径作为请求的别名。当客户端请求该别名路径下的资源时&#xff0c;Nginx会将其映射到实际的文件系统路径进行访问。这种方式可以用来隐藏实际文件系统路径&#xff0c;或者将客户端请求重新定向到另一个路径。 如下例子&am…

【幸运数 / A】

题目 代码 #include <bits/stdc.h> using namespace std; bool check(int num) {int cnt 0;int x num;while (x){cnt;x / 10;}if (cnt % 2)return false;cnt / 2;int sum 0, half 0, i 0;x num;while (x){i;if (i < cnt)half x % 10;sum x % 10;x / 10;}if (…

LeetCode 热题 100 回顾17

干货分享&#xff0c;感谢您的阅读&#xff01;原文见&#xff1a;LeetCode 热题 100 回顾_力code热题100-CSDN博客 一、哈希部分 1.两数之和 &#xff08;简单&#xff09; 题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标…

vue3 + ts + pnpm:nprogress / 页面顶部进度条

一、简介 nprogress 是一个轻量级的进度条库&#xff0c;它适用于在网页上添加顶部进度条&#xff0c;用于指示页面加载进度或任何长时间的运行过程。这个库非常流行&#xff0c;因为它易于使用且视觉效果很好。 二、安装 pnpm add nprogress 三、在使用的页面引入 / src/v…

计算机毕业设计springboot+vue家居全屋家具定制系统

目录 功能和技术介绍系统实现截图开发核心技术介绍&#xff1a;使用说明开发步骤编译运行核心代码部分展示需求分析系统设计软件测试详细视频演示源码获取 功能和技术介绍 本项目包含程序源码和MySql脚本和文档,idea开发,支持Eclipse。使用vue的本质是SpringFramework【IoC&am…

深度学习——D2(数据操作)

N维数组 创建数组 访问元素 一列: [ : , 1 ] 反向累积、正向累积&#xff08;自动求导&#xff09; 梯度 梯度&#xff08;Gradient&#xff09;是微积分中的一个重要概念&#xff0c;主要用于描述一个函数在某个区域内的变化情况。以下是对梯度的详细解释&#xff1a; 一…

Vue(15)——组合式API②

生命周期函数 选项式组合式beforeCreate/createdsetupbeforeMountonBeforeMount mountedonMounedbeforeUpdateonBeforeUpdateupdatedonUpdatedbeforeUnmountonBeforeUnmountunmountedonUnmounted 父子通信 父传子基本思想&#xff1a; 父组件中给子组件绑定属性…

Stable Diffusion 使用详解(12)--- 设计师风格变换

目录 背景 seg模型&#xff08;语义分割&#xff09; 描述 原理 实战-装修风格变换 现代风格 欧式风格转换 提示词及相关参数设置 模型选择 seg cn 加持 效果 还能做点啥 问题 解决方法 出图效果 二次优化调整 二次出图效果 地中海风格转换 参数修改 效果 …

服务器离线安装python库包

conda安装参考服务器离线安装anaconda-CSDN博客 python离线安装参考服务器配置虚拟环境及离线安装python-CSDN博客 1.离线安装pip&#xff08;这里是因为后续使用pypi安装其他库更方便&#xff0c;如果不想用pip去conda下载其他安装包也可以&#xff0c;后面用conda安装和这里…

Python练习宝典:Day 2 - 选择题 -函数、文件与IO

目录 一、函数二、文件与IO 一、函数 1.在函数内部可以通过关键字()来定义全局变量: A.global B.all C.def D.lambda2.在Python中使用什么表达式创建匿名函数? A.global B.lambda C.def D.list3.使用形式参数的名字来确定输入的参数值,是指什么参数? A.位置参数 B.默认参…

CentOS Stream 9部署Redis

1、安装Redis sudo dnf install redis 2、启动Redis服务 sudo systemctl start redis 3、设置Redis开机自启 sudo systemctl enable redis 4、打开Redis配置文件&#xff1a; sudo vi /etc/redis/redis.conf 在配置文件中找到并修改以下两行&#xff0c;确保密码验证功能已启…

招联金融秋招-2025

【投递方式】 直接扫下方二维码&#xff0c;或点击内推官网https://wecruit.hotjob.cn/SU61025e262f9d247b98e0a2c2/mc/position/campus&#xff0c;使用内推码 igcefb 投递 【招聘岗位】 后台开发 前端开发 数据开发 数据运营 算法开发 技术运维 软件测试 产品策划 产品运营…