基于SpringBoot的图书管理系统

2023-11-19

基于SpringBoot的图书管理系统

里面整合了比较全的内容,可以说是麻雀虽小五脏俱全,如果看懂了所有的内容可以说是已经非常精通SpringBoot了

一:引言
由于近期看了SpringBoot,一站式开发特别方便,情不自禁用SpringBoot整合了一下Web框架,Mybatis框架和thymeleaf框架写了一个图书管理系统。
其实可以直接用前后端分离来写的,但是我想练练手,用一个小demo把这些内容都整合到一起。
(其实前后端分离我还没学到)
二:项目目录

1.文件目录
在这里插入图片描述
2.导入依赖

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.0</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

3.proterties文件存储数据库连接信息
注意,我这里的url是我的数据库url,数据库名称是db10,不过不用担心,为了避免调试带来的麻烦,我创建数据库的时候直接创建了db10.

spring.datasource.url=jdbc:mysql://localhost:3306/db10?useUnicode=true&characterEncoding=UTF-8&userSSL=false&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

4.control控制器

import com.example.entry.Books;
import com.example.service.BookService;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;

@Controller

public class MainController {

    @Resource
    BookService bookService;

//    首页
    @RequestMapping("/index")
    public String index() {
        return "/index";
    }

//    这里是回显所有书本的逻辑
    @RequestMapping("/allBook")
    private String getBooksList(Model model) {
        List<Books> booksList = bookService.bookList("%");
        System.out.println(booksList);
        model.addAttribute("books",booksList);
        return "/allBook";
    }

    //    这里是添加过后的逻辑
    @RequestMapping(value = "addED",method = RequestMethod.POST)
    public String addBook(@RequestParam("bookName")String bookName,
                          @RequestParam("bookCounts")int bookCounts,
                          @RequestParam("detail")String detail){
        bookService.addBook(bookName,bookCounts,detail);
        return "redirect:/allBook";
    }

//    这里是添加之前的逻辑
    @RequestMapping("/adding")
    public String index4() {
        return "/addBook";
    }

    //    这里是删除逻辑,删除完了直接重定向
    @RequestMapping(value = "delBook",method = RequestMethod.GET)
    public String addBook(@RequestParam("bookID") int bookID){
        bookService.Del(bookID);
        return "redirect:allBook";
    }

//    修改前
    @RequestMapping("/update")
    public String update(@RequestParam("bookID") int bookID,Model model){
        Books book =bookService.findByID(bookID);
        model.addAttribute("book",book);
        return "updateBook";
    }
//    修改后重定向
    @RequestMapping("/updateBook2")
    public String updateBook2(@ModelAttribute(value = "demo") Books demo, Model model){
//        这里是一个测试,测试提交完信息的内容是否会改变
        System.out.println(demo.toString()+"这里是接收到的信息");
        bookService.update(demo.getBookID(),demo.getBookName(),demo.getBookCounts(),demo.getDetail());
        return "redirect:allBook";
    }
}

5.Books实体类


import lombok.Data;

@Data

public class Books {
    public int bookID;
    public String bookName;
    public int bookCounts;
    public String detail;
}

6.mapper接口


import com.example.entry.Books;
import org.apache.ibatis.annotations.*;

import java.util.List;

@Mapper
public interface MainMapper {

    //    查看所有数据,这里用到了模糊查询
    @Select("select *from books where bookName like#{name}")
    List<Books> bookList(String name);

    //    查找书籍,用于修改书籍时候的数据回显
    @Select("select * from books where bookID=#{bookID}")
    Books findByID(@Param("bookID") int bookID);


    //    删除书籍
    @Delete("delete from books where bookID=#{bookID}")
    void Del(@Param("bookID") int bookID);

    //    增加书籍
    @Insert("insert into books (bookName,bookCounts,detail) values ( #{bookName} , #{bookCounts} , #{detail} )")
    void addBook(@Param("bookName") String bookName, @Param("bookCounts") int bookCounts, @Param("detail") String Detail);

    //    修改书籍
    @Update("update books set bookName=#{bookName} , bookCounts=#{bookCounts} , detail=#{detail} where bookID=#{bookID}")
    void update(@Param("bookID")int bookID,@Param("bookName") String bookName, @Param("bookCounts") int bookCounts, @Param("detail") String Detail);


}

7.service操作

import com.example.entry.Books;
import com.example.mapper.MainMapper;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

@Service
public class BookService {
//    数据源
    @Resource
    MainMapper mapper;

//    会先数据,显示所有书籍的列表
    public List<Books> bookList(String name) {
        return mapper.bookList("%");
    }

//    删除书籍操作
    public void Del(int bookID) {
        mapper.Del(bookID);
    }

//    添加书籍操作
    public void addBook(String name, int count, String detail) {
        mapper.addBook(name, count, detail);
    }

//    修改书籍操作,这里由于是涉及到了修改,所以自然要回显数据
    public Books findByID(int bookID) {
        return mapper.findByID(bookID);
    }

//    更新操作
    public void update(int id, String name, int counts, String detail) {
        mapper.update(id, name, counts, detail);
    }


}

