SSM | SSM框架整合


在这里插入图片描述

作者简介 :一只大皮卡丘,计算机专业学生,正在努力学习、努力敲代码中! 让我们一起继续努力学习!

该文章参考学习教材为:
《Java EE企业级应用开发教程 (Spring + Spring MVC +MyBatis)》 黑马程序员 / 编著
文章以课本知识点 + 代码为主线,结合自己看书学习过程中的理解和感悟 ,最终成就了该文章

文章用于本人学习使用 , 同时希望能帮助大家。
欢迎大家点赞👍 收藏⭐ 关注💖哦!!!

(侵权可联系我,进行删除,如果雷同,纯属巧合)


一、整合环境搭建

整合思路

  • 由于 Spring MVCSpring框架 中的 一个模块,所以 Spring MVCSpring之间不存在整合的问题,只要引入相应JAR 包就可以直接使用。因此 SSM框架的整合就只涉及SpringMyBatis的整合,以及 Spring MVC与MyBatis的整合,如下图所示

    在这里插入图片描述

  • 在讲SpringMyBatis框架的整合时,我们是 通过Spring实例化Bean,然后 调用实例对象中的查询方法 来执行 MyBatis映射文件中SQL语句 的,如果能够正确查询出数据库中的数据,那么我们就 认为Spring 与MyBatis框架整合成功 。同样,在学习完 Spring MVC 后,如果我们可以 通过前台页面来执行查询方法,并且 查询出的数据 能够在 页面中正确显示,那么我们 也可以认为三大框架整合成功

准备所需JAR包

  • 实现SSM框架的整合,首先要准备 这三个框架JAR包,以及 其他整合所需JAR包 ,将 整合所需JAR包 添加到 WEB-INF下lib包 下。

    SSM框架整合所需JAR

