图书管理系统(3)修改图书接口

图书管理系统(3)修改图书接口

文章目录

观前提醒:

这个图书管理系统,非常的简陋,仅作为练习使用。不建议大家使用我介绍的 图书管理系统 ,去作为 课程设计。

如果你是第一次点击这篇博客的,需要你将我 图书管理系统 的博客列表中,从这篇开始看:
图书管理系统(1)项目准备,用户登录接口,添加图书接口

无Mybatis版本获取:

这个 图书管理系统 的实现,需要你从我的 gitee上,将 无Mybatis版本 的图书管理系统源代码下载下来。

gitee链接:https://gitee.com/mrbgvhbhjv/java-ee-course/tree/master/后端代码/springboot_bookManage_System

基于 Mybatis版本 的获取:

如果你想直接获取 基于 Mybatis 完全实现了增删查改功能的图书管理系统,就从我的 gitee 上面获取,下载源代码。

gitee链接:https://gitee.com/mrbgvhbhjv/java-ee-course/tree/master/后端代码/Book_System_20251107

目录结构:

以防大家会乱,或者我博客写的不详细,各种类的存放位置,我放个目录结构在这里:

个人建议:

这篇博客的代码,建议自己敲一下。

跟着我的步骤,使用 无Mybatis版本 的图书管理系统源代码 ,一步一步的将代码实现出来。

这里使用的数据库是 MySQL。

图形化工具:Navicat

虽然,截止到 2026年,cursor,TRAE等 AI工具,能够一键编写代码,甚至一个系统。

但是,如果你不会基础知识,只会让 ai 生成代码,不会看代码,不会修改代码,代码运行报错,你不会解决问题等等。其实,你都不算是一个 Java开发者。

如果我们将 AI工具,对我们的工作效率提升,有巨大的帮助,它一定是一个乘法结算的结果。

你的基础开发能力 × AI工具效率 == 工作效率。

如果你的基础开发能力不行,约等于 0,那么,无论 AI工具效率多高,99倍也好,0 * 99 == 0

所以,只有将我们自己的基础开发能力提升了,使用 AI工具提升效率,才是事半功倍的效果。

1. 后端代码

这是一个图书修改页面,但是,这个页面不太合理。

不合理的点:修改图书,应该要把这个图书原本的信息,显示出来,我在根据我想修改的内容,去修改对应的数据。

也就是说,修改图书的页面,应该要先显示这本图书的原有信息,用户再去修改

显示这本图书的原有信息,就是要查询某一本图书的信息,根据什么去查?

可以根据id,也可以根据书名。

这里,我使用 图书id 进行查询。

接口文档:

这里,我们应该设计两个接口:

  1. 根据id,查询图书接口
  2. 修改图书接口

1.1 根据id,查询图书接口

接口文档描述:

mapper层(数据持久层):

java 复制代码
    @Select("select * from book_info where `status` != 0 and id=#{bookId}")
    BookInfo queryBookById(Integer bookId);

Service层(业务层):

java 复制代码
    public BookInfo queryBookById(Integer bookId) {
        return bookInfoMapper.queryBookById(bookId);
    }

Controller层:

java 复制代码
    @RequestMapping("/queryBookById")
    public BookInfo queryBookById(Integer bookId){
        return bookService.queryBookById(bookId);
    }

这个接口,联合 修改图书接口 一起测试。

1.2 修改图书接口

接口文档描述:

mapper层(数据持久层):

更新逻辑相对较为复杂,用户 传递了哪些值,咱们更新哪些值,需要使用动态SQL

对于初学者,注解的方式拼接动态SQL不太友好,咱们 采用xml的方式来实现

set关键字,我们使用 set标签来表示。

如果某一个数据,如:书名,作者名,价格等,没有修改,我们的动态sql语句,就不传入对应的参数和赋值,所以,每一个字段都使用 if标签。

同时,update语句,一定要记得where条件 :根据 id 修改图书。
不加 where,就会把所有的记录都修改掉

BookInfoMapper接口代码:

java 复制代码
Integer updateBookInfo(BookInfo bookInfo);

BookInfoMapper.xml 文件代码:

