学完MyBatis、Spring、SpringMVC,做一个基于SSM框架的基础项目–书籍管理系统,要求可以实现数据的增删改查,业务运行逻辑明了,分层开发,用来巩固学习
目标:- 配置SSM框架
- 实现基础的增删改查功能
- 具备后续方便的拓展功能
- 界面设计整洁
最终效果:
-
全部书籍页面
-
新增书籍页面
-
查询书籍页面
环境:
开发环境
环境:
- IDEA 2021.2.1
- MySQL 8
- Tomcat 9
- Maven 3.8
数据库环境
创建一个存放书籍数据的数据库表
数据库ssmbuild 书籍信息表books 主键bookID自动增长 所有字段都不能为空
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` VARCHAR(200) NOT NULL COMMENT '描述',
KEY `bookID` (`bookID`)
) ENGINE = INNODB
DEFAULT CHARSET = utf8;
-- 插入数据
INSERT INTO `books`(`bookID`, `bookName`, `bookCounts`, `detail`)
VALUES (1, 'JAVA', 34, '从入门到放弃'),
(2, 'MySQL', 23, '从删库到跑路'),
(3, 'Linux', 33, '从进门到进牢')
项目结构 项目搭建基本环境搭建
-
新建一个Maven项目 ssmbuild , 添加JavaWeb框架的支持
-
在pom文件中导入所需依赖
junit junit 4.13.2 mysql mysql-connector-java 8.0.26 com.mchange c3p0 0.9.5.5 javax.servlet servlet-api 2.5 javax.servlet.jsp jsp-api 2.2 javax.servlet jstl 1.2 org.mybatis mybatis 3.5.7 org.mybatis mybatis-spring 2.0.6 org.springframework spring-webmvc 5.3.11 org.springframework spring-jdbc 5.3.11 org.aspectj aspectjweaver 1.9.7 org.projectlombok lombok 1.18.22 log4j log4j 1.2.17 -
配置项目依赖
-
Maven资源过滤设置
src/main/java ***.xml false src/main/resources ***.xml false -
建立基本结构和配置框架
-
编写java代码
-
编写数据库对应的实体类 pojo.Books.java (注:这里使用了Lombok插件)
@Data @AllArgsConstructor @NoArgsConstructor public class Books { private int bookID; private String bookName; private int bookCounts; private String detail; } -
编写Mapper接口 mapper/BookMapper.java
public interface BookMapper { // 增加 int insertBook(Books books); // 删除 int deleteBook(@Param("bookId") int id); // 修改 int updateBook(Books books); // ID查询 Books queryBookById(int id); // 查询全部 ListqueryAllBook(); // 模糊查询 List queryBookName(@Param("bookName") String bookName); } -
编写Mapper接口对应的XML文件
INSERT INTO ssmbuild.books(bookName, bookCounts, detail) VALUES (#{bookName}, #{bookCounts}, #{detail}); DELETE FROM ssmbuild.books WHERe bookID = #{bookId}; UPDATE ssmbuild.books SET bookName=#{bookName}, bookCounts=#{bookCounts}, detail=#{detail} WHERe bookID = #{bookID}; -
编写Service层接口 service/BookService.java
public interface BookService { // 增加 int insertBook(Books books); // 删除 int deleteBook(@Param("bookId") int id); // 修改 int updateBook(Books books); // ID查询 Books queryBookById(int id); // 查询全部 ListqueryAllBook(); // 查询全部 List queryBookName(String bookName); } -
编写Service层接口实现类 service/BookServiceImpl.java
public class BookServiceImpl implements BookService { // 配置LOG4J private static final Logger logger = Logger.getLogger(BookServiceImpl.class); // service调用mapper层 private BookMapper bookMapper; public void setBookMapper(BookMapper bookMapper) { this.bookMapper = bookMapper; } @Override public int insertBook(Books books) { return bookMapper.insertBook(books); } @Override public int deleteBook(int id) { return bookMapper.deleteBook(id); } @Override public int updateBook(Books books) { return bookMapper.updateBook(books); } @Override public Books queryBookById(int id) { return bookMapper.queryBookById(id); } @Override public ListqueryAllBook() { return bookMapper.queryAllBook(); } @Override public List queryBookName(String bookName) { return bookMapper.queryBookName(bookName); } } -
编写控制层 controller/BookController.java
import com.codeonce.pojo.Books; import com.codeonce.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.PathVariable; 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 queryAll(Model model) { ListbooksList = bookService.queryAllBook(); model.addAttribute("booksList", booksList); return "allBook"; } // 跳转到增加书籍页面 @RequestMapping("/toAddBook") public String toAddBookPaper() { return "addBook"; } // 添加书籍的请求 @RequestMapping("/addBook") public String insertBook(Books books) { System.out.println("addBook=>" + books); int result = bookService.insertBook(books); if (result > 0) { System.out.println("添加数据成功" + books); } return "redirect:/book/allBook"; } // 跳转到修改书籍页面 @RequestMapping("/toUpdateBook/{bookID}") public String toUpdateBookPaper(@PathVariable("bookID") int id, Model model) { Books books = bookService.queryBookById(id); model.addAttribute("books", books); return "updateBook"; } // 修改书籍请求 @RequestMapping("/updateBook") public String updateBook(Books books) { System.out.println("updateBook=>" + books); int result = bookService.updateBook(books); if (result > 0) { System.out.println("修改数据成功" + books); } return "redirect:/book/allBook"; } // 删除书籍请求 @RequestMapping("/deleteBook/{bookID}") public String deleteBook(@PathVariable("bookID") int id) { int result = bookService.deleteBook(id); if (result > 0) { System.out.println("删除数据成功" + id); } return "redirect:/book/allBook"; } // 查询书籍 @RequestMapping("/queryBook") public String queryBook(String bookName, Model model) { // bookName = "%" + bookName + "%"; List booksList = bookService.queryBookName(bookName); System.err.println("queryBook" + booksList); model.addAttribute("booksList", booksList); return "allBook"; } }
-
-
配置文件
-
数据库参数配置文件 resources/database.properties
jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/ssmbuild?useSSL=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai jdbc.username=root jdbc.password=admin
-
LOG4J日志配置文件 resources/log4j.properties
# 将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码 log4j.rootLogger=DEBUG,console,file # 控制台输出的相关设置 log4j.appender.console=org.apache.log4j.ConsoleAppender log4j.appender.console.Target=System.out log4j.appender.console.Threshold=DEBUG log4j.appender.console.layout=org.apache.log4j.PatternLayout log4j.appender.console.layout.ConversionPattern=[%c]-%m%n log4j.appender.Console.encoding=UTF-8 # 文件输出的相关设置 log4j.appender.file=org.apache.log4j.RollingFileAppender log4j.appender.file.File=./log/com.mydemo.log log4j.appender.file.MaxFileSize=10mb log4j.appender.file.Threshold=DEBUG log4j.appender.file.layout=org.apache.log4j.PatternLayout log4j.appender.file.layout.ConversionPattern=[%p][%d{yyyy-MM-dd}][%c]%m%n log4j.appender.file.encoding=UTF-8 # 日志输出级别 log4j.logger.org.mybatis=DEBUG log4j.logger.java.sql=DEBUG log4j.logger.java.sql.Statement=DEBUG log4j.logger.java.sql.ResultSet=DEBUG log4j.logger.java.sql.PreparedStatement=DEBUG -
写dao层操作配置文件 resources/spring-dao.xml
-
写service层操作配置文件 resources/spring-service.xml
-
写MVC操作配置文件 resources/spring-mvc.xml
-
mybatis框架配置 resources/mybatis-config.xml
-
导入所有配置文件 resources/applicationContext.xml
-
在web.xml 中绑定配置 web/WEB-INF/web.xml
DispatcherServlet org.springframework.web.servlet.DispatcherServlet contextConfigLocation classpath:applicationContext.xml 1 DispatcherServlet / encodingFilter org.springframework.web.filter.CharacterEncodingFilter encoding utf-8 encodingFilter /* 15
-
-
JSP页面
-
index.jsp 跳转页面 web/index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>跳转页面 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; } 点击进入列表页 -
书籍列表JSP web/WEB-INF/jsp/allBook.jsp (集成查询所有和模糊查询)
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %>书籍列表 书籍列表 —— 显示所有书籍 <%--新增--%> 全部书籍 新增书籍 <%--查询--%>书籍编号 书籍名字 书籍数量 书籍详情 操作 ${book.bookID} ${book.bookName} ${book.bookCounts} ${book.detail} 更改 | 删除 -
新增书籍页面 web/WEB-INF/jsp/addBook.jsp
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %>新增书籍 新增书籍 -
更新书籍JSP页面 web/WEB-INF/jsp/updateBook.jsp (此处可以使用新增书籍页面复用)
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %>总结修改书籍 修改书籍- 代码还有很多地方可以改进 比如页面代码复用 方法复用 动态SQL
- 后续进行项目拓展都可以基于需求进行增加mapper接口