编写配置文件

  • db.properties

    jdbc.driver = com.mysql.jdbc.Driver
    jdbc.url =jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=UTC
    jdbc.username = root
    jdbc.password = root
    #最大连接数
    jdbc.maxTotal = 30
    #最大空闲数
    jdbc.maxIdle = 10
    #初始化连接数
    jdbc.initialSize = 5
    
  • log4j.properties :

    # 因为Mybatis默认使用功能log4j来输出日志信息,所以如果要查看控制处输出sql语句
    # 就要在classpath路径下配置log4g的配置文件 : log4j.properties (log4j要配置的"日志文件") :
    # 即在src目录下配置 log4j.properties配置文件,然后将以下的配置信息复制到配置文件中
    
    # Global logging configuration
    log4j.rootLogger=ERROR, stdout
    # MyBatis logging configuration...
    
    #将com.myh包下所有类的日志记录设计为DEBUG
    log4j.logger.com.myh=DEBUG
    # Console output...
    log4j.appender.stdout=org.apache.log4j.ConsoleAppender
    log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
    log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
    
  • applicationContext.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/tool
           http://www.springframework.org/schema/tool/spring-tool.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
    
    
        <!--  读取db.properties文件  property-placeholder : 特性占位符 -->
        <context:property-placeholder location="classpath:db.properties"/>
    
        <!--  配置数据源 : BasicDataSource : 基本数据源-->
        <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
            <property name="driverClassName" value="${jdbc.driver}"/>
            <property name="url" value="${jdbc.url}"/>
            <property name="username" value="${jdbc.username}"/>
            <property name="password" value="${jdbc.password}"/>
            <!--  最大连接数 -->
            <property name="maxTotal" value="${jdbc.maxTotal}"/>
            <!--  最大空闲连接数 -->
            <property name="maxIdle" value="${jdbc.maxIdle}"/>
            <!--  初始化连接数 -->
            <property name="initialSize" value="${jdbc.maxTotal}"/>
        </bean>
    
        <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
            <!-- ref是引用"本页面"的内容  value是引入"非本页面"有的内容 -->
            <property name="dataSource" ref="dataSource"/>
        </bean>
    
        <!--  开启事务注解 -->
        <tx:annotation-driven transaction-manager="transactionManager"/>
    
        <!--  配置Mybatis的内容 : 配置SqlSessionFactory : SqlSession工厂  -->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <!--  注入数据源  -->
            <property name="dataSource" ref="dataSource"/>
            <!--  指定Mybatis配置文件的位置  -->
            <property name="configLocation" value="classpath:mybatis-config.xml"/>
        </bean>
    
        <!-- 配置mapper扫描器,将指定包下的所有XxxDao.java加入到IOC容器中 (就不用手动将一个一个将将XxxDao接口加入到IOC容器中) -->
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <property name="basePackage" value="com.myh.dao"/>
        </bean>
    
        <!--  进行“组件扫描”,根包扫描,让注解生效 -->
        <context:component-scan base-package="com.myh.service"/>
    
    </beans>
    
  • springmvc-config.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: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 http://www.springframework.org/schema/mvc/spring-mvc.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    
    
        <!--  配置组件扫描,进行根包扫描,让注解生效  -->
        <context:component-scan base-package="com.myh.controller"/>
    
        <!--  配置视图解析器  -->
        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/jsp/"/>
            <property name="suffix" value=".jsp"/>
        </bean>
    
        <!--  注解驱动 :
          作用1 : 用于启用"注解驱动"的"控制器方法",同时让注解生效。(一般而言,用到"控制器类"或"控制器方法" 就要配置"注解驱动")
          作用2 : 会注册RequestMappingHandlerMapping 和 RequestMappingHandlerAdapter这两个bean
          作用3 : 对“读写XML”和“读写JSON”的支持 (所以此处的JSON数据交互要在springmvc-config.xml中用此注解)
          作用4 : <mvc:annotation-driven/>注解会会自动配置一些常用的消息转换器(Message Converters),其中就包括处理JSON数据的`MappingJackson2HttpMessageConverter`(所以进行JSON数据交互时要导入该标签: 注解驱动)
       -->
        <!--  配置注解驱动  -->
        <mvc:annotation-driven/>
    
    </beans>
    
  • web.xml :

    <?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">
    
        <!--  加载Spring的配置文件: applicationContext.xml   -->
        <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext.xml</param-value>
        </context-param>
        <!--   配置加载Spring文件的监听器 -->
        <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
        </listener>
    
    
        <!--  编码过滤器 -->
        <filter>
            <filter-name>encoding</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>encoding</filter-name>
            <url-pattern>*.action</url-pattern>
        </filter-mapping>
    
    
        <!--  配置前端控制器 -->
        <servlet>
            <servlet-name>dispatcherServlet</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <!--  配置springmvc-config.xml的位置  -->
            <init-param>
                <param-name>contextConfigLocation</param-name>
                <param-value>classpath:springmvc-config.xml</param-value>
            </init-param>
            <!--  配置启动服务器时加载该配置文件,加载该servlet  -->
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>dispatcherServlet</servlet-name>
            <!-- / : 拦截所有请求(除了jsp) -->
            <url-pattern>/</url-pattern>
        </servlet-mapping>
    </web-app>
    

    实际开发时,为了 避免Spring配置文件 中的 信息过于臃肿,通常会将 Spring配置文件中信息按照不同功能分散多个配置文件 中。例如可以将 事务配置 放置在名称为 applicationContext-transaction.xml文件中,将 数据源等信息放置在名称applicationContext-db.xml 的文件中等。这样,在 web.xml 中配置加载Spring文件信息时,只需通过 applicationContext-*.xml方式自动加载全部配置文件


  • mybatis-config.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">
    <configuration>
    
        <!--  配置别名,不用写全限定类名,写类名对应的小写类名即可  -->
        <!--  为持久化类设置“别名”  -->
        <typeAliases>
            <package name="com.myh.po"/>
        </typeAliases>
    
    </configuration>
    