java 复制代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.example.book_system_20251107.book.mapper.BookInfoMapper">

    <update id="updateBookInfo">
        update book_info
        <set>
            <if test="bookName!=null">
                book_name = #{bookName}
            </if>
            <if test="author!=null">
                author = #{author}
            </if>
            <if test="count!=null">
                count = #{count}
            </if>
            <if test="price!=null">
                price = #{price}
            </if>
            <if test="publish!=null">
                publish = #{publish}
            </if>
            <if test="status!=null">
                status = #{status}
            </if>
        </set>
        where id = #{id}
    </update>
</mapper>

Service层(业务层):

java 复制代码
    public Integer updateBook(BookInfo bookInfo) {
        return bookInfoMapper.updateBookInfo(bookInfo);
    }

Controller层:

java 复制代码
    @RequestMapping("/updateBook")
    public String updateBook(BookInfo bookInfo){
        log.info("修改图书信息,bookInfo:" + bookInfo);

        try {
            bookService.updateBook(bookInfo);
            return "";
        }catch (Exception e){
            log.error("修改图书发送异常,e:"+ e.getMessage());
            return "修改图书发送异常";
        }

//        if-else 语句判断,并返回结果
//        if (bookService.updateBook(bookInfo) == 1){
//            return "";
//        }else {
//            return "修改图书发送异常";
//        }
    }

接口测试:

Postman:
测试效果:

2.前端代码:

后端人员,对前端代码,能够掌握其思路,逻辑即可,对代码完全手写,没有强制性要求。

book_update.html代码:

html 复制代码
<script>
    getBookInfo();

    function getBookInfo ()
    {
      $.ajax({
        type: "get",
        url: "/book/queryBookById" + location.search,
        success: function (bookInfo)
        {
          if (bookInfo != null) {
            $("#bookId").val(bookInfo.id);
            $("#bookName").val(bookInfo.bookName);
            $("#bookAuthor").val(bookInfo.author);
            $("#bookStock").val(bookInfo.count);
            $("#bookPrice").val(bookInfo.price);
            $("#bookPublisher").val(bookInfo.publish);
            $("#bookStatus").val(bookInfo.status);

          }
        }
      });
    }

    function update ()
    {
      $.ajax({
        type: "post",
        url: "/book/updateBook",
        data: $("#updateBook").serialize(),
        success: function (result)
        {
          if (result == "") {
            alert('修改成功');
            location.href = "book_list.html?currentPage=1";
          } else {
            alert(result);
          }
        }

      });
      // alert("更新成功");
      // location.href = "book_list.html"
    }
  </script>

页面效果:


3. 总结:

可能会犯的错误:

  1. 后端接口(Controller)代码,接收前端参数的时候,一定要和方法名对应上,不然,接口就接收不到前端的参数。
  2. Sql语句的 ',' 一定要记得写上,不然 sql语句会报错的。无法修改数据。
    最后,如果这篇博客能帮到你的,请你点点赞,有写错了,写的不好的,欢迎评论指出,谢谢!
    下一篇博客:图书管理系统(4)删除图书接口
相关推荐
HalvmånEver4 小时前
7.高并发内存池大页内存申请释放以及使用定长内存池脱离new
java·spring boot·spring
凤山老林4 小时前
SpringBoot 使用 H2 文本数据库构建轻量级应用
java·数据库·spring boot·后端
dreamread5 小时前
【SpringBoot整合系列】SpringBoot3.x整合Swagger
java·spring boot·后端
把你毕设抢过来5 小时前
基于Spring Boot的社区智慧养老监护管理平台(源码+文档)
数据库·spring boot·后端
闻哥5 小时前
深入Redis的RDB和AOF两种持久化方式以及AOF重写机制的分析
java·数据库·spring boot·redis·spring·缓存·面试
wsxlgg7 小时前
mybatis自动生成mapper和xml文件
mybatis
毕设源码_廖学姐7 小时前
计算机毕业设计springboot古诗词学习App 基于SpringBoot的中华经典诗文数字化研习平台 SpringBoot框架下的传统诗词文化移动学习系统
spring boot·学习·课程设计
爱吃山竹的大肚肚10 小时前
RocketMQ 4.x + Spring Boot 生产级集成方案(完整笔记)
spring boot·rocketmq·java-rocketmq
毕设源码_严学姐10 小时前
计算机毕业设计springboot心理健康辅导系统 高校学生心灵关怀服务平台的设计与实现 校园智慧心理服务系统的设计与实现
spring boot·后端·课程设计
姗姗的鱼尾喵11 小时前
Java 面试内容分享
java·spring boot·面试