前期准备 环境:
IDEA
MySQL 5.7.19
Tomcat 9
Maven 3.6
要求:
需要熟练掌握MySQL数据库,Spring,JavaWeb及MyBatis知识,简单的前端知识;
数据库环境
创建一个存放书籍数据的数据库表
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 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 ,'从进门到进牢' );
基本环境搭建
1、新建一Maven项目!SSMbuild , 添加web的支持
2、导入相关的pom依赖!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 <dependencies > <dependency > <groupId > junit</groupId > <artifactId > junit</artifactId > <version > 4.12</version > </dependency > <dependency > <groupId > mysql</groupId > <artifactId > mysql-connector-java</artifactId > <version > 5.1.47</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.2</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.0.2</version > </dependency > <dependency > <groupId > org.springframework</groupId > <artifactId > spring-webmvc</artifactId > <version > 5.1.9.RELEASE</version > </dependency > <dependency > <groupId > org.springframework</groupId > <artifactId > spring-jdbc</artifactId > <version > 5.1.9.RELEASE</version > </dependency > </dependencies >
3、Maven资源过滤设置
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 <build > <resources > <resource > <directory > src/main/java</directory > <includes > <include > **/*.properties</include > <include > **/*.xml</include > </includes > <filtering > false</filtering > </resource > <resource > <directory > src/main/resources</directory > <includes > <include > **/*.properties</include > <include > **/*.xml</include > </includes > <filtering > false</filtering > </resource > </resources > </build >
4、建立基本结构和配置框架!
com.myth.pojo
com.myth.dao
com.myth.service
com.myth.controller
mybatis-config.xml
1 2 3 4 5 6 7 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd" > <configuration > </configuration >
applicationContext.xml
1 2 3 4 5 6 7 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns ="http://www.springframework.org/schema/beans" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" ></beans >
SSM整合:Mybatis层 1、数据库配置文件 database.properties
1 2 3 4 jdbc.driver =com.mysql.jdbc.Driver jdbc.url =jdbc:mysql://localhost:3306/ssmbuild?useSSL=false&useUnicode=true&characterEncoding=utf8 jdbc.username =root jdbc.password =love1314
2、IDEA关联数据库
3、编写MyBatis的核心配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd" > <configuration > <typeAliases > <package name ="com.myth.pojo" /> </typeAliases > <mappers > <mapper class ="com.myth.dao.BookMapper" /> </mappers > </configuration >
4、编写数据库对应的实体类Books
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 package com.myth.pojo;public class Books { private Integer bookID; private String bookName; private Integer bookCounts; private String detail; public Books () { } public Books (Integer bookID, String bookName, Integer bookCounts, String detail) { this .bookID = bookID; this .bookName = bookName; this .bookCounts = bookCounts; this .detail = detail; } public Integer getBookID () { return bookID; } public void setBookID (Integer bookID) { this .bookID = bookID; } public String getBookName () { return bookName; } public void setBookName (String bookName) { this .bookName = bookName; } public Integer getBookCounts () { return bookCounts; } public void setBookCounts (Integer bookCounts) { this .bookCounts = bookCounts; } public String getDetail () { return detail; } public void setDetail (String detail) { this .detail = detail; } @Override public String toString () { return "Books{" + "bookID=" + bookID + ", bookName='" + bookName + '\'' + ", bookCounts=" + bookCounts + ", detail='" + detail + '\'' + '}' ; } }
5、编写Dao层的 Mapper接口!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 package com.myth.dao;import com.myth.pojo.Books;import org.apache.ibatis.annotations.Param;import java.util.List;public interface BookMapper { int addBook (Books book) ; int deleteBookById (@Param("bookID") int id) ; int updateBook (Books books) ; Books queryBookById (@Param("bookID") int id) ; List<Books> queryAllBook () ; }
6、编写接口对应的 Mapper.xml 文件。需要导入MyBatis的包;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" > <mapper namespace ="com.myth.dao.BookMapper" > <insert id ="addBook" parameterType ="Books" > insert into books(bookName,bookCounts,detail) values (#{bookName}, #{bookCounts}, #{detail}) </insert > <delete id ="deleteBookById" parameterType ="int" > delete from books where bookID={#bookID} </delete > <update id ="updateBook" parameterType ="Books" > update books set bookName = #{bookName},bookCounts = #{bookCounts},detail = #{detail} where bookID = #{bookID} </update > <select id ="queryBookById" parameterType ="int" resultType ="Books" > select * from books where bookID = #{bookID} </select > <select id ="queryAllBook" resultType ="Books" > select * from books; </select > </mapper >
7、编写Service层的接口和实现类
接口:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 package com.myth.service;import com.myth.pojo.Books;import java.util.List;public interface BookService { int addBook (Books book) ; int deleteBookById (int id) ; int updateBook (Books books) ; Books queryBookById (int id) ; List<Books> queryAllBook () ; }
实现类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 package com.myth.service;import com.myth.dao.BookMapper;import com.myth.pojo.Books;import java.util.List;public class BookServiceImpl implements BookService { private BookMapper bookMapper; public void setBookMapper (BookMapper bookMapper) { this .bookMapper = bookMapper; } public int addBook (Books book) { return bookMapper.addBook(book); } public int deleteBookById (int id) { return bookMapper.deleteBookById(id); } public int updateBook (Books books) { return bookMapper.updateBook(books); } public Books queryBookById (int id) { return bookMapper.queryBookById(id); } public List<Books> queryAllBook () { return bookMapper.queryAllBook(); } }
SSM整合:Spring层 1、配置Spring整合MyBatis ,我们这里数据源使用c3p0连接池;
2、我们去编写Spring整合Mybatis的相关的配置文件;spring-dao.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns ="http://www.springframework.org/schema/beans" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xmlns:context ="http://www.springframework.org/schema/context" xsi:schemaLocation ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd" > <context:property-placeholder location ="classpath:database.properties" /> <bean id ="dataSource" class ="com.mchange.v2.c3p0.ComboPooledDataSource" > <property name ="driverClass" value ="${jdbc.driver}" /> <property name ="jdbcUrl" value ="${jdbc.url}" /> <property name ="user" value ="${jdbc.username}" /> <property name ="password" value ="${jdbc.password}" /> <property name ="maxPoolSize" value ="30" /> <property name ="minPoolSize" value ="10" /> <property name ="autoCommitOnClose" value ="false" /> <property name ="checkoutTimeout" value ="10000" /> <property name ="acquireRetryAttempts" value ="2" /> </bean > <bean id ="sqlSessionFactory" class ="org.mybatis.spring.SqlSessionFactoryBean" > <property name ="dataSource" ref ="dataSource" /> <property name ="configLocation" value ="classpath:mybatis-config.xml" /> </bean > <bean class ="org.mybatis.spring.mapper.MapperScannerConfigurer" > <property name ="sqlSessionFactoryBeanName" value ="sqlSessionFactory" /> <property name ="basePackage" value ="com.myth.dao" /> </bean > </beans >
3、Spring整合service层
spring-service.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns ="http://www.springframework.org/schema/beans" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xmlns:context ="http://www.springframework.org/schema/context" xsi:schemaLocation ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd" > <context:component-scan base-package ="com.myth.service" /> <bean id ="BookServiceImpl" class ="com.myth.service.BookServiceImpl" > <property name ="bookMapper" ref ="bookMapper" /> </bean > <bean id ="transactionManager" class ="org.springframework.jdbc.datasource.DataSourceTransactionManager" > <property name ="dataSource" ref ="dataSource" /> </bean > </beans >
SSM整合:SpringMVC层 1、web.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 <?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 >
2、spring-mvc.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns ="http://www.springframework.org/schema/beans" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc ="http://www.springframework.org/schema/mvc" xmlns:context ="http://www.springframework.org/schema/context" xsi:schemaLocation ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd" > <mvc:annotation-driven /> <mvc:default-servlet-handler /> <bean class ="org.springframework.web.servlet.view.InternalResourceViewResolver" > <property name ="viewClass" value ="org.springframework.web.servlet.view.JstlView" /> <property name ="prefix" value ="/WEB-INF/jsp/" /> <property name ="suffix" value =".jsp" /> </bean > <context:component-scan base-package ="com.myth.controller" /> </beans >
3、Spring配置整合文件,applicationContext.xml
1 2 3 4 5 6 7 8 9 10 11 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns ="http://www.springframework.org/schema/beans" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation ="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd" > <import resource ="spring-dao.xml" /> <import resource ="spring-service.xml" /> <import resource ="spring-mvc.xml" /> </beans >
SSM整合:查询书籍功能 1、BookController 类编写 , 方法一:查询全部书籍
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 package com.myth.controller;import com.myth.pojo.Books;import com.myth.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 { @Autowired @Qualifier("BookServiceImpl") private BookService bookService; @RequestMapping("/allBook") public String list (Model model) { List<Books> list = bookService.queryAllBook(); model.addAttribute("list" , list); return "allBook" ; } }
2、编写首页 index.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <!DOCTYPE HTML> <html> <head> <title>首页</title> <style type="text/css" > a { text-decoration: none; color: black; font-size: 18 px; } h3 { width: 180 px; height: 38 px; margin: 100 px auto; text-align: center; line-height: 38 px; background: deepskyblue; border-radius: 4 px; } </style> </head> <body> <h3> <a href="${pageContext.request.contextPath}/book/allBook">点击进入列表页</a> </h3> </body> </html>
3、书籍列表页面 allbook.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 <%-- User: myth Date: 2020 -07 -02 13 :49 --%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <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="${pageContext.request.contextPath}/book/toAddBook">新增</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> </tr> </thead> <tbody> <c:forEach var ="book" items="${requestScope.get('list')}" > <tr> <td>${book.getBookID()}</td> <td>${book.getBookName()}</td> <td>${book.getBookCounts()}</td> <td>${book.getDetail()}</td> <td> <a href="${pageContext.request.contextPath}/book/toUpdateBook?id=${book.getBookID()}">更改</a> | <a href="${pageContext.request.contextPath}/book/del/${book.getBookID()}">删除</a> </td> </tr> </c:forEach> </tbody> </table> </div> </div> </div> </body> </html>
SSM整合:添加书籍功能 1、BookController
1 2 3 4 5 6 7 8 9 10 11 12 13 @RequestMapping("/toAddBook") public String toAddPaper () { return "addBook" ; } @RequestMapping("/addBook") public String addPaper (Books books) { System.out.println(books); bookService.addBook(books); return "redirect:/book/allBook" ; }
2、添加书籍页面:addBook.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 <%-- User: myth Date: 2020 -07 -02 14 :12 --%> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>新增书籍</title> <!-- 引入 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> <form action="${pageContext.request.contextPath}/book/addBook" method="post" > <div class ="form-group" > <label>书籍名称:</label> <input type="text" name="bookName" class ="form-control" required> </div> <div class ="form-group" > <label>书籍数量:</label> <input type="text" name="bookCounts" class ="form-control" required> </div> <div class ="form-group" > <label>书籍简介:</label> <input type="text" name="detail" class ="form-control" required> </div> <div class ="form-group" > <input type="submit" class ="form-control" value="添加" > </div> </form> </div> </body> </html>
SSM整合:修改书籍功能 1、BookController
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 @RequestMapping("/toUpdateBook") public String toUpdateBook (Model model, int id) { Books book = bookService.queryBookById(id); System.out.println(book); model.addAttribute("book" ,book ); return "updateBook" ; } @RequestMapping("/updateBook") public String updateBook (Model model, Books book) { System.out.println(book); int i = bookService.updateBook(book); if (i>0 ){ System.out.println("添加书籍成功=>" +book); } return "redirect:/book/allBook" ; }
2、修改书籍页面 updateBook.jsp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 <%-- User: myth Date: 2020 -07 -02 14 :54 --%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <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> <form action="${pageContext.request.contextPath}/book/updateBook" method="post" > <input type="hidden" name="bookID" value="${book.getBookID()}" /> <div class ="form-group" > <label>书籍名称:</label> <input type="text" name="bookName" value="${book.getBookName()}" class ="form-control" required> </div> <div class ="form-group" > <label>书籍数量:</label> <input type="text" name="bookCounts" value="${book.getBookCounts()}" class ="form-control" required> </div> <div class ="form-group" > <label>书籍详情:</label> <input type="text" name="detail" value="${book.getDetail() }" class ="form-control" required> </div> <div class ="form-group" > <input type="submit" class ="form-control" value="提交" > </div> </form> </div>
SSM整合:删除书籍功能 1、BookController
1 2 3 4 5 6 @RequestMapping("/deleteBook/{bookId}") public String deleteBook (@PathVariable("bookId") int id) { bookService.deleteBookById(id); return "redirect:/book/allBook" ; }
2、allBook.jsp
1 <a href="${pageContext.request.contextPath}/book/deleteBook/${book.getBookID()}">删除</a>