整合SSM框架

页面访问流程:前端 ——> controller层 ——> service 层——> mapper层 ——> 数据库

前端访问,controller层到service层,service调mapper层,mapper连数据库

开发流程:数据库 ——> mapper层 —-> service业务层 ——> controller层 ——> 前端页面

1 开发

数据库环境

创建一个数据库

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

基本环境搭建

  1. 新建一个Maven项目,添加Web支持

  2. 导入相关的pom依赖,Maven静态资源过滤设置

    1. <!--依赖: junit,数据库驱动,连接池,servlet,jsp,mybatis,mybaits-spring,spring相关-->
    2. <dependencies>
    3. <!--Junit-->
    4. <dependency>
    5. <groupId>junit</groupId>
    6. <artifactId>junit</artifactId>
    7. <version>4.12</version>
    8. </dependency>
    9. <!--数据库驱动-->
    10. <dependency>
    11. <groupId>mysql</groupId>
    12. <artifactId>mysql-connector-java</artifactId>
    13. <version>5.1.47</version>
    14. </dependency>
    15. <!--Servlet - JSP -->
    16. <dependency>
    17. <groupId>javax.servlet</groupId>
    18. <artifactId>servlet-api</artifactId>
    19. <version>2.5</version>
    20. </dependency>
    21. <dependency>
    22. <groupId>javax.servlet.jsp</groupId>
    23. <artifactId>jsp-api</artifactId>
    24. <version>2.2</version>
    25. </dependency>
    26. <dependency>
    27. <groupId>javax.servlet</groupId>
    28. <artifactId>jstl</artifactId>
    29. <version>1.2</version>
    30. </dependency>
    31. <!--Mybatis-->
    32. <dependency>
    33. <groupId>org.mybatis</groupId>
    34. <artifactId>mybatis</artifactId>
    35. <version>3.5.2</version>
    36. </dependency>
    37. <dependency>
    38. <groupId>org.mybatis</groupId>
    39. <artifactId>mybatis-spring</artifactId>
    40. <version>2.0.2</version>
    41. </dependency>
    42. <!--Spring-->
    43. <dependency>
    44. <groupId>org.springframework</groupId>
    45. <artifactId>spring-webmvc</artifactId>
    46. <version>5.1.9.RELEASE</version>
    47. </dependency>
    48. <dependency>
    49. <groupId>org.springframework</groupId>
    50. <artifactId>spring-jdbc</artifactId>
    51. <version>5.1.9.RELEASE</version>
    52. </dependency>
    53. <dependency>
    54. <groupId>org.projectlombok</groupId>
    55. <artifactId>lombok</artifactId>
    56. <version>1.18.22</version>
    57. </dependency>
    58. </dependencies>
    59. <!--静态资源导出-->
    60. <build>
    61. <resources>
    62. <resource>
    63. <directory>src/main/java</directory>
    64. <includes>
    65. <include>**/*.properties</include>
    66. <include>**/*.xml</include>
    67. </includes>
    68. <filtering>false</filtering>
    69. </resource>
    70. <resource>
    71. <directory>src/main/resources</directory>
    72. <includes>
    73. <include>**/*.properties</include>
    74. <include>**/*.xml</include>
    75. </includes>
    76. <filtering>false</filtering>
    77. </resource>
    78. </resources>
    79. </build>
  1. 可以在IDEA中连接数据库
    整合SSM - 图1

  2. 建立基本的结构配置框架
    整合SSM - 图2java文件夹下

    • com.xleixz.pojo(model模型)

    • com.xleixz.mapper(数据持久层)

    • com.xleixz.service(业务逻辑层)

    • com.xleixz.controller(控制层)

整合SSM - 图3resources文件夹下

  • Mybatis-config.xml(Mybatis核心配置文件) ```xml <?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">

  1. -
  2. ApplicationContext.xmlSpring核心配置文件)
  3. ```xml
  4. <?xml version="1.0" encoding="UTF-8"?>
  5. <beans xmlns="http://www.springframework.org/schema/beans"
  6. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans.xsd">
  9. </beans>

