一,前提

把Spring+SpringMVC+Mybatis框架整合成一套,在后期企业级开发中,可以实现重复使用
Mybatis:操作数据库的框架,特点:只需要写出Dao层接口和接口中方法对应的SQL语句
SpringMVC:实现对外的接口,特点:代替Servlet,接受请求(键值对,字符串(json或者xml),路径传参),给出相应(页面路径,数据)
Spring:实现其他框架的整合,特点:提供IOC,同意进行对象的创建和管理,还提供AOP,可以在不改变的源码的情况下,对某些方法的增强。

二,准备

2.1数据库

  1. CREATE TABLE `t_work` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  4. `company` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  5. `money` double(255, 0) NULL DEFAULT NULL,
  6. `city` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
  7. PRIMARY KEY (`id`) USING BTREE
  8. ) ENGINE = InnoDB AUTO_INCREMENT = 1 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
  9. SET FOREIGN_KEY_CHECKS = 1;

2.2复习

各个框架的所需要的包,配置,核心代码

三,SSM整合

3.1依赖jar包

数据库
mybatis
spring
SpringMVC
其他相关

<dependencies>
<!--        数据库 驱动和连接池-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.26</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.6</version>
        </dependency>
<!--        Mybatis相关 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.7</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.6</version>
        </dependency>

<!--        SpringMVC相关-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.9</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.12.4</version>
        </dependency>

<!--        Spring相关-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.3.9</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>5.3.9</version>
        </dependency>
<!--        其他jar-->
<!--        文件上传-->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.4</version>
        </dependency>
<!--        简化类-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.20</version>
        </dependency>
<!--        单元测试-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>
        <!--        日志log4j-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
<!--        Servlet-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
            <scope>provided</scope>
        </dependency>
    </dependencies>

3.2实现配置

1.数据库连接配置

2.日志配置

3.spring的全局配置

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

<!--   1.加载外部的配置,一般都是数据库连接信息 -->
<!--    <context:property-placeholder location="classpath*:dbconfig.properties"></context:property-placeholder>-->

<!--    2.配置数据库连接信息,创建数据库连接池的对象-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
        <property name="url" value="jdbc:mysql://39.105.189.141:3307/db_j218?useUnicode=true&amp;serverTimezone=Asia/Shanghai&amp;characterEncoding=UTF8"></property>
        <property name="driverClassName" value="com.mysql.cj.jdbc.Driver"></property>
        <property name="username" value="root"></property>
        <property name="password" value="zzjava"></property>
    </bean>

<!--    3.配置Mybatis的连接工厂信息-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--        设置数据库连接池-->
        <property name="dataSource" ref="dataSource"></property>
