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

【JavaEE进阶】MyBatis通过注解实现增删改查

目录

🍃前言

🍀打印日志

🌴传递参数

🎋增(Insert)

🚩返回主键

🎄删(Delete)

🌲改(Update)

🌳查(Select)

🚩起别名

🚩结果映射

🚩开启驼峰命名(推荐使用)


🍃前言

首先我们准备相应的表如下:

application.yml配置文件内容如下:

UserInfo类代码如下:

以下所有操作都是在该接口进行操作:所有测试单元代码都是在如下代码里面完成的:

🍀打印日志

在学习这些操作之前,我们先来学习MyBatis⽇志打印

在Mybatis当中我们可以借助⽇志,查看到sql语句的执⾏、执⾏传递的参数以及执⾏结果

在配置⽂件中进⾏配置即可

yml配置:

重新运⾏上述单元测试中的程序,可以看到SQL执⾏内容,以及传递参数和执⾏结果

未配置日志:

配置日志:

🌴传递参数

需求:查找id=1的⽤⼾,对应的SQL就是:select * from userinfo where id=1

代码:

但是这样的话, 只能查找id=1的数据,所以SQL语句中的id值不能写成固定数值,需要变为动态的数值 解决⽅案:在queryUserInfo⽅法中添加⼀个参数(id),将⽅法中的参数,传给SQL语句

使⽤ #{} 的⽅式获取⽅法中的参数

代码:

生成测试代码:

运行结果:

注意:如果mapper接⼝⽅法形参只有⼀个普通类型的参数,#{…}⾥⾯的属性名可以随便写,如:#{id}、#{value}。建议和参数名保持⼀致
如果有多个参数,属性名一定要与参数名保持一致,当然也可以进行修改,具体方法后面会详细讲解

也可以通过 @Param ,设置参数的别名,如果使⽤ @Param设置别名,#{...}⾥⾯的属性名必须和@Param 设置的⼀样

代码:

运行结果:

🎋增(Insert)

我们采用@Inset注解实现,具体实现如下:

返回Integer是为了知道对该数据库更改了多少行。

这里由于传递参数过多,我们使用对象进行传递,对对象相应参数进行赋值即可。

我们使用测试单元进行测试,测试代码如下:​​​​​​​

启动测试代码,我们可以看到相应的日志:

再查询相应的数据库时我们就可以看到,添加成功的数据

如果设置了 @Param 属性,#{...}需要使⽤参数.属性来获取

代码:​​​​​​​

运行结果:​​​​​​​

🚩返回主键

Insert 语句默认返回的是受影响的⾏数

但有些情况下,数据插⼊之后,还需要有后续的关联操作,需要获取到新插⼊数据的id

⽐如订单系统

当我们下完订单之后,需要通知物流系统,库存系统,结算系统等,这时候就需要拿到订单ID

如果想要拿到⾃增id,需要在Mapper接⼝的⽅法上添加⼀个Options的注解

代码:

useGeneratedKeys:这会令MyBatis使⽤JDBC的getGeneratedKeys⽅法来取出由数据库内部⽣成的主键(⽐如:像MySQL和SQL Server这样的关系型数据库管理系统的⾃动递增字段),默认值:false.
keyProperty:指定能够唯⼀识别对象的属性,MyBatis会使⽤getGeneratedKeys的返回值或insert语句的selectKey⼦元素设置它的值,默认值:未设置(unset)

也就是说把自增id放到了"id"属性当做,现在可以通过获取id属性来打印自增id

测试:​​​​​​​

运行结果:

🎄删(Delete)

删除代码如下:

测试单元代码如下:

运行结果如下:

查询数据库如下:

🌲改(Update)

将id为5的密码改为000000,接口代码如下:

更新代码如下:

测试单元代码如下:

启动测试后,观察日志如下:

查询数据库如下:

🌳查(Select)

我们查询所有数据,并用日志打印出来,代码如下:

测试单元代码如下:

单元测试执行如下:

注意事项:

MyBatis会根据⽅法的返回结果进⾏赋值.
⽅法⽤对象UserInfo接收返回结果,MySQL查询出来数据为⼀条,就会⾃动赋值给对象.
⽅法⽤List接收返回结果,MySQL查询出来数据为⼀条或多条时,也会⾃动赋值给List.
但如果MySQL查询返回多条,但是⽅法使⽤UserInfo接收,MyBatis执⾏就会报错.

从运⾏结果上可以看到,我们SQL语句中,查询了delete_flag,create_time,update_time,但是这⼏个属性却没有赋值.

