mybatis-plus实现增删改查(新手理解版)

目标:API(增删改查)常用记住、restful风格增删查改查、再学习一些细节

视频学习链接:黑马mybatis-plus

只是跟到了11,我是springboot3实现的,
git链接

1、新建数据库用于mybatis-plus

在这里插入图片描述
在这里插入图片描述
输入所给的sql语句即可建立表

2、IDEA引入依赖

脚手架使用的springboot3.3.12 +依赖 myql驱动,手动加入mybatisplus 和 lombok依赖

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.5</version><!--这是一个坑,3。5.5 支持springboot3--></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.30</version><!--这个版本号也得注意--></dependency>

3、连接好数据库,利用mybatisX生成器生成对应的代码

在这里插入图片描述

4、配置yml


spring:application:name: demo-02-mybatis-plus# 数据源配置datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/mybatis_plususername: rootpassword: xxxxtype: com.zaxxer.hikari.HikariDataSourcemybatis-plus:mapper-locations: classpath:mapper/*.xmltype-aliases-package:configuration:# 必须开启驼峰,查的时候会用到map-underscore-to-camel-case: truecache-enabled: false #是否开启二级缓存默认不开启

5、理解Wrapper(条件构造器)

调用baseMapper.XXX(Wrapper对象)
在这里插入图片描述
Wrapper对象细致分类:
在这里插入图片描述
AbstractWrapper抽象类方法 where条件
在这里插入图片描述

QueryWrapper 扩展了AbstractWrappe功能,可以指定查找哪些字段
在这里插入图片描述

5.1 userMapper对QueryWrapper的使用方法

在这里插入图片描述

5.2 userMapper对UpdateWrapper的使用方法

在这里插入图片描述

5.3 userMapper对LambdaQueryWrapper的使用方法

非常推荐这种方式,没有写死在这里插入图片描述

6、理解Iservice

在这里插入图片描述

复杂条件的查询和更新,要用lamadaQuery和lamdaUpdate

也有增删改查,不过它比userMapper优点支持批量化操作,更加丰富,常规就够用了

在serviceImpl类中直接用

7、实战CRUD

在这里插入图片描述

7.1 理解VO查询返回前端的结果,DTO是前端传给控制器的,pojo是传给数据库的

在这里插入图片描述
一个小细节:自己加的第三方库,未在父项目或 dependencyManagement 中定义版本,要加版本号

7.2 API测试工具注意是springboot3,引入以下依赖,并不需要在yml配置

<dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.22</version> <!-- 或者使用最新版本 --></dependency>
<dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.3.0</version> <!-- 或查看最新版 -->
</dependency>

在controller中,写出相应的注解@Tag、@Operation、@Parameter,通过url: 这里改成自己的端口号
http://localhost:8080/swagger-ui.html
http://localhost:8080/swagger-ui/index.html

7.3一个经典版本问题的报错

Error starting ApplicationContext. To display the condition evaluation report re-run your application with ‘debug’ enabled.
2025-05-28T21:45:01.126+08:00 ERROR 26064 — [ main] o.s.boot.SpringApplication : Application run failed

org.springframework.beans.factory.BeanDefinitionStoreException: Invalid bean definition with name ‘addressMapper’ defined in file [D:\IDEA\workspace\mybatis-plus\demo-02-mybatis-plus\target\classes\com\zhenbang\demo02mybatisplus\mapper\AddressMapper.class]: Invalid value type for attribute ‘factoryBeanObjectType’: java.lang.String
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.getTypeForFactoryBean(AbstractAutowireCapableBeanFactory.java:857) ~[spring-beans-6.1.20.jar:6.1.20]
at org.springframework.beans.factory.support.AbstractBeanFactory.getType(AbstractBeanFactory.java:743) ~[spring-beans-6.1.20.jar:6.1.20]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAnnotationOnBean(DefaultListableBeanFactory.java:735) ~[spring-beans-6.1.20.jar:6.1.20]
at org.springframework.boot.sql.init.dependency.AnnotationDependsOnDatabaseInitializationDetector.detect(AnnotationDependsOnDatabaseInitializationDetector.java:36) ~[spring-boot-3.3.12.jar:3.3.12]
在这里插入图片描述