Mybatis层编写

  1. 编写Mybatis核心配置文件 ```xml <?xml version=”1.0” encoding=”UTF-8” ?> <!DOCTYPE configuration

    1. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    2. "http://mybatis.org/dtd/mybatis-3-config.dtd">

    1. <package name="com.xleixz.pojo"/>

  1. 2.
  2. 编写数据库对应的实体类 Books.java
  3. <br />**这里使用Lombok插件,使用注解**
  4. ```java
  5. import lombok.AllArgsConstructor;
  6. import lombok.Data;
  7. import lombok.NoArgsConstructor;
  8. @Data
  9. @AllArgsConstructor
  10. @NoArgsConstructor
  11. public class Books {
  12. private int bookID;
  13. private String bookName;
  14. private int bookCounts;
  15. private String detail;
  16. }
  1. 编写mapper(dao)层的 Mapper接口 ```java import com.xleixz.pojo.Books; import java.util.List; public interface BookMapper {

    //增加一个Book int addBook(Books book);

    //根据id删除一个Book int deleteBookById(int id);

    //更新Book int updateBook(Books books);

    //根据id查询,返回一个Book Books queryBookById(int id);

    //查询全部Book,返回list集合 List queryAllBook();

}

  1. 4.
  2. 编写接口对应的**Mapper.xml** 文件
  3. ```xml
  4. <?xml version="1.0" encoding="UTF-8" ?>
  5. <!DOCTYPE mapper
  6. PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
  7. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  8. <mapper namespace="com.xleixz.mapper.BookMapper">
  9. <!--增加一个Book-->
  10. <insert id="addBook" parameterType="Books">
  11. insert into ssmbuild.books(bookName,bookCounts,detail)
  12. values (#{bookName}, #{bookCounts}, #{detail})
  13. </insert>
  14. <!--根据id删除一个Book-->
  15. <delete id="deleteBookById" parameterType="int">
  16. delete from ssmbuild.books where bookID=#{bookID}
  17. </delete>
  18. <!--更新Book-->
  19. <update id="updateBook" parameterType="Books">
  20. update ssmbuild.books
  21. set bookName = #{bookName},bookCounts = #{bookCounts},detail = #{detail}
  22. where bookID = #{bookID}
  23. </update>
  24. <!--根据id查询,返回一个Book-->
  25. <select id="queryBookById" resultType="Books">
  26. select * from ssmbuild.books
  27. where bookID = #{bookID}
  28. </select>
  29. <!--查询全部Book-->
  30. <select id="queryAllBook" resultType="Books">
  31. SELECT * from ssmbuild.books
  32. </select>
  33. </mapper>


写完映射文件之后,要立马绑定到Mybatis核心配置文件中!!!

  1. <mappers>
  2. <mapper resource="com/xleixz/mapper/BookMapper.xml"/>
  3. </mappers>
  1. 编写Service层的接口和实现类
    业务层(Service)接口和mapper层接口本质上没有区别!!
    逻辑:Service业务层调mapper层,组合mapper层,私有化private BookMapper bookMapper;
    Service业务层接口 ```java public interface BookService {

    //增加一个Book int addBook(Books book);

    //根据id删除一个Book int deleteBookById(int id);

    //更新Book int updateBook(Books books);

    //根据id查询,返回一个Book Books queryBookById(int id);

    //查询全部Book,返回list集合 List queryAllBook();

}

  1. <br />**Service业务层实现类**
  2. ```java
  3. import com.xleixz.mapper.BookMapper;
  4. import com.xleixz.pojo.Books;
  5. import java.util.List;
  6. public class BookServiceImpl implements BookService {
  7. //调用mapper层的操作,设置一个set接口,方便Spring管理
  8. private BookMapper bookMapper;
  9. public void setBookMapper(BookMapper bookMapper) {
  10. this.bookMapper = bookMapper;
  11. }
  12. @Override
  13. public int addBook(Books book) {
  14. return bookMapper.addBook(book);
  15. }
  16. @Override
  17. public int deleteBookById(int id) {
  18. return bookMapper.deleteBookById(id);
  19. }
  20. @Override
  21. public int updateBook(Books books) {
  22. return bookMapper.updateBook(books);
  23. }
  24. @Override
  25. public Books queryBookById(int id) {
  26. return bookMapper.queryBookById(id);
  27. }
  28. @Override
  29. public List<Books> queryAllBook() {
  30. return bookMapper.queryAllBook();
  31. }
  32. }

到这里MVC的底层Mybatis层就编写完了!

pojo:实体类 mapper层和service层就是MVC的M(Model模型)

Spring层

  1. 配置Spring整合MyBatis,这里数据源使用jdbc连接池;

  2. 准备Spring整合Mybatis的相关的配置文件【Spring-mapper.xml】 ```xml <?xml version=”1.0” encoding=”UTF-8”?>

  1. <br />编写配置文件【Spring-Mapper.xml】,**如果使用的是MySQL8.0+,要增加一个时区的配置;**
  2. ```xml
  3. <?xml version="1.0" encoding="UTF-8"?>
  4. <beans xmlns="http://www.springframework.org/schema/beans"
  5. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  6. xmlns:context="http://www.springframework.org/schema/context"
  7. xsi:schemaLocation="http://www.springframework.org/schema/beans
  8. http://www.springframework.org/schema/beans/spring-beans.xsd
  9. http://www.springframework.org/schema/context
  10. https://www.springframework.org/schema/context/spring-context.xsd">
  11. <!-- 配置整合mybatis -->
  12. <!-- 1.数据库连接池 -->
  13. <!--DataSource:使用Spring的数据源替换mybatis的配置 jdbc c3p0 dbcp
  14. 这里使用Spring提供的jdbc-->
  15. <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
  16. <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
  17. <property name="url"
  18. value="jdbc:mysql://localhost:3306/ssmbuild?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF8"/>
  19. <property name="username" value="root"/>
  20. <property name="password" value="123456"/>
  21. </bean>
  22. <!-- 2.配置SqlSessionFactory对象 -->
  23. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  24. <!-- 注入数据库连接池 -->
  25. <property name="dataSource" ref="dataSource"/>
  26. <!-- 配置Mybatis全局配置文件:Mybatis-config.xml -->
  27. <property name="configLocation" value="classpath:Mybatis-config.xml"/>
  28. </bean>
  29. <!-- 3.配置扫描Mapper接口包,动态实现Mapper接口注入到spring容器中 -->
  30. <!--解释 :https://www.cnblogs.com/jpfss/p/7799806.html-->
  31. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  32. <!-- 注入sqlSessionFactory -->
  33. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
  34. <!-- 给出需要扫描Mapper接口包 -->
  35. <property name="basePackage" value="com.xleixz.mapper"/>
  36. </bean>
  37. </beans>
  1. Spring整合service层 ```xml <?xml version=”1.0” encoding=”UTF-8”?>

  1. **Spring层编写完成!**
  2. > **SpringMVC层**
  3. 1.
  4. **配置web.xml**
  5. ```xml
  6. <?xml version="1.0" encoding="UTF-8"?>
  7. <web-app xmlns="https://jakarta.ee/xml/ns/jakartaee"
  8. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  9. xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd"
  10. version="5.0">
  11. <!--DispatcherServlet: 前置控制器,请求分发-->
  12. <servlet>
  13. <servlet-name>DispatcherServlet</servlet-name>
  14. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  15. <init-param>
  16. <param-name>contextConfigLocation</param-name>
  17. <!--一定要注意:这里加载的是总的配置文件,这里有坑!-->
  18. <param-value>classpath:ApplicationContext.xml</param-value>
  19. </init-param>
  20. <load-on-startup>1</load-on-startup>
  21. </servlet>
  22. <servlet-mapping>
  23. <servlet-name>DispatcherServlet</servlet-name>
  24. <url-pattern>/</url-pattern>
  25. </servlet-mapping>
  26. <!--防止乱码-->
  27. <!--encodingFilter-->
  28. <filter>
  29. <filter-name>encodingFilter</filter-name>
  30. <filter-class>
  31. org.springframework.web.filter.CharacterEncodingFilter
  32. </filter-class>
  33. <init-param>
  34. <param-name>encoding</param-name>
  35. <param-value>utf-8</param-value>
  36. </init-param>
  37. </filter>
  38. <filter-mapping>
  39. <filter-name>encodingFilter</filter-name>
  40. <url-pattern>/*</url-pattern>
  41. </filter-mapping>
  42. <!--Session过期时间-->
  43. <session-config>
  44. <session-timeout>15</session-timeout>
  45. </session-config>
  46. </web-app>
  1. 编写Spring-mvc.xml配置文件 ```xml <?xml version=”1.0” encoding=”UTF-8”?>

  1. 3.
  2. **Spring配置整合文件,applicationContext.xml**
  3. ```xml
  4. <import resource="Spring-mapper.xml"/>
  5. <import resource="Spring-service.xml"/>
  6. <import resource="Spring-mvc.xml"/>

到这里所有的配置文件就全部结束了。

框架配置结构:

整合SSM - 图4

  1. BookController 类编写 ```java package com.xleixz.controller;

import com.xleixz.pojo.Books; import com.xleixz.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 org.springframework.web.bind.annotation.RestController;

import java.awt.print.Book; import java.util.ArrayList; import java.util.List;

/**

  • @Author: 小雷学长
  • @Date: 2022/6/13 - 17:50
  • @Version: 1.8 */ //添加@Controller注解,表示这是一个控制器 @Controller //添加@RequestMapping(“/book”)注解,表示这是一个请求映射器 @RequestMapping(“/book”) public class BookController {

    //添加@Autowired注解,表示这是一个自动装配的注解 @Autowired //添加@Qualifier注解,表示这是一个注入的注解 @Qualifier(“BookServiceImpl”) private BookService bookService;

    @RequestMapping(“/allBook”) public String list(Model model) {

    1. //调用service方法,查询所有图书
    2. List<Books> list = bookService.queryAllBook();
    3. //将查询到的图书添加到model中
    4. model.addAttribute("list", list);
    5. //转发
    6. return "allBook";

    }

    @RequestMapping(“/toAddBook”) public String toAddPaper() {

    1. //返回book/add.jsp
    2. return "addBook";

    }

    @RequestMapping(“/addBook”) public String addPaper(Books books) {

    1. //调用service方法,添加图书
    2. bookService.addBook(books);
    3. //重定向
    4. return "redirect:/book/allBook";

    }

    @RequestMapping(“/toUpdateBook”) public String toUpdateBook(Model model, int id) {

    1. //调用service方法,根据id查询图书
    2. Books books = bookService.queryBookById(id);
    3. //将查询到的图书添加到model中
    4. model.addAttribute("book", books);
    5. //转发
    6. return "updateBook";

    }

    @RequestMapping(“/updateBook”) public String updateBook(Model model, Books book) {

    1. //调用service方法,修改图书
    2. bookService.updateBook(book);
    3. //调用service方法,根据id查询图书
    4. Books books = bookService.queryBookById(book.getBookID());
    5. //将查询到的图书添加到model中
    6. model.addAttribute("books", books);
    7. //重定向
    8. return "redirect:/book/allBook";

    }

    @RequestMapping(“/del/{bookId}”) public String deleteBook(@PathVariable(“bookId”) int id) {

    1. //调用service方法,根据id删除图书
    2. bookService.deleteBookById(id);
    3. //重定向
    4. return "redirect:/book/allBook";

    } } ```

  1. 补充index.jsp页面 ```jsp <%@ page language=”java” contentType=”text/html; charset=UTF-8” pageEncoding=”UTF-8” %> <!DOCTYPE HTML>

