马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
1、环境要求
- IDEA
- MySQL 8.x
- Tomcat 9
- Maven 3.6
这只是大型软件要求,项目相关的jar包依赖将在Maven中配置。
项目前置技能:MySQL、Mybatis、Spring、JavaWeb、简单的前端知识。
2、数据库表
创建一个存放书籍数据的数据库表- CREATE DATABASE `ssmbuild`;
- USE `ssmbuild`;
- DROP TABLE IF EXISTS `books`;
- 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', 1, '从入门到放弃'),
- (2, 'MySQL', 10, '从删库到跑路'),
- (3, 'Linux', 5, '从进门到进牢');
复制代码 3、基本项目搭建
新建Maven项目,SpringMVC-06-SSM,添加web框架支持。
编写pom.xml,导入依赖- <dependencies>
-
- <dependency>
- <groupId>junit</groupId>
- <artifactId>junit</artifactId>
- <version>4.12</version>
- </dependency>
-
- <dependency>
- <groupId>org.projectlombok</groupId>
- <artifactId>lombok</artifactId>
- <version>1.18.32</version>
- </dependency>
-
- <dependency>
- <groupId>mysql</groupId>
- <artifactId>mysql-connector-java</artifactId>
- <version>8.0.16</version>
- </dependency>
-
- <dependency>
- <groupId>com.mchange</groupId>
- <artifactId>c3p0</artifactId>
- <version>0.9.5.2</version>
- </dependency>
-
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>servlet-api</artifactId>
- <version>2.5</version>
- </dependency>
- <dependency>
- <groupId>javax.servlet.jsp</groupId>
- <artifactId>jsp-api</artifactId>
- <version>2.1</version>
- </dependency>
- <dependency>
- <groupId>javax.servlet</groupId>
- <artifactId>jstl</artifactId>
- <version>1.2</version>
- </dependency>
-
- <dependency>
- <groupId>org.mybatis</groupId>
- <artifactId>mybatis</artifactId>
- <version>3.5.2</version>
- </dependency>
- <dependency>
- <groupId>org.mybatis</groupId>
- <artifactId>mybatis-spring</artifactId>
- <version>2.1.2</version>
- </dependency>
-
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-webmvc</artifactId>
- <version>5.2.12.RELEASE</version>
- </dependency>
- <dependency>
- <groupId>org.springframework</groupId>
- <artifactId>spring-jdbc</artifactId>
- <version>5.2.12.RELEASE</version>
- </dependency>
- <dependency>
- <groupId>org.aspectj</groupId>
- <artifactId>aspectjweaver</artifactId>
- <version>1.9.4</version>
- </dependency>
- </dependencies>
复制代码 创建基本结构和配置框架
- com.moondream.controller 控制层
- com.moondream.service 服务层
- com.moondream.dao 持久层
- com.moondream.pojo 实体类
- web/WEB-INF/jsp 视图层
- resources
- mybatis-config.xml Mybatis核心配置文件
- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE configuration
- PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
- "https://mybatis.org/dtd/mybatis-3-config.dtd">
- <configuration>
- <settings>
- <setting name="logImpl" value="STDOUT_LOGGING"/>
- </settings>
- <typeAliases>
- <package name=""/>
- </typeAliases>
- <mappers>
- <mapper resource=""/>
- </mappers>
- </configuration>
复制代码 - applicationContext.xml Spring全局配置文件
- [/code]
- [/list]
- [/list]
- [size=5]4、Mybatis层(DAO层)[/size]
- 数据库配置文件 [b]db.properties[/b]
- [code]driver=com.mysql.cj.jdbc.Driver
- url=jdbc:mysql://localhost:3306/ssmbuild?useSSL=false&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
- user=root
- password=123456
复制代码 编写数据库表对应的实体类,使用Lombok依赖减少代码量- package com.moondream.pojo;
- import lombok.AllArgsConstructor;
- import lombok.Data;
- import lombok.NoArgsConstructor;
- @Data
- @AllArgsConstructor
- @NoArgsConstructor
- public class Book {
- private Integer bookID;
- private String bookName;
- private Integer bookCounts;
- private String detail;
- }
复制代码 编写MyBatis的核心配置文件 mybatis-config.xml- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE configuration
- PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
- "https://mybatis.org/dtd/mybatis-3-config.dtd">
- <configuration>
- <settings>
- <setting name="logImpl" value="STDOUT_LOGGING"/>
- </settings>
- <typeAliases>
- <package name=""/>
- </typeAliases>
- <mappers>
- <mapper resource=""/>
- </mappers>
- </configuration>
复制代码 编写Mybatis的mapper映射文件 BookMapper.xml- <?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="com.moondream.dao.BookMapper">
-
- <insert id="addBook">
- insert into ssmbuild.books
- values (#{bookID}, #{bookName}, #{bookCounts}, #{detail});
- </insert>
-
- <delete id="deleteBookById">
- delete
- from ssmbuild.books
- where bookID = #{bookID};
- </delete>
-
- <update id="updateBook">
- update ssmbuild.books
- set bookName=#{bookName},
- bookCounts=#{bookCounts},
- detail=#{detail}
- where bookID = #{bookID};
- </update>
-
- <select id="queryAllBook" resultType="Book">
- select *
- from ssmbuild.books;
- </select>
-
- <select id="queryBookById" resultType="Book">
- select *
- from ssmbuild.books
- where bookID = #{bookID}
- </select>
- </mapper>
复制代码 编写mapper映射文件对应的接口,可以更方便的调用Mybatis- package com.moondream.dao;
- import com.moondream.pojo.Book;
- import java.util.List;
- public interface BookMapper {
- //增加一个Book
- int addBook(Book book);
- //根据id删除一个Book
- Integer deleteBookById(Integer id);
- //更新Book
- Integer updateBook(Book Book);
- //根据id查询,返回一个Book
- Book queryBookById(Integer id);
- //查询全部Book,返回list集合
- List<Book> queryAllBook();
- }
复制代码 编写 spring-dao.xml,把Mybatis整合进Spring- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE configuration
- PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
- "https://mybatis.org/dtd/mybatis-3-config.dtd">
- <configuration>
- <settings>
- <setting name="logImpl" value="STDOUT_LOGGING"/>
- </settings>
- <typeAliases>
- <package name=""/>
- </typeAliases>
- <mappers>
- <mapper resource=""/>
- </mappers>
- </configuration><?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE configuration
- PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
- "https://mybatis.org/dtd/mybatis-3-config.dtd">
- <configuration>
- <settings>
- <setting name="logImpl" value="STDOUT_LOGGING"/>
- </settings>
- <typeAliases>
- <package name=""/>
- </typeAliases>
- <mappers>
- <mapper resource=""/>
- </mappers>
- </configuration><?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE configuration
- PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
- "https://mybatis.org/dtd/mybatis-3-config.dtd">
- <configuration>
- <settings>
- <setting name="logImpl" value="STDOUT_LOGGING"/>
- </settings>
- <typeAliases>
- <package name=""/>
- </typeAliases>
- <mappers>
- <mapper resource=""/>
- </mappers>
- </configuration><?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE configuration
- PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
- "https://mybatis.org/dtd/mybatis-3-config.dtd">
- <configuration>
- <settings>
- <setting name="logImpl" value="STDOUT_LOGGING"/>
- </settings>
- <typeAliases>
- <package name=""/>
- </typeAliases>
- <mappers>
- <mapper resource=""/>
- </mappers>
- </configuration><?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE configuration
- PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
- "https://mybatis.org/dtd/mybatis-3-config.dtd">
- <configuration>
- <settings>
- <setting name="logImpl" value="STDOUT_LOGGING"/>
- </settings>
- <typeAliases>
- <package name=""/>
- </typeAliases>
- <mappers>
- <mapper resource=""/>
- </mappers>
- </configuration>
复制代码 到此,持久层编写完毕!
5、Spring层(Service层)
编写业务接口和接口实现- package com.moondream.service;
- import com.moondream.pojo.Book;
- import java.util.List;
- //BookService: 需要具体实现,调用dao层
- public interface BookService {
- //增加一个Book
- Integer addBook(Book book);
- //根据id删除一个Book
- Integer deleteBookById(Integer id);
- //更新Book
- Integer updateBook(Book Book);
- //根据id查询,返回一个Book
- Book queryBookById(Integer id);
- //查询全部Book,返回list集合
- List<Book> queryAllBook();
- }
复制代码- package com.moondream.service;
- import com.moondream.dao.BookMapper;
- import com.moondream.pojo.Book;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Service;
- import java.util.List;
- @Service
- public class BookServiceImpl implements BookService {
- //调用dao层
- @Autowired
- private BookMapper bookMapper;
- public Integer addBook(Book book) {
- return bookMapper.addBook(book);
- }
- public Integer deleteBookById(Integer id) {
- return bookMapper.deleteBookById(id);
- }
- public Integer updateBook(Book Book) {
- return bookMapper.updateBook(Book);
- }
- public Book queryBookById(Integer id) {
- return bookMapper.queryBookById(id);
- }
- public List<Book> queryAllBook() {
- return bookMapper.queryAllBook();
- }
- }
复制代码 编写 spring-service.xml ,Spring的service层配置文件- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE configuration
- PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
- "https://mybatis.org/dtd/mybatis-3-config.dtd">
- <configuration>
- <settings>
- <setting name="logImpl" value="STDOUT_LOGGING"/>
- </settings>
- <typeAliases>
- <package name=""/>
- </typeAliases>
- <mappers>
- <mapper resource=""/>
- </mappers>
- </configuration><?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE configuration
- PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
- "https://mybatis.org/dtd/mybatis-3-config.dtd">
- <configuration>
- <settings>
- <setting name="logImpl" value="STDOUT_LOGGING"/>
- </settings>
- <typeAliases>
- <package name=""/>
- </typeAliases>
- <mappers>
- <mapper resource=""/>
- </mappers>
- </configuration><?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE configuration
- PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
- "https://mybatis.org/dtd/mybatis-3-config.dtd">
- <configuration>
- <settings>
- <setting name="logImpl" value="STDOUT_LOGGING"/>
- </settings>
- <typeAliases>
- <package name=""/>
- </typeAliases>
- <mappers>
- <mapper resource=""/>
- </mappers>
- </configuration>
复制代码 服务层编写完毕!
6、SpringMVC层(Controller层)
由于 Controller层 需要不断的与 View层 举行联动,
以是当我们编写完Controller层,实在View层也已经完成的差不多了。
编写 web.xml- <?xml version="1.0" encoding="UTF-8"?>
- <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
- version="4.0">
- <servlet>
- <servlet-name>DispatcherServlet</servlet-name>
- <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
- <init-param>
- <param-name>contextConfigLocation</param-name>
-
- <param-value>classpath:applicationContext.xml</param-value>
- </init-param>
- <load-on-startup>1</load-on-startup>
- </servlet>
- <servlet-mapping>
- <servlet-name>DispatcherServlet</servlet-name>
- <url-pattern>/</url-pattern>
- </servlet-mapping>
-
- <filter>
- <filter-name>EncodingFilter</filter-name>
- <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
- <init-param>
- <param-name>encoding</param-name>
- <param-value>utf-8</param-value>
- </init-param>
- </filter>
- <filter-mapping>
- <filter-name>EncodingFilter</filter-name>
- <url-pattern>/*</url-pattern>
- </filter-mapping>
-
- <session-config>
- <session-timeout>15</session-timeout>
- </session-config>
- </web-app>
复制代码 编写 spring-controller.xml ,Spring的Controller层配置- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE configuration
- PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
- "https://mybatis.org/dtd/mybatis-3-config.dtd">
- <configuration>
- <settings>
- <setting name="logImpl" value="STDOUT_LOGGING"/>
- </settings>
- <typeAliases>
- <package name=""/>
- </typeAliases>
- <mappers>
- <mapper resource=""/>
- </mappers>
- </configuration>
复制代码 配置文件,暂时结束!现在举行 Controller层 和 View层 编写
BookController 类编写 , 方法一:查询全部书籍- package com.moondream.controller;
- @Controller
- @RequestMapping("/book")
- public class BookController {
- @Autowired
- private BookService bookService;
- @RequestMapping("/allBook")
- public String list(Model model) {
- List<Book> list = bookService.queryAllBook();
- model.addAttribute("list", list);
- return "allBook";
- }
- }
复制代码 编写首页 index.jsp- <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
- <!DOCTYPE HTML>
- <html>
- <head>
- <title>首页</title>
-
- </head>
- <body>
- <h3>
- <a target="_blank" href="https://www.cnblogs.com/${pageContext.request.contextPath}/book/allBook">点击进入列表页</a>
- </h3>
- </body>
- </html>
复制代码 书籍列表页面 allbook.jsp- 书籍列表<?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE configuration
- PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
- "https://mybatis.org/dtd/mybatis-3-config.dtd">
- <configuration>
- <settings>
- <setting name="logImpl" value="STDOUT_LOGGING"/>
- </settings>
- <typeAliases>
- <package name=""/>
- </typeAliases>
- <mappers>
- <mapper resource=""/>
- </mappers>
- </configuration> [size=6] 书籍列表 —— 显示所有书籍 [/size]
- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE configuration
- PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
- "https://mybatis.org/dtd/mybatis-3-config.dtd">
- <configuration>
- <settings>
- <setting name="logImpl" value="STDOUT_LOGGING"/>
- </settings>
- <typeAliases>
- <package name=""/>
- </typeAliases>
- <mappers>
- <mapper resource=""/>
- </mappers>
- </configuration>[url=https://www.cnblogs.com/${pageContext.request.contextPath}/book/toAddBook]新增[/url] [table] [tr] 书籍编号 书籍名字 书籍数目 书籍详情 操作 [/tr]<?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE configuration
- PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
- "https://mybatis.org/dtd/mybatis-3-config.dtd">
- <configuration>
- <settings>
- <setting name="logImpl" value="STDOUT_LOGGING"/>
- </settings>
- <typeAliases>
- <package name=""/>
- </typeAliases>
- <mappers>
- <mapper resource=""/>
- </mappers>
- </configuration> [tr] [td]${book.getBookID()}[/td] [td]${book.getBookName()}[/td] [td]${book.getBookCounts()}[/td] [td]${book.getDetail()}[/td] [td] [url=https://www.cnblogs.com/${pageContext.request.contextPath}/book/toUpdateBook?id=${book.getBookID()}]更改[/url] | [url=https://www.cnblogs.com/${pageContext.request.contextPath}/book/del/${book.getBookID()}]删除[/url] [/td] [/tr] [/table]
复制代码 BookController 类编写 , 方法二:添加书籍- @RequestMapping("/toAddBook")
- public String toAddPaper() {
- return "addBook";
- }
- @RequestMapping("/addBook")
- public String addPaper(Book book) {
- System.out.println(book);
- bookService.addBook(book);
- return "redirect:/book/allBook";
- }
复制代码 添加书籍 页面:addBook.jsp- 新增书籍<?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE configuration
- PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
- "https://mybatis.org/dtd/mybatis-3-config.dtd">
- <configuration>
- <settings>
- <setting name="logImpl" value="STDOUT_LOGGING"/>
- </settings>
- <typeAliases>
- <package name=""/>
- </typeAliases>
- <mappers>
- <mapper resource=""/>
- </mappers>
- </configuration> [size=6] 新增书籍 [/size]
- 书籍名称:
- 书籍数目:
- 书籍详情:
-
复制代码 BookController 类编写 , 方法三:修改书籍- @RequestMapping("/toUpdateBook")
- public String toUpdateBook(Model model, Integer id) {
- Book book = bookService.queryBookById(id);
- System.out.println(book);
- model.addAttribute("book", book);
- return "updateBook";
- }
- @RequestMapping("/updateBook")
- public String updateBook(Book book) {
- System.out.println(book);
- bookService.updateBook(book);
- return "redirect:/book/allBook";
- }
复制代码 修改书籍 页面 updateBook.jsp- 修改信息<?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE configuration
- PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
- "https://mybatis.org/dtd/mybatis-3-config.dtd">
- <configuration>
- <settings>
- <setting name="logImpl" value="STDOUT_LOGGING"/>
- </settings>
- <typeAliases>
- <package name=""/>
- </typeAliases>
- <mappers>
- <mapper resource=""/>
- </mappers>
- </configuration> [size=6] 修改信息 [/size]
- 书籍名称: 书籍数目: 书籍详情:
复制代码 BookController 类编写 , 方法四:删除书籍- @RequestMapping("/del/{bookId}")
- public String deleteBook(@PathVariable Integer bookId) {
- bookService.deleteBookById(bookId);
- return "redirect:/book/allBook";
- }
复制代码 Controller层 与 View层 编写完毕!
末了,做一些收尾和辅助性的工作,比如,横切日志提示,表明当前程序实验到哪一步了……
在com.moondream包下,新增log包,编写切面
[code]package com.moondream.log;import org.aspectj.lang.ProceedingJoinPoint;import org.aspectj.lang.annotation.Around;import org.aspectj.lang.annotation.Aspect;import org.springframework.stereotype.Component;import java.text.SimpleDateFormat;import java.util.Date;@Aspect@Componentpublic class IndicationLog { @Around("within(com.moondream.*.*+)") public Object Indication(ProceedingJoinPoint pjp) throws Throwable { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); String date = sdf.format(new Date()); System.err.println("[" + date + "] " + pjp.getSignature().toShortString() + " ==>"); Object value = pjp.proceed(); System.err.println("
|