8.前端页面
index首页

<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>首页</title>
    <style type="text/css">
        a {
            text-decoration: none;
            color: black;
            font-size: 18px;
        }

        h3 {
            width: 180px;
            height: 38px;
            margin: 100px auto;
            text-align: center;
            line-height: 38px;
            background: deepskyblue;
            border-radius: 4px;
        }
    </style>
</head>
<body>
<h3>
<!--    这里跳转,显示全部书籍-->
    <a href="/allBook">点击进入列表页</a>
</h3>
</body>
</html>

addBook添加图书页面

<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>新增书籍</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- 引入 Bootstrap -->
    <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container">

    <div class="row clearfix">
        <div class="col-md-12 column">
            <div class="page-header">
                <h1>
                    <small>新增书籍</small>
                </h1>
            </div>
        </div>
    </div>
<!--    添加过后,提交到addED控制,但是逻辑打不通-->
    <form action="/addED" method="post">
        书籍名称:<input type="text" name="bookName"><br><br><br>
        书籍数量:<input type="text" name="bookCounts"><br><br><br>
        书籍详情:<input type="text" name="detail"><br><br><br>
        <input type="submit" value="添加">
    </form>

</div>

allBook显示所有图书

<html  xmlns:th="http://www.thymeleaf.org">
<head>
    <title>书籍列表</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- 引入 Bootstrap -->
    <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container">

    <div class="row clearfix">
        <div class="col-md-12 column">
            <div class="page-header">
                <h1>
                    <small>书籍列表 —— 显示所有书籍</small>
                </h1>
            </div>
        </div>
    </div>

    <div class="row">
        <div class="col-md-4 column">
            <a class="btn btn-primary" href="/adding">新增</a>
        </div>
    </div>



    <div class="row clearfix">
        <div class="col-md-12 column">
            <table class="table table-hover table-striped">
                <thead>
                <tr>
                    <th>书籍编号</th>
                    <th>书籍名字</th>
                    <th>书籍数量</th>
                    <th>书籍详情</th>
                    <th>删除</th>
                    <th>修改</th>
                </tr>
                </thead>

                <tbody>

<!--                这里是thymeleaf操作,回显所有的书籍。-->
                <tr th:each="book:${books}">

                    <td th:text="${book.getBookID()}"></td>
                    <!--/*@thymesVar id="getBookName" type=""*/-->
                    <td th:text="${book.getBookName()}"></td>
                    <td th:text="${book.getBookCounts()}"></td>
                    <td th:text="${book.getDetail()}"></td><!--                    这里是关联操作,关联该条数据的id-->
                    <td class="relative">
                        <a class="action-btn " th:href="@{/delBook?bookID=}+${book.getBookID()}">
                            <input type="button" value="删除">
                        </a>
                    </td>
<!--                    这里是关联操作,关联该条数据的id-->
                    <td class="relative">
                        <a class="action-btn " th:href="@{/update?bookID=}+${book.getBookID()}">
                            <input type="button" value="修改">
                        </a>
                    </td>



                </tr>
                </tbody>

            </table>
        </div>
    </div>
</div>

</body>
</html>

updateBook更新图书信息页面

<html xmlns:th="http://www.thymeleaf.org">
<head>
    <title>修改信息</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <!-- 引入 Bootstrap -->
    <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container">

    <div class="row clearfix">
        <div class="col-md-12 column">
            <div class="page-header">
                <h1>
                    <small>修改信息</small>
                </h1>
            </div>
        </div>
    </div>


<!--    这里的提交是提交的一个object数据,把页面所有的信息都提交走,这样的话便于后端处理-->
    <form action="/updateBook2" method="post" th:object="${demo}">
        <input type="hidden" name="bookID" th:value="${book.getBookID()}"/>
        书籍名称:<input type="text" name="bookName" th:value="${book.getBookName()}"/>
        书籍数量:<input type="text" name="bookCounts" th:value="${book.getBookCounts()}"/>
        书籍详情:<input type="text" name="detail" th:value="${book.getDetail()}"/>
        <input type="submit" value="提交">
    </form>

</div>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于SpringBoot的图书管理系统 的相关文章