点击进入列表页

  1. 3.
  2. 书籍列表页面 **allbook.jsp**
  3. ```jsp
  4. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  5. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  6. <html>
  7. <head>
  8. <title>书籍列表</title>
  9. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  10. <!-- 引入 Bootstrap -->
  11. <link href="https://cdn.bootcss.com/bootstrap/3.3.7/css/bootstrap.min.css" rel="stylesheet">
  12. </head>
  13. <body>
  14. <div class="container">
  15. <div class="row clearfix">
  16. <div class="col-md-12 column">
  17. <div class="page-header">
  18. <h1>
  19. <small>书籍列表 —— 显示所有书籍</small>
  20. </h1>
  21. </div>
  22. </div>
  23. </div>
  24. <div class="row">
  25. <div class="col-md-4 column">
  26. <a class="btn btn-primary" href="${pageContext.request.contextPath}/book/toAddBook">新增</a>
  27. </div>
  28. </div>
  29. <div class="row clearfix">
  30. <div class="col-md-12 column">
  31. <table class="table table-hover table-striped">
  32. <thead>
  33. <tr>
  34. <th>书籍编号</th>
  35. <th>书籍名字</th>
  36. <th>书籍数量</th>
  37. <th>书籍详情</th>
  38. <th>操作</th>
  39. </tr>
  40. </thead>
  41. <tbody>
  42. <c:forEach var="book" items="${requestScope.get('list')}">
  43. <tr>
  44. <td>${book.getBookID()}</td>
  45. <td>${book.getBookName()}</td>
  46. <td>${book.getBookCounts()}</td>
  47. <td>${book.getDetail()}</td>
  48. <td>
  49. <a href="${pageContext.request.contextPath}/book/toUpdateBook?id=${book.getBookID()}">更改</a> |
  50. <a href="${pageContext.request.contextPath}/book/del/${book.getBookID()}">删除</a>
  51. </td>
  52. </tr>
  53. </c:forEach>
  54. </tbody>
  55. </table>
  56. </div>
  57. </div>
  58. </div>
  1. 添加书籍页面:addBook.jsp ```jsp <%@ taglib prefix=”c” uri=”http://java.sun.com/jsp/jstl/core“ %> <%@ page contentType=”text/html;charset=UTF-8” language=”java” %>