二、整合应用测试

  • 通过 上面的配置已经完成SSM框架整合环境搭建工作,可以说完成了这些配置后,就已经 完成了这三个框架大部分整合工作。接下来,同样以 查询客户信息为例,来讲解 SSM 框架整合开发,其 具体实现步骤如下

    Customer.java :

    package com.myh.po;
    
    /**
     *  po包为"持久化包", Customer为“客户持久化类”
     */
    public class Customer {
    
        private Integer id;
        private String username;
        private String jobs;
        private String phone;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getJobs() {
            return jobs;
        }
    
        public void setJobs(String jobs) {
            this.jobs = jobs;
        }
    
        public String getPhone() {
            return phone;
        }
    
        public void setPhone(String phone) {
            this.phone = phone;
        }
    
        @Override
        public String toString() {
            return "Customer{" +
                    "id=" + id +
                    ", username='" + username + '\'' +
                    ", jobs='" + jobs + '\'' +
                    ", phone='" + phone + '\'' +
                    '}';
        }
    }
    

    CustomerMapper.java :

    package com.myh.mapper;
    
    
    import com.myh.po.Customer;
    
    /**
     * 直接操作数据库的CustomerMapper.xml文件对应的接口文件 : CustomerMapper.java,
     * 将两者链接之后,调用 CustomerMapper.java接口中的方式即可操作数据库
     */
    public interface CustomerMapper {
    
        /**
         *  根据id查查询客户信息
         */
        public Customer findCustomerById(Integer id);
    }
    

    CustomerMapper.xml :

    <?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.myh.mapper.CustomerMapper">
    
        <!-- 根据id查询客户信息 -->
        <select id="findCustomerById" parameterType="Integer" resultMap="resultMap">
            select * from tb_customer where t_id = #{id}
        </select>
    
    
        <resultMap id="resultMap" type="com.myh.po.Customer">
            <id property="id" column="t_id"/>
            <result property="username" column="t_username"/>
            <result property="jobs" column="t_jobs"/>
            <result property="phone" column="t_phone"/>
        </resultMap>
    </mapper>
    

    CustomerService.java接口):

    package com.myh.service;
    
    import com.myh.po.Customer;
    
    public interface CustomerService { //接口
    
        public Customer findCustomerById(Integer id);
    }
    

    CustomerServiceImpl.java实现类):

    package com.myh.service.Impl;
    
    import com.myh.mapper.CustomerMapper;
    import com.myh.po.Customer;
    import com.myh.service.CustomerService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Service;
    import org.springframework.transaction.annotation.Transactional;
    
    @Service //用该注解将该类加入到IOC容器中
    @Transactional //将类将开启事务
    public class CustomerServiceImpl implements CustomerService {
    
        @Autowired
        private CustomerMapper customerMapper;
    
        public Customer findCustomerById(Integer id) {
            return this.customerMapper.findCustomerById(id);
        }
    }
    

    上面的代码 中,使用了 @Service 注解来标识业务层实现类,使用了 @Transactional注解来标识类中的所有方法都纳入 Spring 的事务管理,并使用 @Autowired注解CustomerMapper接口对象注入到本类中,然后在本类的查询方法中调用了CustomerMapper对象的查询客户方法

    CustomerController.java处理器类):

    package com.myh.controller;
    
    import com.myh.po.Customer;
    import com.myh.service.CustomerService;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.ui.Model;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    
    @Controller //将该类标记为"处理器类",使该类中的方法能被url链接到、查询到
    public class CustomerController { //控制器类
    
        @Autowired
        private CustomerService customerService;
    
        /**
         * 根据id查询客户详情
         */
        @RequestMapping("/findCustomerById")
        public String findCustomerById(Integer id, Model model) {
            Customer customer = customerService.findCustomerById(id);
            //使用功能model响应数据给前端
            model.addAttribute("customer", customer);
            //返回客户信息展页面
            return "customer";
    
        }
    }
    

    Customer.jsp :

    <%@ page contentType="text/html;charset=UTF-8" language="java" %>
    <html>
    <head>
        <title>客户信息展示页面</title>
    </head>
    <body>
    <table border="1">
        <tr>
            <td>编号</td>
            <td>名称</td>
            <td>职业</td>
            <td>电话</td>
        </tr>
        <tr>
            <td>${customer.id}</td>
            <td>${customer.username}</td>
            <td>${customer.jobs}</td>
            <td>${customer.phone}</td>
        </tr>
    </table>
    </body>
    </html>
    

    上述代码中,编写了一个用于展示客户信息格,表格会通过 EL表达式 来获取控制层返回客户信息

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/485463.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Qt——2D画图

