1 SSM概述

1.1 什么是SSM?

SSM框架集由Spring、MyBatis两个开源框架整合而成(SpringMVC是Spring中的部分内容)。常作为数据源较简单的web项目的框架。

1、Spring
Spring就像是整个项目中装配bean的大工厂,在配置文件中可以指定使用特定的参数去调用实体类的构造方法来实例化对象。也可以称之为项目中的粘合剂。
Spring的核心思想是IoC(控制反转),即不再需要程序员去显式地new一个对象,而是让Spring框架帮你来完成这一切。

2、SpringMVC
SpringMVC在项目中拦截用户请求,它的核心Servlet即DispatcherServlet承担中介或是前台这样的职责,将用户请求通过HandlerMapping去匹配Controller,Controller就是具体对应请求所执行的操作。SpringMVC相当于SSH框架中struts。

3、mybatis
mybatis是对jdbc的封装,它让数据库底层操作变的透明。
mybatis的操作都是围绕一个sqlSessionFactory实例展开的。mybatis通过配置文件关联到各实体类的Mapper文件,Mapper文件中配置了每个类对数据库所需进行的sql语句映射。在每次与数据库交互时,通过sqlSessionFactory拿到一个sqlSession,再执行sql命令。

2 SSM架构搭建过程

搭建过程

1 创建一个有web结构的maven项目

image.png

2 补全目录

image.png

image.png

3 具体代码实现过程

pom.xml文件配置,将需要的jar包导入项目(可在中途需要时加入jar包依赖)

3.1 设置编码和所需要的框架jar包统一版本

  1. <properties>
  2. <!-- 设置项目的java编译版本-->
  3. <maven.compiler.source>1.8</maven.compiler.source>
  4. <maven.compiler.target>1.8</maven.compiler.target>
  5. <!-- 设置项目编码编码 -->
  6. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  7. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  8. <!-- spring版本号 -->
  9. <spring.version>4.3.5.RELEASE</spring.version>
  10. <!-- mybatis版本号 -->
  11. <mybatis.version>3.4.1</mybatis.version>
  12. </properties>

3.2 spring所需要的jar包

    <!-- 核心包 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-core</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <!-- bean管理所需要的jar包 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-beans</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <!-- 上下文支持jar包 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <!-- 数据库访问层需要的jar包 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <!-- spring 提供的测试插件 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-test</artifactId>
      <version>${spring.version}</version>
    </dependency>
    <!-- 网络支持jar包,可以使用Spring框架的支持开发Servlet代码. -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-web</artifactId>
      <version>${spring.version}</version>
    </dependency>

3.3 SpringMVC所需要的jar包

    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>${spring.version}</version>
    </dependency>

3.4 Mybatis所需要的jar包

    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>${mybatis.version}</version>
    </dependency>

3.5 Mybatis与Spring整合所需要的jar包

    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>1.3.1</version>
    </dependency>

3.6 数据库连接所需要的jar包

    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>8.0.19</version>
      <scope>runtime</scope>
    </dependency>

3.7 数据库连接池

    <dependency>
      <groupId>com.mchange</groupId>
      <artifactId>c3p0</artifactId>
      <version>0.9.5.2</version>
    </dependency>

3.8 其他jar包

    <!-- 单元测试 -->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.12</version>
    </dependency>

    <!-- 实现slf4j接口并整合 -->
    <dependency>
      <groupId>ch.qos.logback</groupId>
      <artifactId>logback-classic</artifactId>
      <version>1.2.2</version>
    </dependency>

    <!-- JSON -->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.8.7</version>
    </dependency>

3.9 打包后的项目名称

  <build>
    <finalName>ssm</finalName>
  </build>

4 web.xml文件配置,声明DispatcherServlet和过滤器(编码过滤器)

4.1 编写编码过滤器,统一页面编码

<!--  先过虑器filter, 后servlet,不然xml报错-->
  <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>

4.2 编写web配置文件位于WEB-INF中,配置DispatcherServlet,这是SpringMVC所要求的,可帮助SpringMVC框架进行请求定位

  <servlet>
    <servlet-name>SpringMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 配置springMVC需要加载的配置文件-->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:spring-*.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
  </servlet>
  <servlet-mapping>
    <servlet-name>SpringMVC</servlet-name>
    <!-- 匹配所有请求 -->
    <url-pattern>/</url-pattern>
  </servlet-mapping>

5 创建数据库和数据表


根据数据模型,确定数据表的字段,建立数据库和数据表
以mysql建数据库为例

DROP DATABASE IF EXISTS cundao;
CREATE DATABASE ssm DEFAULT CHARACTER SET utf8;