<!--        配置映射文件所在的路径-->
        <property name="mapperLocations">
            <array>
                <value>classpath:mapper/*Mapper.xml</value>
            </array>
        </property>
    </bean>

<!--    4.Mybatis的扫描的对象 指定持久层的包-->
    <bean id="mapperScanner" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
        <property name="basePackage" value="com.feri.ssm.dao"></property>
    </bean>

<!--    5.配置需要IOC创建的额对象-->
    <bean id="workServiceImpl" class="com.feri.ssm.service.impl.WorkServiceImpl">
        <property name="dao" ref="workDao"></property>
    </bean>
</beans>

4.springmvc的配置

<?xml version="1.0" encoding="UTF-8" ?>
<beans     xmlns="http://www.springframework.org/schema/beans"
          xmlns:context="http://www.springframework.org/schema/context"
          xmlns:mvc="http://www.springframework.org/schema/mvc"
          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
                            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.xsd">
<!--    1.扫描控制层所在包,创建对应的类的对象,存储到IOC-->
    <context:component-scan base-package="com.feri.ssm.controller"></context:component-scan>
<!--    2.配置MVC相关信息-->
    <mvc:annotation-driven></mvc:annotation-driven>
<!--    放行静态资源-->
    <mvc:default-servlet-handler></mvc:default-servlet-handler>
</beans>

5.web.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">
  <display-name>ssm</display-name>
<!--  1.配置Spring的上下文对象 -->
  <!--  1.1初始化参数加载Spring的配置文件 -->
  <context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring.xml</param-value>
  </context-param>
  <!--  1.2.Spring的核心 监听器 监听ServletContext的生命周期,并创建上下文-->
  <listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
<!--2.Springmvc的前端控制器的配置 Servlet -->
  <!--  2.1.注册SpringMVC的前端控制器 就是Servlet的注册-->
  <servlet>
    <servlet-name>mvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <!-- 2.2 局部参数:声明配置文件位置 -->
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>classpath:springMVC.xml</param-value>
    </init-param>
  </servlet>
<!--  2.3 配置Servlet的触发路径-->
  <servlet-mapping>
    <servlet-name>mvc</servlet-name>
    <url-pattern>/*</url-pattern>
  </servlet-mapping>
</web-app>

3.3代码编写

3.3.1项目分包

entity—-实体包:对应数据库表
dao——-持久层:实现表的常用方法(CRUD)
mapper—映射文件夹:实现对应持久层的映射文件,定义接口中方法的sql语句
service—
intf —-业务接口层,实现业务逻辑功能的方法定义
impl—业务实现层,重写接口层的方法,实现业务逻辑
manager—
intf—-业务通用接口层,非数据库相关的业务逻辑的方法定义
impl—业务通用实现层,非数据库相关的业务逻辑的方法定义
contreller—控制层,实现对外的接口,接受请求和给出相应
fonfig———配置层,存储一些通用配置信息
util————-工具层,封装的一些工具类
dto————-数据转换层,实现实体类的转化操作
bo—————业务对象层,封装业务层的类
vo—————视图对象层,封装终端(网站,app,小程序,快应用,物联网等)
exception—异常层,封装自定义异常
filter———-过滤器层
listerner—-监听器层
……

3.3.2搭架子

@Data
public class Work {
    private Integer id;
    private String name;
    private String company;
    private double money;
    private String city;
}
<?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.qfedu.ssm.dao.WorkDao">
    <insert id="add" useGeneratedKeys="true" keyProperty="id">
        insert into t_work(name,company,city,money) values (#{name},#{company},#{city},#{money});
    </insert>
    <select id="selectAll" resultType="com.qfedu.ssm.entity.Work">
        select * from t_work order by id desc
    </select>
</mapper>

业务层:

public interface WorkService {
    //新增
    int save(Work work);
    //查询
    List<Work> queryAll();
}
@Data
@Service
public class WorkServiceImpl implements WorkService {
    @Autowired
    private WorkDao dao;

    public int add(Work work) {
        return dao.add(work);
    }

    public List<Work> selectAll() {
        return dao.selectAll();
    }
}@Data
public class WorkServiceImpl implements WorkService {
    //依赖
    private WorkDao dao;

    @Override
    public int save(Work work) {
        return dao.save(work);
    }

    @Override
    public List<Work> queryAll() {
        return dao.selectAll();
    }
}

控制层:

@Controller
@RequestMapping("/api/work")
public class WorkController {
    @Autowired
    private WorkService service;
    //新增
    @ResponseBody
    @RequestMapping(value = "add",method = {RequestMethod.POST})
    public int add(Work work){
        return service.add(work);
    }
    //查询所有
    @ResponseBody
    @RequestMapping(value = "selectAll",method = {RequestMethod.GET})
    public List<Work> selectAll(){
        return service.selectAll();
    }
}

页面:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>SSM整合</title>
    <script src="https://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<!--    <script src="js/jquery-3.2.1.min.js"></script>-->
    <style>
        #fm1{
            font-size: 20px;
            text-align: center;
        }
        #fm1 div{
            margin: 10px;
        }
        label,input{
            font-size: 25px;
            padding: 10px;
        }
        button{
            margin-top: 10px;
            font-size: 20px;
            padding: 10px;
            color: white;
            border-radius: 10px;
            background-color: red;
        }
        fieldset{
            border: 5px solid green;
        }
        table{
            width: 80%;
            margin-top: 20px;
            border: 1px solid aqua;
        }
        .dv2{
            text-align: center;
            align-items: center;
            width: 100%;
        }

    </style>
</head>
<body>
<div>
<!--    新增-->
    <div>
        <form id="fm1">
            <fieldset>
                <legend>录入你的入职信息:</legend>
                <div>
                    <label>姓名:</label><input name="name" placeholder="请输入姓名">
                </div>
                <div>
                    <label>公司:</label><input name="company" placeholder="请输入公司">
                </div>
                <div>
                    <label>城市:</label><input name="city" placeholder="请输入城市">
                </div>
                <div>
                    <label>薪水:</label><input name="money" placeholder="请输入薪水">
                </div>
                <div id="dv1">
                    <button type="button" onclick="add()">新增入职信息</button>
                </div>
                </fieldset>
        </form>
    </div>

<!--    列表-->
    <div class="dv2">
        <div><button id="btn2" onclick="refushData()">刷新数据</button></div>
        <table>
            <tr>
                <th>序号</th>
                <th>姓名</th>
                <th>公司</th>
                <th>城市</th>
                <th>薪水</th>
            </tr>
            <tbody id="tbdata">
            <tr>
                <td>1</td>
                <td>大龙</td>
                <td>神州数码</td>
                <td>北京</td>
                <td>18888</td>
            </tr>
            </tbody>
        </table>
    </div>
</div>
<script type="text/javascript">
    function add(){
        //获取新增的参数信息
        var data=$("#fm1").serialize();
        //请求后端接口,传递数据

        $.post("api/work/add",data,function(res){
            console.log(res);
            if(res==1){
                // alert("新增成功!");
                refushData();
            }
        })
    }
    function refushData(){
        alert("查询成功")
        $("#tbdata").html("");
        $.get("api/work/selectAll",function(res){
            console.log(res);
            for(i in res){
                var w=res[i];
                $("#tbdata").append("<tr><td>"+w.id+"</td><td>"+w.name+"</td><td>"+w.company+"</td><td>"+w.city+"</td><td>"+w.money+"</td></tr>")
            }
        })
    }
</script>
</body>
</html>

https://www.runoob.com/
Ajax网页请求后端接口的技术,只要在网页上,想要调用后端的接口,就可以用Ajax
后端接口的请求方式不一样,页面选择方法也不一样:
post:
$.post(”后端接口地址”,后端接口需要的参数,function(res){
res就是后端接口的返回值
})
get:
$.get(“后端接口地址?需要传递的参数”,function(res){
res就是后端接口的返回值
})

3.3.3运行测试

image.png