基础画图函数 矩形 painter.drawRect(50,50,200,100); 圆角矩形 painter.drawRoundRect(50,50,200,200,50,50); xRadius和yRadius分别以矩形宽度和高度的一半的百分比指定&#xff0c;并且应该在0.0到100.0的范围内 弧线 painter.drawArc(50,50,200,200, -90*16, 90*16);…

基于nodejs+vue学生作业管理系统python-flask-django-php

他们不仅希望页面简单大方&#xff0c;还希望操作方便&#xff0c;可以快速锁定他们需要的线上管理方式。基于这种情况&#xff0c;我们需要这样一个界面简单大方、功能齐全的系统来解决用户问题&#xff0c;满足用户需求。 课题主要分为三大模块&#xff1a;即管理员模块和学生…

[AutoSar]BSW_ECUC模块配置

目录 关键词平台说明一、背景二、EcucGeneral2.1 BswInitialization 三、EcucHardware四、EcucPduCollection五、EcucPartitionCollection 关键词 嵌入式、C语言、autosar、OS、BSW 平台说明 项目ValueOSautosar OSautosar厂商vector &#xff0c; EB芯片厂商TI 英飞凌编程语…

三星解释其 108MP Nonacell 传感器中的 PDAF 像素遮蔽

Electronic Imaging 发表了三星论文“采用 Nonacell 和 Super PD 的 CMOS 图像传感器的新型 PDAF 校正方法,以提高合并模式下的图像质量”,作者为 Yeongheup Jang、Hyungwook Kim、Kundong Kim、Sungsu Kim、Sungyong Lee 和 Joonseo Yim。 本文提出了一种新的 PDAF 校正方法…

【stable diffusion扩散模型】一篇文章讲透

目录 一、引言 二、Stable Diffusion的基本原理 1 扩散模型 2 Stable Diffusion模型架构 3 训练过程与算法细节 三、Stable Diffusion的应用领域 1 图像生成与艺术创作 2 图像补全与修复 3 其他领域 四、Stable Diffusion的优势与挑战 &#x1f449;优势 &#x1f…

【云开发笔记No.9】Kanban与敏捷开发

Kanban看板起源于丰田。 看板&#xff08;Kanban&#xff09;一词来自日文&#xff0c;本义是可视化卡片。如下图所示&#xff0c;看板工具的实质是&#xff1a;后道工序在需要时&#xff0c;通过看板向前道工序发出信号——请给我需要数量的输入&#xff0c;前道工序只有得到看…

OpenHarmony IDL工具规格及使用说明书(仅对系统应用开放)

IDL接口描述语言简介 当客户端和服务器进行IPC通信时&#xff0c;需要定义双方都认可的接口&#xff0c;以保障双方可以成功通信&#xff0c;OpenHarmony IDL&#xff08;OpenHarmony Interface Definition Language&#xff09;则是一种定义此类接口的工具。OpenHarmony IDL先…

SpringBoot 文件上传(三)

之前讲解了如何接收文件以及如何保存到服务端的本地磁盘中&#xff1a; SpringBoot 文件上传&#xff08;一)-CSDN博客 SpringBoot 文件上传&#xff08;二&#xff09;-CSDN博客 这节讲解如何利用阿里云提供的OSS&#xff08;Object Storage Service)对象存储服务保存文件。…

Linux升级GCC

文章目录 一、安装 EPEL 仓库二、更新yum三、安装 CentOS 开发工具组四、安装scl五、安装gcc 11六、启用gcc 11七、设置永久使用 一、安装 EPEL 仓库 命令&#xff1a; yum install epel-release -y二、更新yum 命令&#xff1a; yum update -y三、安装 CentOS 开发工具组 …

Unity 背包系统中拖拽物体到指定位置或互换位置效果的实现

在Unity中&#xff0c;背包系统是一种常见的游戏系统&#xff0c;可以用于管理和展示玩家所持有的物品、道具或装备。 其中的拖拽功能非常有意思&#xff0c;具体功能就是玩家可以通过拖拽物品图标来移动物品在背包中的位置&#xff0c;或者将物品拖拽到其他位置或界面中&…