use cundao;
CREATE TABLE user(
    id int(11) NOT NULL AUTO_INCREMENT,
    username varchar(50) NOT NULL,
    PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO user VALUES(1,'mistwind');

6 jdbc.properties文件配置,声明与数据库有关的属性


数据库连接必要的属性有jdbc连接驱动、jdbc连接链接、用户、密码

jdbc.driver=com.mysql.cj.jdbc.Driver
#数据库地址
jdbc.url=jdbc:mysql://localhost:3306/cundao?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true
#用户名
jdbc.username=root
#密码
jdbc.password=123456

数据库连接池需要多一些c3p0的配置

#最大连接数
c3p0.maxPoolSize=30
#最小连接数
c3p0.minPoolSize=10
#关闭连接后不自动commit
c3p0.autoCommitOnClose=false
#获取连接超时时间
c3p0.checkoutTimeout=10000
#当获取连接失败重试次数
c3p0.acquireRetryAttempts=2

7 创建对应实体类


根据数据表字段设计符合POJO规则的实体类,即封装且包含getter和setter的Java类

package com.alpaak.entity;

/**
 * User 实体类
 * @author: alpaak
 * @create: 2021-12-21
 *
 */
public class User {
    private int id;
    private String username;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }
}

8 创建DAO接口和mybatis映射文件


设计DAO层,即数据访问层,在Mybatis中,数据库访问层只需要设计接口,其实现有两种方式,一种是由映射文件mapper编写相应方法的SQL语句来实现,另一种是用注解直接在接口方法上编写SQL语句实现

8.1 映射文件实现

<?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" >
<!-- namespace指定该映射文件要实现的接口 -->
<mapper namespace="com.alpaak.dao.UserDao">
    <select id="findUserById" resultType="com.alpaak.entity.User" parameterType="int">
        SELECT * FROM user WHERE id = #{id}
    </select>
</mapper>

8.2 dao接口

package com.alpaak.dao;

import com.alpaak.entity.User;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;

@Repository
public interface UserDao {
//    @Select("SELECT * FROM user WHERE id = #{id}")
    User findUserById(int id);
}

9 配置spring和mybatis整合

以上过程已经配置好了mybatis框架,为了spring能够跟mybatis协同工作,我们需要将spring与mybatis进行整合,即告诉spring一些关于mybatis配置的信息,说到底其实就是让spring管理一个mybatis的对象,可以让整个项目在需要访问数据库时可以直接使用这个数据源,spring-mybatis.xml 的配置如下:

<?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" xmlns:tx="http://www.springframework.org/schema/tx"
       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/tx http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!-- 扫描service包下所有使用注解的类型 -->
    <context:component-scan base-package="com.alpaak.service"/>
    <!-- 加上这一行以后,将自动扫描路径下面的包,如果一个类带了@Service注解,将自动注册到Spring容器,不需要再在applicationContext.xml文件定义bean了,类似的还包括@Component、@Repository、@Controller。 -->

    <!-- 配置数据库相关参数properties的属性:${url} -->
    <context:property-placeholder location="classpath:jdbc.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="${c3p0.maxPoolSize}"/>
        <property name="minPoolSize" value="${c3p0.minPoolSize}"/>
        <property name="autoCommitOnClose" value="${c3p0.autoCommitOnClose}"/>
        <property name="checkoutTimeout" value="${c3p0.checkoutTimeout}"/>
        <property name="acquireRetryAttempts" value="${c3p0.acquireRetryAttempts}"/>
    </bean>

    <!-- 配置SqlSessionFactory对象 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 注入数据库连接池 -->
        <property name="dataSource" ref="dataSource"/>
        <!-- 扫描entity包 使用别名 -->
        <property name="typeAliasesPackage" value="cn.mistwind.entity"/>
        <!-- 扫描sql配置文件:mapper需要的xml文件 -->
        <property name="mapperLocations" value="classpath:mapper/*.xml"/>
    </bean>

    <!-- 配置扫描Dao接口包,动态实现Dao接口,注入到spring容器中 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 注入sqlSessionFactory -->
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        <!-- 给出需要扫描Dao接口包 -->
        <property name="basePackage" value="com.alpaak.dao"/>
    </bean>

    <!-- 配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 注入数据库连接池 -->
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!-- 配置基于注解的声明式事务 -->
    <tx:annotation-driven transaction-manager="transactionManager"/>

</beans>

熟悉spring的基本使用后你会发现,这个配置就是spring最基础的bean配置,其中所有配置项其实就是声明创建了几个需要用到的工具,这个可以在需要用到时再加入,例如上面文件中只需要先加入与数据库连接相关的一些配置

10 测试数据库连接和访问

spring还有一个很好的地方就在于它可以整合一些工具插件,例如JUnit,可以方便我们进行单元测试,配置完spring-mybatis之后,我们可以测试一下spring与mybatis框架是否整合完成了,即能不能直接拿到数据库连接访问到数据库