随机推荐

  • SQL 后计算的利器 SPL

    目录 专业的结构化数据对象 强大的结构化数据计算能力 灵活的流程控制能力 优化体系结构 SPL资料 现代应用开发中 通常只用SQL实现简单的数据存取动作 而主要的计算过程和业务逻辑直接在应用程序中实现 主要原因在于 过于复杂的SQL很难调试
  • Python JS逆向篇(四)

    Python JS逆向篇 四 找到参数加密位置 跟进window asrsea函数 结果 扣取的js代码 扩展 逆向主题 某易云评论数据 请求时的加密参数 注 文章所涉及内容只做学习参考交流 不做除此之外的任何其它用途 找到参数加密位置 我
  • 解析XML文件时的嵌套异常SAXParseException

    解析XML文件时的嵌套异常SAXParseException 引言 XML 可扩展标记语言 是一种常用的数据格式 用于存储和传输结构化数据 在开发过程中 我们经常需要解析XML文件来获取其中的数据 然而 XML解析过程中可能会遇到各种异常情
  • 关于利用Qt编写应用程序的帮助文档

    转载请注明出处 关于利用Qt编写应用程序的帮助文档 首先推荐Qt官网的example 官网的例子讲的很细致很全面 不过官网的例子全是英文的 百度文库里有对这个例子的翻译 我也看了一下 感觉还不如去看英文的 好的言归正传 讲一下大概的步骤 1
  • node快速创建一个工程项目

    1 安装express npm install g express 2 新建一个工程 指定使用ejs模板引擎 express e 文件名 3 安装需要的模块 cd 文件名 npm install 4 启动 SET DEBUG 文件名 npm
  • Oracle学习(14)【DBA向】:利用DBCA创建Oracle数据库

    数据库管理任务 DBA 1 评测数据库服务器硬件 2 安装Oracle数据库软件 3 规划数据库 4 创建并且打开数据库 5 数据库备份 6 注册用户 7 实现数据库计划 8 全库备份 9 调整数据库性能 数据库规划 作为一名DBA 你必须
  • mac m1 安装 protobuf

    mac m1各种踩坑中 一 背景 mac m1 机器上使用golang grpc 二 安装流程 1 安装protobuf 注 已经安装了brew brew install protobuf 2 安装go的支持 go install goog
  • 用 Python 打造 AIGC 的「操作系统」

    carefree0910 carefree drawboard Infinite Drawboard in Python github com https github com carefree0910 carefree drawboard
  • 挖金矿问题(c++求解)

    n个金矿 共有w个工人 目前可以用的人数 F收益 F n w 递推函数 n个金矿 共有w个工人 目前可以用的人数 F收益 F n w 那么该问题的边界值如下 当w 0且w
  • 蓝桥杯 2019年号字串

    题目 试题 B 年号字串 问题描述 小明用字母 A 对应数字 1 B 对应 2 以此类推 用 Z 对应 26 对于 27以上的数字 小明用两位或更长位的字符串来对应 例如 AA 对应 27 AB 对应 28 AZ 对应 52 LQ 对应 3
  • C# 细说async/await的用法

    目录 一 引言 二 实例演示 2 1 多线程同步执行下载任务 任务完成后通知 2 2 异步执行下载任务 任务完成后通知 三 async await的用法 3 1 跨线程修改UI控件 3 2 异步获取数据 一 引言 首先先来区分一下 同步方法
  • Oracle VM VirtualBox在电脑上安装后只显示32位版本不显示64位版本的问题

    今天准备在Oracle VM VirtualBox上安装linux 结果安装Oracle VM VirtualBox后发现所有操作系统只能选择32位系统类型的 通过网络上寻找原因发现是电脑主板Bios里的V irtualization里设置
  • 憨批的语义分割重制版8——Keras 搭建自己的DeeplabV3+语义分割平台

    憨批的语义分割重制版8 Keras 搭建自己的DeeplabV3 语义分割平台 注意事项 学习前言 什么是DeeplabV3 模型 代码下载 DeeplabV3 实现思路 一 预测部分 1 主干网络介绍 2 加强特征提取结构 3 利用特征获
  • 对象数组题目 Student类

    package object oriented02 对象数组题目 定义类的Student 包含三个属性 学号为number 年级为state int 成绩为score int 创建20个学生对象 学号为1到20 年级和成绩都是随机产生 问题
  • 3.Mybatis 注解方式的基本用法

    Mybatis 也可以使用注解开发方式 这样我们就可以减少编写 Mapper映射文件了 下面介绍用户的增删改查 3 1 修改全局配置文件 在mybatis 全局文件中 通过package标签或者mapper标签的class属性加载mappe
  • 安装gcc-arm-none-eabi-10-2020-q4-major-win32工具(NRF52编译ECC加密文件用)

    gcc arm none eabi 10 2020 q4 major win32安装包下载 链接 https pan baidu com s 1NbpyI fQoKvMUuct0hruxA 提取码 ikeu 安装后环境变量配置 C Prog
  • Linux Capabilities

    Linux Capabilities 入门教程 基础实战篇 为了对 root 权限进行更细粒度的控制 实现按需授权 Linux 引入了另一种机制叫capabilities Capabilites 作为线程 Linux 并不真正区分进程和线程
  • Python创建excel,并写入数据

    usr bin env python coding utf 8 from base import pub param import os import xlrd xlwt from openpyxl reader excel import
  • python_matplotlib分别使用plot()和scatter()画散点图,以及如何改变点的大小

    1 使用plot 画散点图 根据关于matplotlip pyplot的官方文档 pyplot 其plot部分的解释plot 的作用是画出线条和线条上的标记 根据pyplot的官方教学文档 Pyplot tutorial 如果不改变其默认设
  • 基于SpringBoot的图书管理系统

    基于SpringBoot的图书管理系统 里面整合了比较全的内容 可以说是麻雀虽小五脏俱全 如果看懂了所有的内容可以说是已经非常精通SpringBoot了 一 引言 由于近期看了SpringBoot 一站式开发特别方便 情不自禁用Spring