【数据结构和算法初阶(C语言)】二叉树的链式结构--前、中、后序遍历实现详解,节点数目计算及oj题目详解---二叉树学习日记③

1.二叉树的链式存储 二叉树的链式存储结构是指&#xff0c;用链表来表示一棵二叉树&#xff0c;即用链来指示元素的逻辑关系。 通常的方法是 链表中每个结点由三个域组成&#xff0c;数据域和左右指针域&#xff0c;左右指针分别用来给出该结点左孩子和右孩子所 在的链结点的存…

20240319-图论

图论练习题目 拓扑排序深度优先搜索方法广度优先搜索方法 无向无权图无向有权图有向无权图 利用广度优先搜索算法有向有权图 带排序的广度优先算法/dijkstra最小生成树prims算法Kruskals Algorithm 最小割 min-cut二分图 Bipartite Graph 队列例题1 所有可能的路径例题2 岛屿数…

Redis 教程系列之Redis 集群配置(十三)

1.Redis集群方案比较 主从模式 在软件的架构中,主从模式(Master-Slave)是使用较多的一种架构。主(Master)和从(Slave)分别部署在不同的服务器上,当主节点服务器写入数据时,同时也会将数据同步至从节点服务器,通常情况下,主节点负责写入数据,而从节点负责读取数据。…

【计算机网络_网络层】IP协议

文章目录 1. IP的基本概念1.1 什么是IP协议1.2 为什么要有IP协议 2. IP的协议格式3. 网段划分&#xff08;重要&#xff09;3.1 为什么要进行网段划分3.2 网段划分的规则3.2.1 古老的划分方案3.2.2 现代的划分方案 4. 特殊的IP地址5. 解决IP地址的数量限制问题6. 私有IP和公网I…

RecyclerView notifyItemRemoved 之后的源码分析

源码版本&#xff1a;androidx1.3.2 分析场景&#xff1a; RecyclerView使用线性布局&#xff0c;方向为竖直方向&#xff0c;布局从上到下&#xff0c;宽高都是 MATCH_PARENT。开始有3条数据。然后移除 position 1 的数据。 流程图 先说下结论&#xff1a; 在 dispatchL…

24. UE5 RPG制作属性面板(二)

在上一篇中&#xff0c;我们创建属性面板的大部分样式&#xff0c;这一篇里面接着制作。 在这一篇里我们需要有以下几个方面&#xff1a; 在界面增加一个属性按钮。属性按钮增加事件&#xff0c;点击时可以打开属性面板&#xff0c;属性面板打开时无法再次点击按钮。点击属性面…

操作系统究竟是什么?在计算机体系中扮演什么角色?

操作系统究竟是什么&#xff1f;在计算机体系中扮演什么角色&#xff1f; 一、操作系统概念二、操作系统如何管理软硬件资源2.1 何为管理者2.2 操作系统如何管理硬件 三、系统调用接口作用四、用户操作接口五、广义操作系统和狭义操作系统 一、操作系统概念 下面是来自百度百科…

动态规划Dynamic Programming

上篇文章我们简单入门了动态规划&#xff08;一般都是简单的上楼梯&#xff0c;分析数据等问题&#xff09;点我跳转&#xff0c;今天给大家带来的是路径问题&#xff0c;相对于上一篇在一维中摸爬滚打&#xff0c;这次就要上升到二维解决问题&#xff0c;但都用的是动态规划思…

STM32微控制器中,如何处理多个同时触发的中断请求?

在STM32微控制器中&#xff0c;处理多个同时触发的中断请求需要一个明确的中断优先级策略&#xff0c;以确保关键任务能够及时得到响应。STM32的中断控制器&#xff08;NVIC&#xff09;支持优先级分组&#xff0c;允许开发者为不同的中断设置抢占优先级和子优先级。本文将详细…

Matlab|【免费】智能配电网的双时间尺度随机优化调度

目录 1 主要内容 基础模型 2 部分代码 3 部分程序结果 4 下载链接 1 主要内容 该程序为文章《Two-Timescale Stochastic Dispatch of Smart Distribution Grids》的源代码&#xff0c;主要做的是主动配电网的双时间尺度随机优化调度&#xff0c;该模型考虑配电网的高效和安…