注意哈,咱的mybatis-plus-boot后面有个3,因为咱用的springboot3

    <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-spring-boot3-starter</artifactId><version>3.5.7</version></dependency>

7.4 前端传过来是一个对象,其中这个对象一个属性也是对象(json传过来的),要存到数据库中,当然,这个数据库中字段也是json类型。

报错如下:
在这里插入图片描述

2025-05-29T12:24:36.335+08:00 ERROR 17720 — [demo-02-mybatis-plus] [nio-8081-exec-4] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: org.springframework.dao.DataIntegrityViolationException:
Error updating database. Cause: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Cannot create a JSON value from a string with CHARACTER SET ‘binary’.
The error may exist in com/zhenbang/demo02mybatisplus/mapper/UserMapper.java (best guess)
The error may involve com.zhenbang.demo02mybatisplus.mapper.UserMapper.insert-Inline
The error occurred while setting parameters
SQL: INSERT INTO user ( id, username, password, phone, info, balance ) VALUES ( ?, ?, ?, ?, ?, ? )
Cause: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Cannot create a JSON value from a string with CHARACTER SET ‘binary’.
; Data truncation: Cannot create a JSON value from a string with CHARACTER SET ‘binary’.] with root cause

com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Cannot create a JSON value from a string with CHARACTER SET ‘binary’.
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:104) ~[mysql-connector-j-8.3.0.jar:8.3.0]
at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:912) ~[mysql-connector-j-8.3.0.jar:8.3.0]
at com.mysql.cj.jdbc.ClientPreparedStatement.execute(ClientPreparedStatement.java:354) ~[mysql-connector-j-8.3.0.jar:8.3.0]
at com.zaxxer.hikari.pool.ProxyPreparedStatement.execute(ProxyPreparedStatement.java:44) ~[HikariCP-5.1.0.jar:na]
at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.execute(HikariProxyPreparedStatement.java) ~[HikariCP-5.1.0.jar:na]
at org.apache.ibatis.executor.statement.PreparedStatementHandler.update(PreparedStatementHandler.java:48) ~[mybatis-3.5.16.jar:3.5.16]
at org.apache.ibatis.executor.statement.RoutingStatementHandler.update(RoutingStatementHandler.java:75) ~[mybatis-3.5.16.jar:3.5.16]
at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:50) ~[mybatis-3.5.16.jar:3.5.16]
解决办法:把对象转换成json即可

@TableField(value = "info",typeHandler = JacksonTypeHandler.class)private Object info;

7.5 controller中所有基本功能的实现

在这里插入图片描述

