注:此为笔者学习狂神说SpringMVC的笔记,其中包含个人的笔记和理解,仅做学习笔记之用,更多详细资讯请出门左拐B站:狂神说!!!

10、ssm整合

问了一下ChatGPT
SSM 是一个基于 Java 的开发框架整合,由 Spring、Spring MVC 和 MyBatis 三个开源框架组成。每个框架都有不同的职责和作用,通过整合,可以发挥各自的优势,形成一个完整的、高效的 Java 开发框架。

下面简要解释一下 SSM 各个组成部分的作用:

  1. Spring:
    • 作用: 提供了一个轻量级的 IoC(控制反转)容器,用于管理应用组件的生命周期和配置。
    • IoC容器: 负责创建对象、管理对象的依赖关系,实现了对象的松耦合。
    • AOP(面向切面编程): 提供了面向切面编程的支持,可以方便地实现事务管理、日志记录等横切关注点。
  2. Spring MVC:
    • 作用: 是一个基于 MVC 模式的 Web 框架,用于构建 Web 层的应用程序。
    • 控制器层: 通过控制器(Controller)处理用户请求,将请求映射到相应的业务逻辑处理方法。
    • 模型层: 通过模型(Model)将数据传递到视图层,与业务逻辑进行交互。
    • 视图层: 通过视图(View)负责渲染页面,呈现给用户。
  3. MyBatis:
    • 作用: 是一个持久层框架,用于简化数据库操作和 SQL 查询的编写。
    • ORM(对象关系映射): 将数据库表映射为 Java 对象,通过配置文件或注解实现对象与数据库表之间的映射关系。
    • SQL映射: 提供了 XML 文件或注解的方式定义 SQL 查询,可以更灵活地进行数据库操作。
    • 缓存: 支持缓存机制,提高数据库查询性能。

综合起来,SSM 框架整合了 Spring 的 IoC 和 AOP 特性,Spring MVC 的 Web 层框架,以及 MyBatis 的持久层框架,使得开发者能够更方便地进行企业级 Java 应用的开发。通过配置文件和注解,可以实现各层之间的松耦合,提高代码的可维护性和可扩展性。整合后,Spring 处理业务逻辑和控制反转,Spring MVC 处理 Web 层,MyBatis 处理数据库交互,形成一个完整的、分层清晰的应用架构。

1、环境要求

环境:

  • IDEA
  • MySQL 5.7.19
  • Tomcat 9
  • Maven 3.6

要求:

  • 需要熟练掌握MySQL数据库,Spring,JavaWeb及MyBatis知识,简单的前端知识;

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=utf8INSERTINTO `books`(`bookID`,`bookName`,`bookCounts`,`detail`)VALUES(1,'Java',1,'从入门到放弃'),(2,'MySQL',10,'从删库到跑路'),(3,'Linux',5,'从进门到进牢');

3、基本环境搭建

1、新建一Maven项目!ssmbuild , 添加web的支持
2、导入相关的pom依赖!

<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资源过滤设置

<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.kuang.pojo

  • com.kuang.dao

声明扫描xml文件,将xml和mapper绑定起来

  • com.kuang.service

  • com.kuang.controller
  • mybatis-config.xml

<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration></configuration>
  • applicationContext.xml
<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>

5、Mybatis层编写

1、数据库配置文件 database.properties

2、IDEA关联数据库

3、编写MyBatis的核心配置文件

<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration><typeAliases> <package name="com.kuang.pojo"/> </typeAliases> <mappers> <mapper resource="com/kuang/dao/BookMapper.xml"/> </mappers></configuration>

4、编写数据库对应的实体类 com.kuang.pojo.Books

使用lombok插件!

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

5、编写Dao层的 Mapper接口!

package com.kuang.dao;import com.kuang.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<Books> queryAllBook();}

6、编写接口对应的 Mapper.xml 文件。需要导入MyBatis的包

<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"><mapper namespace="com.kuang.dao.BookMapper">  <insert id="addBook" parameterType="Books">insert into ssmbuild.books(bookName,bookCounts,detail)values (#{bookName}, #{bookCounts}, #{detail}) </insert>  <delete id="deleteBookById" parameterType="int">delete from ssmbuild.books where bookID=#{bookID} </delete>  <update id="updateBook" parameterType="Books">update ssmbuild.booksset bookName = #{bookName},bookCounts = #{bookCounts},detail = #{detail}where bookID = #{bookID} </update>  <select id="queryBookById" resultType="Books">select * from ssmbuild.bookswhere bookID = #{bookID} </select>  <select id="queryAllBook" resultType="Books">SELECT * from ssmbuild.books </select></mapper>

7、编写Service层的接口和实现类

接口:

package com.kuang.service;import com.kuang.pojo.Books;import java.util.List;//BookService:底下需要去实现,调用dao层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<Books> queryAllBook();}

实现类:

package com.kuang.service;import com.kuang.dao.BookMapper;import com.kuang.pojo.Books;import java.util.List;public class BookServiceImpl implements BookService { //调用dao层的操作,设置一个set接口,方便Spring管理 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();}}

6、Spring层

1、配置Spring整合MyBatis,我们这里数据源使用c3p0连接池;

2、我们去编写Spring整合Mybatis的相关的配置文件;spring-dao.xml

<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.kuang.dao"/> </bean></beans>

3、Spring整合service层

理解applicationContext.xml、spring-dao、spring-service这些配置文件的关系,和融合起来的起的作用,或者直接让spring托管就可以了

<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.kuang.service" />  <bean id="BookServiceImpl" class="com.kuang.service.BookServiceImpl"> <property name="bookMapper" ref="bookMapper"/> </bean>  <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  <property name="dataSource" ref="dataSource" /> </bean></beans>

7、SpringMVC层

1、web.xml

spring-mvc.xml

dao层、service层、mvc层整合起来

<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>

springmvc层的所有的请求都被这个dispatchServlet核心分发器接管了

有错误的:dispatchServlet绑定核心配置文件的时候,只绑定了mvc层的配置文件,dao、service层的没有绑定起来,应该改为三层:mvc层、dao、service层都绑定给applicationContext.xml,交由spring托管的applicationContext.xml,才算把所有的bean都注入spring统一托管

<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

<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"xmlns:mvc="http://www.springframework.org/schema/mvc"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 http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.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.kuang.controller" /></beans>

小结1

dao层、service层、mvc层这三个框架都是通过spring整合到一起的,这些都是框架的底层,以后写轻量级项目的基础,一定要保留下来

8、Controller 和 视图层编写

1、BookController 类编写 , 方法一:查询全部书籍

简易的的jsp页面,先测试跳转成功与否,再往下做

首页使用绝对地址

2、排除bean注入的错误

思路:

①使用单元测试底层能否查出bean是否注入的问题

结果是可以的,因为底层applicationContext.xml把三层:dao层、service层、mvc层都注入绑定在一起了,所以说明底层没有事,是springmvc整合出的问题

由于springmvc整合applicationContext出了问题,所以applicationContext整合三层也会出现bean没法注入的问题

②真正原因:springmvc整合applicationContext出了问题

有错误的:dispatchServlet绑定核心上下文配置文件的时候,只绑定了mvc层的配置文件,dao、service层的没有绑定起来,应该改为applicationContext.xml,因为三层:mvc层、dao、service层都绑定给applicationContext.xml,交由spring托管的applicationContext.xml,才算把所有的bean都注入spring统一托管

修改过来即可

结果:

小结2

从以上错误中,理解spring是如何通过绑定applicationContext.xml(绑定了三层:mvc层、dao、service层),来托管三层的,管理和注入bean的

3.编写首页 index.jsp
 首页  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;} 

点击进入列表页

4、 书籍列表页面 allbook.jsp

效果:

 书籍列表   

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

新增
书籍编号 书籍名字 书籍数量 书籍详情 操作
${book.getBookID()} ${book.getBookName()} ${book.getBookCounts()} ${book.getDetail()} 更改 | 删除
5、BookController 类编写 , 方法二:添加书籍
@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";}
6、 添加书籍页面:addBook.jsp

 新增书籍   

新增书籍

书籍名称:


书籍数量:


书籍详情:


7、BookController 类编写 , 方法三:修改书籍

结果:

8、添加事务支持

在spring-service.xml中添加aop事务支持

导入jar包,还要往WEB-INF中导入,注意生成文件中可能没有也会报错

9、隐藏域ID的问题

添加隐藏域

显而易见是sql出现了问题,这里可以配置日志输出方式,让SQL输出日志更清晰,更容易判断出错的地方

10、 修改书籍页面 updateBook.jsp
 修改信息   

修改信息

书籍名称:书籍数量:书籍详情:
11、BookController 类编写 , 方法四:删除书籍
@RequestMapping("/del/{bookId}")public String deleteBook(@PathVariable("bookId") int id) { bookService.deleteBookById(id); return "redirect:/book/allBook";}

使用RestFul风格

配置Tomcat,进行运行!

到目前为止,这个SSM项目整合已经完全的OK了,可以直接运行进行测试!这个练习十分的重要,大家需要保证,不看任何东西,自己也可以完整的实现出来!

12、搜索图书

1、前端

2、controller

3、设置接口方法

4、xml配置SQL

5、添加业务

6、改进controller

7、修改前端

8、前端可视化

SpringMVC学习与开发(三)的学习笔记到此完结,笔者归纳、创作不易,大佬们给个3连再起飞吧