图书管理系统(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)删除图书接口
相关推荐
百锦再1 小时前
Java InputStream和OutputStream实现类完全指南
java·开发语言·spring boot·python·struts·spring cloud·kafka
亓才孓1 小时前
【SQLSyntaxErrorException】SQL语法错误
数据库·sql·mybatis
亓才孓1 小时前
【MyBatis Exception】SQLSyntaxErrorException(按批修改不加配置会报错)
java·开发语言·mybatis
亓才孓1 小时前
【MyBatis Runtime Exception】自动驼峰映射对Map不生效,应该在查询中起别名
java·windows·mybatis
亓才孓1 小时前
【MyBatis Plus】MyBatis Plus框架
mybatis
玄〤2 小时前
个人博客网站搭建day2-Spring Boot 3 + JWT + Redis 实现后台权限拦截与单点登录(漫画解析)
java·spring boot·redis·后端·jwt
Anastasiozzzz2 小时前
阿亮随手记 SpringBoot应用启动预热、@Lazy、Bean作用域、多环境配置
spring boot·spring·oracle
人道领域2 小时前
SpringBoot多环境配置实战指南
java·开发语言·spring boot·github
Dragon Wu2 小时前
SpringCloud 多模块下引入独立bom模块的正确架构方案
java·spring boot·后端·spring cloud·架构·springboot