package com.alpaak;

import com.alpaak.dao.UserDao;
import com.alpaak.entity.User;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)  //进行测试要使用的工具
@ContextConfiguration("classpath:spring-mybatis.xml") //指定配置所在位置
public class UserDaoTest{
    @Autowired //spring自动注入
    private UserDao userDao; //由配置文件spring-mybatis声明创建,相关配置代码段如下

    @Test  //测试方法
//    @Ignore
    public void testFindUserById(){
        int id = 1;
        User user = userDao.findUserById(id);
        System.out.println(user.getId() + " : " + user.getUsername());
    }
}

11 配置springMVC

配置spring-mvc.xml文件

<?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"
       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
       http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

    <!-- 扫描web相关的bean -->
    <context:component-scan base-package="com.alpaak.controller"/>

    <!-- 开启SpringMVC注解模式 -->
    <mvc:annotation-driven/>

    <!-- 静态资源默认servlet配置 -->
    <mvc:default-servlet-handler/>

    <!-- 配置jsp 显示ViewResolver -->
<!--    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">-->
<!--        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>-->
<!--        <property name="prefix" value="/WEB-INF/views/"/>-->
<!--        <property name="suffix" value=".jsp"/>-->
<!--    </bean>-->
</beans>

[

](https://blog.csdn.net/marwi_study/article/details/105658217)

12 业务管理层编写(包括接口和实现类),根据业务逻辑调用持久层接口

业务管理层是将项目要完成的业务逻辑输入到项目中来,它就相当于一个工厂中的工人,使用工厂中的工具进行要求的生产工作,而DAO就是我们的工具,业务管理层希望能够对从数据库获得的数据进行必要的处理来为控制层提供服务。业务管理层需要编写一些接口和接口的实现类,这样做的好处是可以解耦,方便我们后期修改方法实现

package com.alpaak.service;


import com.alpaak.entity.User;

/**
 * 业务接口类型
 */
public interface UserService {
    public User findUserById(int id);
}
package com.alpaak.service;

import com.alpaak.dao.UserDao;
import com.alpaak.entity.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * 业务实现类
 */
//创建一个名为userService的对象注入到Spring容器中,类似于Component,不指明名字以userServiceImpl为名,可用Scope指定是否单例
@Service("userService")
public class UserServiceImpl implements UserService {

    @Autowired
    private UserDao userDao;

    public User findUserById(int id) {
        return userDao.findUserById(id);
    }
}

13 控制层编写,响应前端发送过来的请求,调用业务层接口做相应的处理


如果说业务管理层是工人的话,那控制层就是经理,它可以调动工人使用其服务来响应视图层的请求。上面提到的DispatcherServlet可以帮忙定位,而我们的控制层就是要完成跳转后的工作的

package com.alpaak.controller;

import com.alpaak.entity.User;
import com.alpaak.service.UserService;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;

@RestController //标记为MVC的控制器类,方便DispatcherServlet进行扫描定位
public class UserController {
    @Resource
    private UserService userService;

    @GetMapping("/findUser")
    public User findUser() {
        int id = 1;
        return userService.findUserById(id);
    }
}

14 logback.xml文件配置,完成日志输出的相关配置

这个配置是一个长远的配置,为的是开发过程中出现错误以及后期的维护所需要的日志输出配置

<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true">
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
        </encoder>
    </appender>
    <root level="debug">
        <appender-ref ref="STDOUT"/>
    </root>
</configuration>


3 配置tomcat服务器运行程序

3.1 下载tomcat8

官网地址:https://tomcat.apache.org/download-80.cgi
image.png

3.2 idea配置tomcat

3.2.1 将apache-tomcat-8.5.73-windows-x64.zip文件解压到 d:\tool\java

解压目录如下
image.png

3.2.2 点击右上角,然后选择Edit Configurations

image.png

3.2.3 如图选择tomcat Server -> Local

image.png

3.2.4 配置tomcat的server路径

image.png

3.2.5 部署war包

image.png

3.2.6 更改工程名称
image.png

3.4 运行服务器

3.4.1 运行tomcat

image.png

启动后成功日志如下
image.png

3.4.2 测试程序

浏览器中输入:http://localhost:8080/ssm/
返回默认html页面
image.png

浏览器中输入: http://localhost:8080/ssm/findUser
返回数据库数据如下
image.png
喜欢各位小朋友,SSM搭建成功!~

3.4.3 控制台乱码解决

如果有乱码,打开文件 \apache-tomcat-8.5.73\conf\logging.properties
将如图位置修改为GBK,重新启动程序

image.png

4 项目原码地址

https://gitee.com/alpaak/hello-ssm.git
使用gitbash拉取:
git clone https://gitee.com/alpaak/hello-ssm.git