书籍名称:


书籍数量:


书籍详情:


5. 修改书籍页面 **updateBook.jsp**jsp <%@ taglib prefix=”c” uri=”http://java.sun.com/jsp/jstl/core“ %> <%@ page contentType=”text/html;charset=UTF-8” language=”java” %>
书籍名称: 书籍数量: 书籍详情:

  1. > **拓展:新增一个查询功能**
  2. 1.
  3. 到**mapper**层写接口,实现根据书籍名称查询数据信息的功能【BookMapper.java
  4. ```java
  5. //根据name查询,返回一个Book
  6. Books queryBookByName(@Param("bookName") String bookName);
  1. 根据接口编写映射文件【BookMapper.xml】
    1. <!--查询全部Book-->
    2. <select id="queryBookByName" resultType="Books">
    3. SELECT * from ssmbuild.books
    4. where bookName = #{bookName}
    5. </select>
  1. service层编写接口,业务层(Service)接口和mapper层接口本质上没有区别!!【BookService.java】
    1. //根据name查询,返回一个Book
    2. Books queryBookByName(@Param("bookName") String bookName);
  1. service层编写接口实现类【BookServiceImpl.java】
    1. @Override
    2. public Books queryBookByName(String bookName) {
    3. return bookMapper.queryBookByName(bookName);
    4. }
  1. 书籍列表allBook.jsp中添加连接跳转
    1. <div class="col-md-8 column">
    2. <%--查询书籍--%>
    3. <form class="form-inline" action="${pageContext.request.contextPath}/book/queryBook" method="post" style="float: right">
    4. <span style="color: red;font-weight: bold">
    5. ${error}
    6. </span>
    7. <input type="text" name="queryBookName" class="form-control" placeholder="请输入要查询数据的名称">
    8. <input type="submit" value="查询" class="btn btn-primary">
    9. </form>
    10. </div>
  1. 编写controller层,控制请求和响应【BookController.java】
    1. @RequestMapping("/queryBook")
    2. public String queryBook(String queryBookName, Model model) {
    3. //调用service方法,根据图书名称查询图书
    4. Books books = bookService.queryBookByName(queryBookName);
    5. //遍历Books集合
    6. List<Books> list = new ArrayList<>();
    7. //将遍历的图书添加到list中
    8. list.add(books);
    9. /*查询优化*/
    10. //如果查询到的结果为空,则返回所有的书籍
    11. if(books==null){
    12. list = bookService.queryAllBook();
    13. model.addAttribute("error","没有查询到相关书籍");
    14. }
    15. //将查询到的图书添加到model中
    16. model.addAttribute("list", list);
    17. //转发
    18. return "allBook";
    19. }

目录结构:

整合SSM - 图5

整合SSM - 图6


2 报错问题

启动测试,发现报500服务器内部错误!

整合SSM - 图7

解决:在web.xml配置文件中,classpath:对应的文件中没有绑定ApplicationContext.xml配置文件,修改一下。

整合SSM - 图8

隐藏域

新增书籍出现问题:数据库无法正常添加数据

分析:

  1. 首先判断事务是否提交,若没有则配置事务;若还有问题则下一步;
  2. 看一下SQL语句能否执行成功,SQL执行失败,修改未完成。

解决:

SQL语句中没有传入id,service业务层的BookID没有传过来,设置前端传递隐藏域

  1. <input type="hidden" name="bookID" value="${book.getBookID()}"/>

这里name要对应数据库里的

还可以通过在mybatis核心配置文件中添加日志,查看SQL语句是否正常

  1. <settings>
  2. <setting name="logImpl" values="STDOUT_LOGGING"/>
  3. </settings>