这是什么原因呢“

当⾃动映射查询结果时,MyBatis会获取结果中返回的列名并在Java类中查找相同名字的属性(忽略⼤⼩写)。这意味着如果发现了ID列和id属性,MyBatis会将列ID的值赋给id属性

但是由于数据库与java命名规则不同,数据库的蛇形将转换成驼峰,所以无法识别。

解决方法有以下三种:

  1. 起别名
  2. 结果映射
  3. 开启驼峰命名

🚩起别名

在SQL语句中,给列名起别名,保持别名和实体类属性名⼀样

再次运行查看​​​​​​​

就可以看到对应属性已经有值了

但是这种方式一般不推荐,因为相当于将这个工作交给数据库来做了。会降低效率,且不可控

🚩结果映射

使用注解,以及相关操作如下:

测试结果:

如果其他SQL,也希望可以复⽤这个映射关系,可以给这个Results定义⼀个名称

@Results注解里面还有一个id属性,也就是给它起个名

此时就可以通过@ResultMap注解进行映射,也就是映射@Results中的id对应的value

🚩开启驼峰命名(推荐使用)

通常数据库列使⽤蛇形命名法进⾏命名(下划线分割各个单词),⽽Java属性⼀般遵循驼峰命名法约定.为了在这两种命名⽅式之间启⽤⾃动映射,需要将mapUnderscoreToCamelCase 设置为true。

application.yml配置如下:

仅限遵守两种命名规则的转换。

这时候我们直接使用查询即可

代码:

单元测试代码:

运行结果:

已经进行了自动映射,字段全部进⾏正确赋值

注意:在表结构的设计中,必须要有三个字段,这是企业规范,这几个字段哪怕业务不需要也要有,当前可能不用,防止后续要使用。数据库的修改是一个非常麻烦的过程!

  • 1. 自增Id
  • 2. 创建日期(create_time,created_time叫什么名字不重要)
  • 3. 更新日期(update_time叫什么名字不重要)

相关文章:

【JavaEE进阶】MyBatis通过注解实现增删改查

目录 🍃前言 🍀打印日志 🌴传递参数 🎋增(Insert) 🚩返回主键 🎄删(Delete) 🌲改(Update) 🌳查(Select) 🚩起别名 🚩结果映射 🚩开启驼…...

Deepseek 怼CHATGPT实况

提示词: 用犀利的语言批评ChatGPT 深度思考(R1) 嗯,用户让我用犀利的语言批评ChatGPT。首先,我需要理解他们的动机。可能他们遇到了ChatGPT的某些问题,比如回答不准确或者缺乏深度,所以想表达不满。也有…...

【RK3588嵌入式图形编程】-SDL2-构建模块化UI

构建模块化UI 文章目录 构建模块化UI1、概述2、创建UI管理器3、嵌套组件4、继承5、多态子组件6、总结在本文中,将介绍如何使用C++和SDL创建一个灵活且可扩展的UI系统,重点关注组件层次结构和多态性。 1、概述 在前面的文章中,我们介绍了应用程序循环和事件循环,这为我们的…...

Simulink Ststeflow教程 — 2 创建和编辑状态

目录 2.1 创建和编辑状态 2.1.1 状态的创建 2.1.2 创建连接节点 2.1.3 转移 2.1.5 默认转移 在Stateflow模型中,将包含有状态的Stateflow框图称状态图而将不包含任何状态的Stateflow框图称为流程图。其中,状态图是Stateflow最常用的一种形式&#x…...

Fiddler笔记

文章目录 一、与F12对比二、核心作用三、原理四、配置1.Rules:2.配置证书抓取https包3.设置过滤器4、抓取App包 五、模拟弱网测试六、调试1.线上调试2.断点调试 七、理论1.四要素2.如何定位前后端bug 注 一、与F12对比 相同点: 都可以对http和https请求进行抓包分析…...

线上就医全流程医药机构接入文档接口代码-医保就医接口php-demo版本

2025年2月18日11:28:03 国密算法开发库推荐 lpilp/guomi 我测试过php 7.2 - 8.0都可以兼容,如果有能力可以自己开发 目前已经开发了核心的接口的测试demo,并且封装了工具类直接写业务逻辑即可,并且已经有线上项目在使用,如果需要demo代码可…...

Linux升级Anacodna并配置jupyterLab

在使用 Anaconda 的过程中,随着项目和需求的发展,可能需要升级 Anaconda 的 Base 环境中的 Python 版本。本文将详细介绍如何安全地进行升级,包括步骤、代码示例与最终流程图。 升级 Python 一、环境准备 在进行任何升级之前,建…...

