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

【图书管理系统】深入解析基于 MyBatis 数据持久化操作:全栈开发图书管理系统:查询图书属性接口(注解实现)、修改图书属性接口(XML 实现)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


查询图书属性接口


约定前后端交互接口


约定前后端交互接口,进入修改页面,需要显示当前图书的信息;

请求  
/book/queryBookById?bookId=25  

参数  
无  

响应  
{  
  "id": 25,  
  "bookName": "图书21",  
  "author": "作者2",  
  "count": 999,  
  "price": 222.00,  
  "publish": "出版社1",  
  "status": 2,  
  "statusCN": null,  
  "createTime": "2023-09-04T04:01:27.000+00:00",  
  "updateTime": "2023-09-05T03:37:03.000+00:00"  
}

根据图书ID,获取当前图书的信息。


实现服务器代码


控制层 BookController


image-20250410184907710


业务层 BookService


image-20250410191653924


数据层 BookInfoMapper


根据图书ID,查询图书信息。

@Select("select id, book_name, author, count, price, publish, `status`, 
create_time, update_time " +
"from book_info where id=#{bookId} and status<>0")
BookInfo queryBookById(Integer bookId);

image-20250410185255703


接口测试


重新运行程序,打开页面127.0.0.1:9090/book/queryBookById?bookId=5

image-20250410195011815


修改图书属性接口


约定前后端交互接口


点击修改按钮,修改图书信息。

请求  
/book/updateBook  
Content-Type: application/x-www-form-urlencoded; charset=UTF-8  

参数  
id=1&bookName=图书1&author=作者1&count=23&price=36&publish=出版社1&status=1  

响应  
""  // 失败信息, 成功时返回空字符串

我们约定,浏览器给服务器发送一个 /book/updateBook 这样的 HTTP 请求,form表单的形式来提交数据;

服务器返回处理结果,返回""表示添加图书成功,否则,返回失败信息。


实现服务器代码


控制层 BookController


image-20250410190019780


image-20250410190115282


业务层 BookService


image-20250410190220780


数据层 BookInfoMapper


更新逻辑相对较为复杂,因为一本书不是每个属性都需要进行修改的;

所以 bookInfo 对象的哪些属性传递了值,我们就更新哪些值,需要使用动态SQL

对于初学者而言,注解的方式拼接动态SQL不太友好,煮啵采用xml的方式来实现。

因为注解和 XML 可以同时在一个 interface 中共存,所以煮啵就不创建新接口了;

image-20250410191823774


添加依赖和配置 XML 路径


配置 xml 路径:

mybatis:
  mapper-locations: classpath:mapper/**Mapper.xml

最终整体的 yml 配置文件为:

image-20250410192815280


xml 实现:


创建BookInfoMapper.xml文件,并初始化

image-20250410193242524


image-20250410193451978


image-20250410193645225


image-20250410194420971


接口测试


重新运行程序:

image-20250410195937320


结果层层筛查和尝试,煮啵才锁定问题:

image-20250410203205409


查看以前的博客,煮啵发现:spring 和 mybatis 是同级别的层次,煮啵把 mybatis 设置成了 spring 的小弟

image-20250410203129976


修改好代码之后,重新提供 Postman 构造请求,终于成功返回响应:

image-20250410202945566


提前开香槟,我们这一路走来不容易,多少次流着泪说不分离~~~(bushi)

验证数据库表信息是否被修改:

image-20250410203527722


image-20250410203906040


实现客户端代码


我们希望点击修改按钮时:

image-20250410204058159


跳转的输入框中有原来的值:

image-20250410204211566


修改好数据后,点击确认按钮,会调用后端:

image-20250410204514420


接下来,我们来写前端代码:


我们观察,在列表页时,我们已经补充了[修改]的链接:

http://127.0.0.1:8080/book_update.html?bookId=25(25为对应的图书ID)

image-20250410171116878


点击[修改]链接时,就会自动跳转到 http://127.0.0.1:8080/book_update.html?bookId=25(25为对应的图书ID)。

进入[修改图书]页面时,需要先从后端拿到当前图书的信息,显示在页面上。

image-20250410171135263


补全修改图书的方法:

image-20250410171156208


我们修改图书信息,是根据图书ID来修改的,所以需要前端传递的参数中,包含图书ID。

有两种方式:

  1. 获取url中参数的值(比较复杂,需要拆分url)
  2. 在form表单中,再增加一个隐藏输入框,存储图书ID,随 $(“#updateBook”).serialize() 一起提交到后端。

我们采用第二种方式:

在form表单中,添加隐藏输入框。

image-20250410171253085


  • hidden类型的<input>元素。
  • 隐藏表单,用户不可见、不可改的数据,在用户提交表单时,这些数据会一并发送出。
  • 使用场景:正被请求或编辑的内容的ID。这些隐藏的input元素在渲染完成的页面中完全不可见,且没有方法可以使它重新变为可见。

页面加载时,给该hidden框赋值。

image-20250410171403759


此时前端 js 完整代码:

image-20250410171445617

image-20250410171435824


程序运行,测试:

image-20250410171503692


点击[修改]链接,跳转到图书修改页面,页面加载出该图书的信息。

image-20250410171519062


随机修改数据,点击确定按钮,观察数据是否被修改。

image-20250410171532958


在这里插入图片描述

在这里插入图片描述

http://www.dtcms.com/a/123426.html

相关文章:

  • 【安全】加密算法原理与实战
  • 人工智能第一章 探索人工智能基石:从智能定义到模式识别的全面解析
  • MySQL--基础知识点--81.3--TRIGGER
  • 2025.4.10总结
  • 1200 模拟量输入输出功能
  • 图像生成模型的不可检测水印——Undetectable Watermark for Generative Image Models
  • 【hadoop】Hive数据仓库安装部署
  • oracle 并行度(Parallel Degree)
  • ZYNQ笔记(二):MIO 、EMIO
  • PyTorch复现多维逻辑回归
  • AI与5G的融合:如何实现更快速、更智能的物联网应用?
  • 在docker里装rocketmq-console
  • edis 主从复制
  • 在 Dev-C++中编译运行GUI 程序介绍(二)示例:祝福程序
  • Python常用排序算法
  • dataset 的max_length=256是什么意思; DataLoader:shuffle=True 是什么意思
  • [LevelDB]Block系统内幕解析-元数据块(Meta Block)元数据索引块(MetaIndex Block)索引块(Index Block)
  • XHR、FetchAxios详解网络相关大片文件上传下载
  • P1331 洛谷 海战
  • uni-app 开发安卓app提交审核时因 隐私协议被拒时
  • 数据结构与算法-动态规划-区间dp,状态机dp,树形dp
  • 虚拟内存详解
  • MyBatisX插件使用
  • PointNet++语义分割(semseg)训练自己的数据集并完成可视化并保存txt结果
  • HDCP(一)
  • QML自定义属性和方法
  • 深入解析栈回溯技术:如何通过异常处理精准定位程序崩溃点
  • threeJs实现裸眼3D小狗
  • 每天记录一道Java面试题---day38
  • Python设计模式-工厂模式