package com.zhenbang.demo02mybatisplus.controller;import cn.hutool.core.bean.BeanUtil;import cn.hutool.json.JSONUtil;
import com.zhenbang.demo02mybatisplus.domain.dto.UserFormDTO;
import com.zhenbang.demo02mybatisplus.domain.po.User;
import com.zhenbang.demo02mybatisplus.domain.vo.UserVO;
import com.zhenbang.demo02mybatisplus.service.UserService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;import org.springframework.web.bind.annotation.*;import java.util.List;@Tag(name = "用户管理接口", description = "用户的增删改查相关接口")
@RequestMapping("/users")
@RestControllerpublic class UserController {@Resourceprivate  UserService userService;@Operation(summary = "新增用户接口")@PostMappingpublic void saveUser(@RequestBody UserFormDTO userDTO){System.out.println(userDTO);// 前端传过来对象,其中一个属性字段为json,自动转化为对象吗User user = BeanUtil.copyProperties(userDTO, User.class);userService.save(user);}@Operation(summary = "删除用户接口")@DeleteMapping("/{id}")public void deleteUserById(@Parameter(description = "用户id") @PathVariable("id") Long id){userService.removeById(id);}@Operation(summary = "根据id查询用户接口")@GetMapping("/{id}")public UserVO queryUserById(@Parameter(description = "用户id") @PathVariable("id") Long id){System.out.println(id);User user = userService.getById(id);System.out.println(user);UserVO userVO = BeanUtil.copyProperties(user, UserVO.class);System.out.println(userVO);return userVO;}@Operation(summary = "根据id批量查询用户接口")@GetMappingpublic List<UserVO> queryUserByIds(@Parameter(description = "用户id集合") @RequestParam("ids") List<Long> ids){List<User> users = userService.listByIds(ids);return BeanUtil.copyToList(users, UserVO.class);}@Operation(summary = "扣减用户余额接口")@PutMapping("/{id}/deduction/{money}")public void deductBalance(@Parameter(description = "用户id") @PathVariable("id") Long id,@Parameter(description = "扣减的金额") @PathVariable("money") Integer money){userService.deductBalance(id, money);}/*@Operation(summary = "根据复杂条件查询用户接口")@GetMapping("/list")public List<UserVO> queryUsers(UserQuery query){List<User> users = userService.queryUsers(query.getName(), query.getStatus(), query.getMinBalance(), query.getMaxBalance());return BeanUtil.copyToList(users, UserVO.class);}@Operation(summary = "根据条件分页查询用户接口")@GetMapping("/page")public PageDTO<UserVO> queryUsersPage(UserQuery query){return userService.queryUsersPage(query);}*/
}

7.6 以上是比较简单的直接调用,复杂条件的查询,尽量使用lamdaQuery和lamdaUpdate

在这里插入图片描述
如果要手写SQL,对应语句如下:
在这里插入图片描述
java语句