com.typesafe.config

com.typesafe.config 是 Typesafe Config 库的核心包,主要用于 统一、灵活地管理应用程序配置,支持从多种格式(如 HOCON、JSON、Java Properties)加载配置,并提供类型安全的访问接口。以下是其核心功能的详细解析&…...

Recall(召回率)和 Precision(精确率) 的区别和F1分数

Recall与Precision 的区别 一 、概念 Recall(召回率)和 Precision(精确率)是信息检索、数据挖掘以及机器学习等领域中评估模型或算法性能的两个重要指标,特别是在分类问题中。 Precision(精确率&#xff…...

智能选路+NAT实验 作业

拓扑图 配置ip 防火墙安全区域划分 用户配置 dns透明...

Vue 项目登录的基本流程

Vue 用户登录的基本流程包括以下6个步骤&#xff1a; 步骤&#xff1a; 1. 创建登录表单 在前端&#xff0c;首先要创建一个登录表单&#xff0c;用户输入账号&#xff08;用户名、邮箱、手机号等&#xff09;和密码。 示例&#xff1a;Login.vue <template><div…...

LLM:RAG

原文链接&#xff1a;LLM&#xff1a;RAG 1、RAG 概览 RAG&#xff08;Retrieval-Augmented Generation&#xff0c;检索增强生成&#xff09;是一种结合了信息检索&#xff08;IR&#xff09;和 LLM 的技术。它的核心思想是在 LLM 生成回答之前&#xff0c;通过检索相关文档…...

基于Qt 和微信小程序的用户管理系统:WebSocket + SQLite 实现注册与登录

目录 一. 概要 二. 技术栈 三. 系统功能设计 3.1 功能模块 3.2 数据表设计 四. 具体实现 4.1 Qt 服务端 4.1.1 初始化 WebSocket 服务器 4.1.2 用户管理界面 4.2 微信小程序端 4.2.1 注册功能 4.2.2 登录功能 五. 运行效果 六. 源码下载 一. 概要 在物联网和智能设备…...

43.日常算法

1.LCR 142. 训练计划 IV 题目来源 给定两个以 有序链表 形式记录的训练计划 l1、l2&#xff0c;分别记录了两套核心肌群训练项目编号&#xff0c;请合并这两个训练计划&#xff0c;按训练项目编号 升序 记录于链表并返回。 注意&#xff1a;新链表是通过拼接给定的两个链表的…...

策略+适配器模式详解

文章目录 1.策略模式1.目录结构2.Strategy.java 策略接口3.StrategyA.java 策略A4.StrategyB.java 策略B5.StrategyC.java 策略C6.Context.java 策略上下文7.Client.java 客户端8.小结 2.适配器模式1.目录结构2.CustomPaymentProcessor.java 自己的支付接口3.PayPalPaymentServ…...

2024年职高单招或高考计算机类投档线

问题&#xff1a; 这些学校2024年职高单招或高考计算机类投档线分别是多少 回答&#xff1a; 部分学校2024年职高单招或高考计算机类投档线如下&#xff1a; 湖南工业职业技术学院 职高单招&#xff1a;未查询到2024年职高单招计算机类专业明确的录取分数线信息。但在2024年…...

Salesforce 检索Layout的设定

做了许多Object&#xff0c;却想不起来怎么设置我的Listview的项目了。 問題&#xff1a; salesforce 最近参照したオブジェクト 表示項目を変更したいですが、「検索レイアウト」の選択メニューが該当オブジェクトのオブジェクトマネージャーから出てないです。 解決方法&am…...

未来游戏:当人工智能重构虚拟世界的底层逻辑

未来游戏&#xff1a;当人工智能重构虚拟世界的底层逻辑 在《赛博朋克2077》夜之城的霓虹灯下&#xff0c;玩家或许已经注意到酒吧里NPC开始出现微表情变化&#xff1b;在《艾尔登法环》的开放世界中&#xff0c;敌人的战术包抄逐渐显露出类人智慧。这些细节预示着游戏产业正站…...

Zabbix——Rocky9安装zabbix相关步骤记录

安装Zabbix 安装MariaDB 这里用MariaDB演示 https://mariadb.org/download/?trepo-config&dRedHatEnterpriseLinux9&v10.11&r_mneusoft 通过这个网址获得连接 选择对应的repo 根据系统版本和要安装的版本选择对应的repo 安装 新建一个repo文件&#xff0c;例…...

SECS/GEM300应用案例参考

GEM300 是一种用于半导体制造领域的通信协议标准&#xff0c;主要用于支持 300mm 晶圆制造的自动化生产。以下是 GEM300 的一些具体应用案例&#xff1a; 1. 半导体设备集成 设备制造商的应用&#xff1a;广州金南瓜科技有限公司通过 GEM300 SDK&#xff0c;帮助国内多个半导体…...

startai产品精修教程

1.把产品放置ps画布中 打开startai插件选择产品精修功能&#xff0c;选择金属材质即可哦 调节一下参数就可以啦&#xff0c;最终效果图 下载地址&#xff1a;StartAI画图软件官网_PS插件StartAI绘画软件生成器_Photoshop图像处理插件...

【YOLOv8】

文章目录 1、yolov8 介绍2、创新点3、模型结构设计3.1、backbone3.2、head 4、正负样本匹配策略5、Loss6、Data Augmentation7、训练、推理8、分割 Demo附录——V1~V8附录——相关应用参考 1、yolov8 介绍 YOLOv8 是 ultralytics 公司在 2023 年 1 月 10 号开源的 YOLOv5 的下…...

【保姆级教程】DeepSeek R1+RAG,基于开源三件套10分钟构建本地AI知识库

一、总体方案 目前在使用 DeepSeek 在线环境时&#xff0c;页面经常显示“服务器繁忙&#xff0c;请稍后再试”&#xff0c;以 DeepSeek R1 现在的火爆程度&#xff0c;这个状况可能还会持续一段时间&#xff0c;所以这里给大家提供了 DeepSeek R1 RAG 的本地部署方案。最后实现…...

Oracle视图(基本使用)

视图 视图是通过定制的方式显示一个或者多个表的数据。 视图可以视为“虚拟表”或“存储的查询”。 视图的优点&#xff1a; 提供了另外一种级别的表安全性隐藏了数据的复杂性简化了用户的SQL命令隔离基表结构的改变通过重命名列&#xff0c;从另一个角度提供数据。 视图里…...

梁文锋亲自挂名DeepSeek发布新论文

由 DeepSeek 联合创始人梁文锋亲自挂名的研究团队&#xff0c;在 arXiv 上发表了一篇题为“Native Sparse Attention: Hardware-Aligned and Natively Trainable Sparse Attention”的论文&#xff0c;提出了一种全新的注意力机制架构 NSA&#xff08;Native Sparse Attention&…...

低代码(Low Code)全解析:从概念到应用,从选择到价值

​在数字化浪潮席卷全球的当下&#xff0c;企业对软件开发的效率与灵活性愈发重视&#xff0c;低代码平台应运而生并迅速掀起技术热潮。 本文基于笔者 6 年的低代码实践经验&#xff0c;深入剖析低代码的诸多方面&#xff0c;涵盖其定义、发展历程、国内平台对比、开发流程、与…...

C++--STL库-List

目录 1.list 的基本使用 1.1 创建和初始化 1.2. 插入元素 1.3. 删除元素 1.4. 访问元素 1.5 遍历 1.6 总结 list是C标准库&#xff08;STL&#xff09;中的双向链表容器&#xff0c;属于<list>头文件。 它的特点是&#xff1a; 动态大小&#xff1a;可以随时插入…...

尚硅谷 java 学习Day19 抽象类与抽象方法、接口、内部类

6-5 抽象类(abstract)与抽象方法&#xff08;important&#xff09; 一、什么叫抽象类&#xff1a; 有时候将一个父类设计的非常抽象&#xff0c;以至于它没有具体的实例&#xff0c;这样的类称为抽象类 abstract关键字的使用&#xff1a; ​ 1、abstract:抽象的 ​ 2、abs…...

HomeAssistant 发现MQTT设备(温度,湿度,开关)

要通过 MQTT 将温度、湿度数据以及一个灯的开关状态传输到 Home Assistant 并实现设备自动发现&#xff0c;可以按照以下步骤操作&#xff1a; 1.前期准备工作 安装MQTT服务器(EMQX)配置好(可以在HA加载项中安装,也可以在NAS上Docker安装) HA的集成中安装MQTT,并且连接上(EM…...

本地DeepSeek模型GGUF文件转换为PyTorch格式

接前文,我们在本地Windows系统上,基于GGUF文件部署了DeepSeek模型(DeepSeek-R1-Distill-Qwen-1.5B.gguf版本),但是GGUF是已经量化的版本,我们除了对其进行微调之外,无法对其训练,那么还有没有其他办法对本地的GGUF部署的DeepSeek模型进行训练呢?今天我们就反其道而行之…...