当前位置: 首页 > 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叫什么名字不重要)

http://www.kler.cn/a/551972.html

相关文章:

  • 在 Visual Studio 中使用 C++ 利用 dump 文件查找问题原因和崩溃点
  • 【python】4_异常
  • [LeetCode力扣hot100]-链表
  • 扩散模型中的马尔可夫链设计演进:从DDPM到Stable Diffusion全解析
  • labelimg的xml文件转labelme的json文件
  • Android ListPreference使用
  • 图床 PicGo+GitHub+Typora的下载安装与使用
  • 基于 Spring Cloud + Sentinel 的全面流量治理方案
  • fatal: Out of memory, malloc failed (tried to allocate 524288000 bytes)
  • 《DeepSeek 一站式工作生活 AI 助手》
  • 提升接口性能之缓存
  • Spring Boot项目的基本设计步骤和相关要点介绍
  • Win10环境使用零讯ZeroNews内网穿透实现Deepseek对外服务
  • UDP
  • 全平台搭载旭日5!科沃斯GOAT智能割草机器人全新系列正式开售
  • 轻松搭建本地大语言模型(一)Ollama安装与使用
  • 山石网科×阿里云通义灵码,开启研发“AI智造”新时代
  • 记一次Ngnix配置
  • 智能合约与区块链中的NLP应用:自动化法律文书分析与合同审查【附核心实战代码】
  • 【UE5 C++课程系列笔记】30——自动拷贝DLL及其他资源