    /*复杂条件查询*/@Overridepublic List<User> queryUsers(String name, Integer status, Integer minBalance, Integer maxBalance) {//使用lambdaQuery不用new Wrapper 对象List<User> list = lambdaQuery().like(name != null, User::getUsername, name).eq(status != null, User::getStatus, status).ge(minBalance != null, User::getBalance, maxBalance).le(maxBalance != null, User::getBalance, minBalance).list();return list;}

在这里插入图片描述
手写SQL:

 <update id="deuctBanlance"> 
UPDATE user
SET balance = balance - #{money}
WHERE id = #{id}
</update>

java代码:

        // 方式2 lambdaUpdatelambdaUpdate().set(User::getBalance, remainBalance).set(remainBalance == 0, User::getStatus, UserStatus.FROZEN).eq(User::getId, id).eq(User::getBalance, user.getBalance()) // 乐观锁.update();

7.7 批量增加

在这里插入图片描述
注意啦,要在yml文件中datasource开启以下配置

    url: jdbc:mysql://localhost:3306/mybatis_plus?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true

第二种方式就是动态sql,如果不让用mybatisplus,可以考虑for-each,实现批量增加。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Vue 实例生命周期

一、前言 在使用 Vue 开发应用时&#xff0c;我们经常需要在组件加载、更新或销毁时执行一些特定逻辑&#xff0c;例如&#xff1a; 页面初始化时请求数据&#xff1b;数据变化时更新 DOM 或发送埋点&#xff1b;组件卸载时清除定时器、取消事件监听等资源释放操作。 Vue 提…

英一真题阅读单词笔记 17年

2017 年 Text 1 第一段 序号 单词 音标 词义 1 in advance 事先&#xff0c;提前 2 authority [ɔːˈθɒrəti] n. 专家&#xff0c;权威人士&#xff1b;当局&#xff0c;官方 3 recommend [ˌrekəˈmend] v. 建议&#xff0c;劝告 &#xff1b;推荐 4 s…

Prometheus + Grafana 监控常用服务

一、引言 Prometheus监控常见服务的原理主要包括服务暴露指标和Prometheus抓取指标。一方面&#xff0c;被监控服务通过自身提供的监控接口或借助Exporter将服务的性能指标等数据以HTTP协议的方式暴露出来&#xff1b;另一方面&#xff0c;Prometheus根据配置好的采集任务&…

DAY9 热力图和箱线图的绘制

浙大疏锦行 学会了绘制两个图&#xff1a; 热力图&#xff1a;表示每个特征之间的影响&#xff0c;颜色越深数值越大表示这两个特征的关系越紧密 箱线图&#xff1a;表示每个特征的数据分布情况 箱体&#xff08;Box&#xff09;&#xff1a; 箱体的上下边界分别表示第一四分位…

VUE项目部署IIS服务器手册

IIS部署Vue项目完整手册 &#x1f4cb; 目录 基础概念准备工作Vue项目构建web.config详解IIS部署步骤不同场景配置常见问题实用配置模板 基础概念 Vue单页应用&#xff08;SPA&#xff09;工作原理 重要理解&#xff1a;Vue项目是单页应用&#xff0c;这意味着&#xff1a;…

【Day38】

DAY 38 Dataset和Dataloader类 对应5. 27作业 知识点回顾&#xff1a; Dataset类的__getitem__和__len__方法&#xff08;本质是python的特殊方法&#xff09;Dataloader类minist手写数据集的了解 作业&#xff1a;了解下cifar数据集&#xff0c;尝试获取其中一张图片 import …

怎么查找idea插件的下载位置,并更改

长期使用 IntelliJ IDEA 时&#xff0c;默认存储在 C 盘的配置文件会持续生成大量缓存和日志文件&#xff0c;可能导致系统盘空间不足。通过修改默认配置文件存储位置&#xff0c;可以有效释放 C 盘空间并提升系统性能。 1&#xff0c;先找到自己idea的下载目录&#xff0c;再打…

什么是 WPF 技术?什么是 WPF 样式?下载、安装、配置、基本语法简介教程

什么是 WPF 技术&#xff1f;什么是 WPF 样式&#xff1f;下载、安装、配置、基本语法简介教程 摘要 WPF教程、WPF开发、.NET 8 WPF、Visual Studio 2022 WPF、WPF下载、WPF安装、WPF配置、WPF样式、WPF样式详解、XAML语法、XAML基础、MVVM架构、数据绑定、依赖属性、资源字典…

鸿蒙OSUniApp 开发的多图浏览器组件#三方框架 #Uniapp

使用 UniApp 开发的多图浏览器组件 在移动应用开发中&#xff0c;图片浏览器是非常常见且实用的功能&#xff0c;尤其是在社交、资讯、电商等场景下&#xff0c;用户对多图浏览体验的要求越来越高。随着 HarmonyOS&#xff08;鸿蒙&#xff09;生态的不断壮大&#xff0c;开发…

Flink流处理基础概论

文章目录 引言Flink基本概述传统数据架构的不足Dataflow中的几大基本概念Dataflow流式处理宏观流程数据并行和任务并行的区别Flink中几种数据传播策略Flink中事件的延迟和吞吐事件延迟事件的吞吐如何更好的理解事件的延迟和吞吐flink数据流的几种操作输入输出转换操作滚动聚合窗…

华为云Flexus+DeepSeek征文 | Dify-LLM平台一键部署教程及问题解决指南

作者简介 我是摘星&#xff0c;一名专注于云计算和AI技术的开发者。本次通过华为云MaaS平台体验DeepSeek系列模型&#xff0c;将实际使用经验分享给大家&#xff0c;希望能帮助开发者快速掌握华为云AI服务的核心能力。 目录 1. 前言 2. 准备工作 2.1 注册华为云账号 2.2 确…

第九届水动力学与能源电力系统国际学术会议(HEEPS 2025)

水动力学与电力系统融合&#xff1a;全球能源转型的新引擎 随着全球能源转型加速&#xff0c;水动力学与电力系统的融合正成为破解可持续发展难题的关键。 新能源接入的挑战与机遇 传统电力系统像一条单向行驶的高速公路&#xff0c;而风电、光伏等间歇性能源的加入&#xf…