SSM框架速成4:图书馆管理系统(SSM实战)
创始人
2024-04-07 02:02:25
0

学完了三个框架,现在来整合一下SSM,并且实现一个图书馆增删改查的简单项目。
这个整合就是实现简单的CRUD,整合的过程中多复习有关于之前的一些知识和思想,本身并不难,只是可能再配置的过程中会出现很多问题,在SSM框架学完就立刻整合项目也算是锻炼自己的能力了。

之后还会再整合一个搜索的功能,这个功能会在本次的实战基础上修改代码,待更新中…

目录

  • 数据库环境
  • 基本环境搭建
  • Mybatis层
  • Spring层
  • SpringMVC层
  • 测试
    • 报错解决思路
  • 查询书籍功能
  • 添加书籍功能
  • 修改删除书籍
  • 增删改查视频效果

数据库环境

创建一个存放书籍数据的数据库表:

CREATE DATABASE `ssmbuild`;USE `ssmbuild`;CREATE TABLE `books` (`bookID` INT(10) NOT NULL AUTO_INCREMENT COMMENT '书id',`bookName` VARCHAR(100) NOT NULL COMMENT '书名',`bookCounts` INT(11) NOT NULL COMMENT '数量',`detail` VARCHA`books`R(200) NOT NULL COMMENT '描述',KEY `bookID` (`bookID`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;INSERT  INTO `books`(`bookID`,`bookName`,`bookCounts`,`detail`)VALUES 
(1,'Java',1,'从入门到放弃'),
(2,'MySQL',10,'从删库到跑路'),
(3,'Linux',5,'从进门到进牢');DROP TABLE IF EXISTS `books`;

除了最后一句其他都运行,成功建表:
在这里插入图片描述

基本环境搭建

1、新建一个普通的maven项目
2、添加web的支持,且给web手动添加lib依赖
3、导入相关的pom依赖

junitjunit3.8.2mysqlmysql-connector-java8.0.11com.mchangec3p00.9.5.2javax.servletservlet-api2.5javax.servlet.jspjsp-api2.2javax.servletjstl1.2org.mybatismybatis3.5.2org.mybatismybatis-spring2.0.2org.springframeworkspring-webmvc5.1.9.RELEASEorg.springframeworkspring-jdbc5.1.9.RELEASE

4、添加Maven的资源过滤设置

src/main/resources**/*.properties**/*.xmlsrc/main/java**/*.properties**/*.xmltrue

5、连接数据库(记得Driver调整为5.0版本的,具体看之前的有关于mybatis的文章)
在这里插入图片描述
6、构建基本结构和框架:
(1)载java包下创建4个package
com.wang.pojo
com.wang.service
com.wang.dao
com.wang.controller

(2)在resources下创建applicationContext.xml、mybatis-config.xml并配置
applicationContext.xml:



mybatis-config.xml:




Mybatis层

1、在resources包下创建数据库配置文件database.properties:

jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssmbuild?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
jdbc.username=root
jdbc.password=123456

如果你的MySQL是5.7版本的,那么就需要把cj给去掉

2、在pojo包下新建实体类,这个实体类对照数据库,即Books,里面的属性要和数据库上的属性名完全一样,否则有时候可能会报空指针异常。

当然,类里面也是需要构造函数的,可以自己写构造方法,也可以利用Lombok,然后用注解进行参数的构造,先导入相应的pom依赖:

lombok依赖:

org.projectlomboklombok1.18.10

Books类:

package com.wang.pojo;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Data
@AllArgsConstructor
@NoArgsConstructor
public class Books {private int bookID;private String bookName;private int bookCounts;private String detail;
}

3、接下来该写接口了,在dao层下接口BookMapper,分别封装增删改查的方法:

package com.wang.dao;import com.wang.pojo.Books;
import org.apache.ibatis.annotations.Param;import java.util.List;public interface BookMapper {//增加一本书int addBook(Books books);//删除一本书int deleteBookById(@Param("bookID") int id);//更新一本书int updateBook(Books books);//查询一本书Books queryBookById(@Param("bookID") int id);//查询全部的书List queryAllBooks();
}

4、学了mybatis以后,实现这些接口的方法直接用Mapper.xml来做,在dao包下面新建BooksMapper.xml:



insert into ssmbuild.books (bookName, bookCounts, detail)values (#{bookName},#{bookCounts},#{detail})delete from ssmbuild.bookswhere bookID=#{bookID}update ssmbuild.booksset bookName=#{bookName},bookCounts=#{bookCounts},detail=#{detail}where bookID=#{bookID}

5、编写mybatis的核心配置文件,取别名,并进行mapper的注册:




6、开始写service层,新建接口和Impl实现类,把dao注入到其中,然后调用方法,具体如下:
(1)BookService接口:

package com.wang.service;import com.wang.pojo.Books;import java.util.List;public interface BookService {//增加一本书int addBook(Books books);//删除一本书int deleteBookById(int id);//更新一本书int updateBook(Books books);//查询一本书Books queryBookById(int id);//查询全部的书List queryAllBooks();
}

(2)BookServiceImpl类:

package com.wang.service;import com.wang.dao.BookMapper;
import com.wang.pojo.Books;import java.util.List;public class BookServiceImpl implements BookService{//service层调dao层,组合daoprivate BookMapper bookMapper;public void setBookMapper(BookMapper bookMapper) {this.bookMapper = bookMapper;}@Overridepublic int addBook(Books books) {return bookMapper.addBook(books);}@Overridepublic int deleteBookById(int id) {return bookMapper.deleteBookById(id);}@Overridepublic int updateBook(Books books) {return bookMapper.updateBook(books);}@Overridepublic Books queryBookById(int id) {return bookMapper.queryBookById(id);}@Overridepublic List queryAllBooks() {return bookMapper.queryAllBooks();}
}

到这里,终于把Mybatis层配完了

Spring层

1、在resources下新建spring-dao.xml:



2、整合service层,因为service层有个很重要的东西:事务。
在resources下新建spring-service.xml:



3、最后再applicationContext.xml中导入两个配置:



SpringMVC层

1、首先这已经是一个有web框架支持的项目了,那么我们就直接在web.xml中配置DispatchServlet以及解决乱码的过滤:


springmvcorg.springframework.web.servlet.DispatcherServletcontextConfigLocationclasspath:applicationContext.xml1springmvc/encodingFilterorg.springframework.web.filter.CharacterEncodingFilterencodingutf-8encodingFilter/*15

2、在resources下新建spring-mvc.xml:



最后记得在applicationContext.xml中导入这个resource:


3、最后一步只需要在WEB-INF下面新建一个jsp的包即可,整个项目的配置到现在构建完毕。

这个最好能够保存下来,以后这个就可以作为做项目的底层了!

测试

我认为这是很重要的一部分,要锻炼自己的纠错能力,那么我们需要进行一下测试:
(1)在controller包下新建BookController类:

package com.wang.controller;import com.wang.pojo.Books;
import com.wang.service.BookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;import java.util.List;@Controller
@RequestMapping("/book")
public class BookController {//controller层调用service层@Autowired@Qualifier("BookServiceImpl")private BookService bookService;//查询全部的书籍,并且返回到一个书籍展示页面@RequestMapping("/allBook")public String list(Model model){List list = bookService.queryAllBooks();model.addAttribute("list",list);return "allBook";}}

(2)直接在WEB-INF下新建jsp的包,新建allBook.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

书籍展示页面


书籍展示

(3)修改一下index.jsp的内容,这个页面即为首页,我们用页面跳转来访问allBook.jsp的内容:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
首页

进入书籍页面

正确的运行结果应该为:
在这里插入图片描述
点击链接后,页面成功跳转:
在这里插入图片描述

报错解决思路

1、查看有没有lib包且导入全部依赖
2、查看bean是否注入成功
3、Junit测试单元,看我们的代码能否查询出结果:
在test-java中新建MyTest类:

import com.wang.pojo.Books;
import com.wang.service.BookService;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class MyTest{@Testpublic void test(){ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");BookService bookServiceImpl = (BookService) context.getBean("BookServiceImpl");for (Books books : bookServiceImpl.queryAllBooks()) {System.out.println(books);}}
}

在这里插入图片描述
4、那么可以知道出问题的是Spring,因为底层的东西并没有报错,正常返回正确的结果,接下来只需要检查web.xml文件中的servlet初始化是否有问题,init-param标签内的value值改为:classpath:applicationContext.xml即可。

查询书籍功能

我们接着要开始写各个功能,并且要返回出好看的让客户看的可视化界面,那么首先先修改一下首页的样式,我们可以修改h3和a的style样式:


接着我们要开始编写allBook.jsp页面,利用BootStrap来优化界面,并且真正实现显示全部书籍。

该代码为:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

书籍展示页面<%--BootSrap美化界面--%>

书籍列表 —— 显示所有书籍

<%-- 书籍从数据库中查询出来,从这个list中遍历出来,利用foreach --%>
书籍编号书籍名称书籍数量书籍详情
${book.bookID}${book.bookName}${book.bookCounts}${book.detail}

添加书籍功能

后序的功能和之前的原理差不多,首先我们的首页都必须含有各功能的链接的跳转,要跳转的内容我们在controller层进行编程,即面向controller层编程。

(1)先向allBook.jsp内加上代码:

<%--toAddBook--%>新增书籍

2、直接面向controller层编程,既要能够实现新增书籍,还需要增加书籍以后要能够跳转回全部书籍页面,利用重定向即可实现:

//跳转到增加书籍页面:@RequestMapping("/toAddBook")public String toAddPaper(){return "addBook";}//添加书籍的请求@RequestMapping("/addBook")public String addBook(Books books){//System.out.println();bookService.addBook(books);return "redirect:/book/allBook";//重定向到我们的@RequestMapping("/allBook")}

3、我们只需要在addBook.jsp中写一个表单,提交写的请求即可。

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>

书籍展示页面<%--BootSrap美化界面--%>

书籍列表 —— 显示所有书籍

<%--toAddBook--%>新增书籍
<%-- 书籍从数据库中查询出来,从这个list中遍历出来,利用foreach --%>
书籍编号书籍名称书籍数量书籍详情
${book.bookID}${book.bookName}${book.bookCounts}${book.detail}

功能简单,也就是加了一本书而已,页面重定向成功且数据库中的表确实有新增的书籍,成功。

修改删除书籍

也就是在总的页面的table控件中新增一下修改和删除的选项,但是我们需要注意的是,当我们在修改额删除书籍的时候,由于书的ID是隐藏的,也就是说并没有这么一个传值的过程,那么我们就需要利用到隐藏域的知识,用隐藏域的手段来实现传入ID值,最后实现功能。

BookController.java:

	//跳转到修改页面@RequestMapping("/toUpdateBook")public String toUpdateBook(Model model, int id) {Books books = bookService.queryBookById(id);//System.out.println(books);model.addAttribute("QBook",books);return "updateBook";}//响应修改的请求@RequestMapping("/updateBook")public String updateBook(Books books) {//System.out.println(book);bookService.updateBook(books);return "redirect:/book/allBook";}//删除的代码使用了RestFul风格@RequestMapping("/deleteBook/{bookID}")public String deleteBook(@PathVariable("bookID") int id){bookService.deleteBookById(id);return "redirect:/book/allBook";}

allbook.jsp的table将会写入操作的连接:

更改 |<%--这里将使用RestFul风格--%>删除

别忘了表头tr也得在前面写上。

updateBook.jsp:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>

修改书籍<%--BootSrap美化界面--%>


修改书籍

<%--书籍表单--%>
<%-- 可能出现的问题是即便提交了修改的SQL请求,但是修改失败,可以先考虑是事务的问题,配置完毕后依旧失败 --%><%-- 那么看一下SQL语句能否执行成功,发现无法成功,因为没传入ID --%><%-- 那么我们利用前端来传递隐藏域 --%>

增删改查视频效果

图书馆系统增删改查

相关内容

热门资讯

银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
AWSECS:访问外部网络时出... 如果您在AWS ECS中部署了应用程序,并且该应用程序需要访问外部网络,但是无法正常访问,可能是因为...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
AWSElasticBeans... 在Dockerfile中手动配置nginx反向代理。例如,在Dockerfile中添加以下代码:FR...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
月入8000+的steam搬砖... 大家好,我是阿阳 今天要给大家介绍的是 steam 游戏搬砖项目,目前...
​ToDesk 远程工具安装及... 目录 前言 ToDesk 优势 ToDesk 下载安装 ToDesk 功能展示 文件传输 设备链接 ...
北信源内网安全管理卸载 北信源内网安全管理是一款网络安全管理软件,主要用于保护内网安全。在日常使用过程中,卸载该软件是一种常...
AWS管理控制台菜单和权限 要在AWS管理控制台中创建菜单和权限,您可以使用AWS Identity and Access Ma...