SSM(Spring+SpringMVC+MyBatis) 整合案例详细步骤

SSM 整合简介

SSM整合是指将Spring、Spring MVC和MyBatis三个开源框架结合使用,来搭建企业级Java Web应用的后端架构。每个框架在整体架构中承担不同的职责:

  1. Spring:作为核心控制层框架,负责管理对象(Bean)的生命周期以及依赖注入(DI),通过IoC容器简化了组件之间的耦合关系,并提供了AOP(面向切面编程)支持。
  2. Spring MVC:是Spring框架的一部分,专注于处理Web层请求响应的模型-视图-控制器(MVC)设计模式。它负责接收HTTP请求,解析参数,调用业务服务层,然后返回视图给客户端。
  3. MyBatis:是一个持久层框架,它与JDBC相结合,提供了一种更加灵活的方式来操作数据库。MyBatis可以自动生成SQL语句,执行数据库操作,并且通过映射文件或注解将结果集自动转换为Java对象。

常见组合:

常见框架集成组合:SSH 和 SSM

SSH: Spring + Struts + Hibernate 【已过时】

SSM : Spring+SpringMVC+Mybatis ( MyBatisPlus )

版本

Spring6 + JDK17 + Tomcat10 + MySql8 +Maven

Spring5 + JDK17(或之前) + Tomcat9 + MySql8 +Maven

步骤思路

思路:

  • Spring + mybatis (先使用 Spring 整合 MyBatis )
  • SpringMVC + Spring + Mybatis(在 Spring 整合 SpringMVC)

详细步骤:

  • 新建 Maven Web 项目

  • 配置 pom.xml 依赖

    • mybatis 、spring-webmvc、mysql驱动、lombok、jstl、servlet、junit、mybatis-spring 、spring-orm、druid连接池
  • mybatis 相关配置文件

    • mybatis-connfig.xml 、db.properties、mapper.xml
    • mybatis-config.xml:别名、SQL日志、数据源配置(username,password,url,driver)
    • mapper.xml : insert 、select、update、delete
  • spring + mybatis 相关配置

    • spring.xml:扫描基包

    • DataSource、SessionFactory、扫描Mapper接口包

    • 数据库的设计及初始化

    • 代码:

      • pojo
      • dao 接口
      • service
      • 编写mapper.xml ,编写SQL
  • springmvc 相关配置

    • web.xml、springmvc.xml

详细步骤

1. 建库建表

CREATE DATABASE booksys;
USE booksys;
CREATE TABLE book(bookid INT PRIMARY KEY AUTO_INCREMENT,bookname VARCHAR(50),price FLOAT,author VARCHAR(50),pubDate DATE,ADDDATE DATETIME,modDate DATETIME
);

2. 新建 Maven Web项目

  • 方式一:普通 Maven 选择 Web 骨架
    • 手动新建 java 目录
    • 手动新建 test 目录
  • 方式二:jakartaEE -> 选择 Web Application 模板
    • 自动生成 java 目录、webapp目录、test 目录
    • 自动配置部分基础依赖

3. 配置 pom.xml

mybatis 、spring-webmvc、mysql驱动、lombok、jstl、servlet、junit、mybatis-spring 、spring-orm、druid连接池

完整配置:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.wdzl.booksys</groupId><artifactId>ssm2023</artifactId><packaging>war</packaging><version>1.0-SNAPSHOT</version><name>ssm2023 Maven Webapp</name><url>http://maven.apache.org</url><properties><spring-version>5.3.9</spring-version></properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>3.8.1</version><scope>test</scope></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.9</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-orm</artifactId><version>${spring-version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring-version}</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>2.0.7</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.29</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.24</version></dependency><dependency><groupId>jstl</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>servlet-api</artifactId><version>2.5</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.6</version></dependency></dependencies><build><finalName>ssm2023</finalName></build>
</project>

4. spring + mybatis 整合

1)新建 mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><settings><!--日志配置--><setting name="logImpl" value="STDOUT_LOGGING"/></settings><typeAliases><package name="com.wdzl.pojo"/></typeAliases></configuration>

连接数据库--映射文件---DAO接口---POJO实体类

2)新建实体类
package com.wdzl.pojo;import lombok.Data;import java.util.Date;@Data
public class Book {private Integer bookId;private String bookName;private float price;private String author;private Date pubDate;private Date modDate;private Date addDate;
}
3)Dao 接口
package com.wdzl.dao;import com.wdzl.pojo.Book;import java.util.List;public interface IBookDao {List<Book> queryAll();void save(Book book);
}
4)mapper映射
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wdzl.dao.IBookDao"><select id="queryAll" resultType="book">select bookid,bookname,price,author,pubDate,addDate,modDate from book</select><insert id="save" parameterType="book">insert into book(bookid,bookname,price,author,pubDate,addDate,modDate)values(#{bookName},#{price},#{author},#{pubDate},#{addDate},#{modDate})</insert>
</mapper>
5)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"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:component-scan base-package="com.wdzl"/><context:property-placeholder location="classpath:db.properties"/><!--spring+mybatis整合请求 > Dispatcher > Controller > Service > Dao > SessionFactory > DataSource > MySQL--><!--DataSource--><bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/><property name="driverClassName" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/></bean><!--SessionFactory--><bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource"/><property name="mapperLocations" value="classpath:mapper/*.xml"/><property name="configLocation" value="classpath:mybatis-config.xml"/></bean><!--Mybatis 接口扫描--><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"><property name="basePackage" value="com.wdzl.dao"/>
<!--        <property name="sqlSessionFactoryBeanName" value="sessionFactory"/>--></bean></beans>
6)新建业务并注解

新建接口

package com.wdzl.service;import com.wdzl.pojo.Book;import java.util.List;public interface IBookService {List<Book> queryAll();void save(Book book);
}

新建实现类

package com.wdzl.service;import com.wdzl.dao.IBookDao;
import com.wdzl.pojo.Book;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class BookServiceImpl implements IBookService{@Autowiredprivate IBookDao bookDao;@Overridepublic List<Book> queryAll() {return bookDao.queryAll();}@Overridepublic void save(Book book) {bookDao.save(book);}
}
7)单元测试

测试 Spring 和 mybatis 是否整合成功

  • 添加 junit 和 Spring-Test 依赖
  • 新建 test 测试目录
  • 编写测试用例
    • 在src 目录下新建 test 目录

添加 junit 4 依赖 :

<dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13</version><scope>test</scope>
</dependency>

添加 spring-test 依赖

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

编写测试用例

新建 test 目录

新建 测试用例类

  • 使用注解
  • 依赖注入
import com.wdzl.service.IBookService;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.junit.jupiter.SpringJUnitConfig;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;@SpringJUnitConfig(locations = "classpath:spring-dao.xml")
@RunWith(SpringJUnit4ClassRunner.class)
public class SSMTest {@Autowiredprivate IBookService bookService;@Testpublic void testSsm(){bookService.queryAll().forEach(System.out::println);}}

5. SpringMVC+Spring

  • web.xml
  • springmvc.xml
  • 编写控制器
    • 依赖业务
1)配置 web.xml
<!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app><display-name>Archetype Created Web Application</display-name><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-mvc.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>
</web-app>
2)新建和配置 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: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/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"><mvc:annotation-driven/><!--视图解析器--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><property name="prefix" value="/WEB-INF/jsp"></property><property name="suffix" value=".jsp"></property></bean><!--静态资源-->
</beans>
3)新建控制器
package com.wdzl.controller;import com.wdzl.pojo.Book;
import com.wdzl.service.IBookService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;import java.util.List;@Controller
public class BookController {@Autowiredprivate IBookService bookService;@RequestMapping("list")public String queryAll(ModelMap modelMap){List<Book> books = bookService.queryAll();modelMap.put("list",books);return "list";}
}
4)新建 list.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" isELIgnored="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<html>
<head><title>Title</title>
</head>
<body>
<c:forEach items="${list}" var="book">${book}
</c:forEach>
</body>
</html>
5) 部署 和 运行

注意:访问 list 时,爆出404 异常

原因: web 项目 元数据文件为 web.xml (程序入口)

发现通过web.xml 不能关联所有的其他 spring-dao.xml和其他映射文件等

解决办法:

  • 新建 spring文件 命名 spring-ssm.xml
  • 在此文件中 导入其他的文件:spring-dao.xml 和 spring-mvc.xml
  • 再修改 web.xml :导入加载的文件为:spring-ssm.xml

新建 spring-ssm.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"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"><import resource="classpath:spring-dao.xml"/><import resource="classpath:spring-mvc.xml"/>
</beans>

修改 web.xml

<init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-ssm.xml</param-value>
</init-param>

完整web.xml:

<!DOCTYPE web-app PUBLIC"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN""http://java.sun.com/dtd/web-app_2_3.dtd" ><web-app><display-name>Archetype Created Web Application</display-name><servlet><servlet-name>springmvc</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>classpath:spring-ssm.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>
</web-app>

打开浏览器,通过控制器的 RequestMapping("list") 映射的 list 请求访问即可。 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

leetcode 347.前K个高频元素

题目 思路 1.统计每个数出现的次数&#xff1a;可以用HashMap。key为num,value为这个数出现的次数。 2.怎样返回HashMap中value最大的前k个key呢&#xff1f; 这里用优先队列的方法&#xff08;本质是堆&#xff09; 我们要维护一个小根堆。我们在堆中存储&#xff08;key,…

APP信息收集思路总结(反代理,反虚拟机,反证书校验思路整理)

前言 本文是我在学习过程中的总结&#xff0c;希望可以被指导提议指正。 APP概况 app跟一个网站很像。 网站分为前端后端。 app就好像网站的前端一样&#xff0c;app不需要浏览器&#xff0c;而前端需要浏览器。 他们都需要服务器&#xff0c;也就是说&#xff0c;进行we…

实现登录拦截功能

1.4、实现登录拦截功能 温馨小贴士&#xff1a;tomcat的运行原理 当用户发起请求时&#xff0c;会访问我们像tomcat注册的端口&#xff0c;任何程序想要运行&#xff0c;都需要有一个线程对当前端口号进行监听&#xff0c;tomcat也不例外&#xff0c;当监听线程知道用户想要和…

kafka部署之简单密钥

一、说明 centos7.9kafka_2.13-2.7.0.tgzapache-zookeeper-3.8.0-bin.tar.gz官方文档&#xff1a;Apache Kafka 二、kafka配置 2.1、server.properties server.properties修改或增加如下配置 listenersSASL_PLAINTEXT://你的主机ip:9092 super.usersUser:admin authorizer…

#Linux(make工具和makefile文件以及makefile语法)

&#xff08;一&#xff09;发行版&#xff1a;Ubuntu16.04.7 &#xff08;二&#xff09;记录&#xff1a; &#xff08;1&#xff09;make为编译辅助工具&#xff0c;解决用命令编译工程非常繁琐的问题 &#xff08;2&#xff09;在终端键入make即可调用make工具&#xff0…

huawei 华为 交换机 配置 LACP 模式的链路聚合示例 (交换机之间直连)

组网需求 如 图 3-22 所示&#xff0c; SwitchA 和 SwitchB 通过以太链路分别都连接 VLAN10 和 VLAN20 的网络&#xff0c;且SwitchA 和 SwitchB 之间有较大的数据流量。用户希望 SwitchA 和 SwitchB 之间能够提供较大的链路带宽来使相同VLAN 间互相通信。在两台 Switch 设备上…

Ubuntu 22.04上构建libvirt源码错误解决

当在Ubuntu 22.04上构建libvirt源码时&#xff0c;可能会遇到一些错误。下面是一些常见错误及其解决方法&#xff1a; 1. 错误&#xff1a;Program xmllint’未找到或不可执行 解决方法&#xff1a;安装libxml2-utils sudo apt-get install libxml2-utils2. 错误&#xff1a…

攻防演练利器:六款蓝队开源防御工具特点剖析

实战化的攻防演习活动一般具有时间短、任务急等特点&#xff0c;作为防守方&#xff0c;蓝队需要在日常安全运维工作的基础上&#xff0c;从攻击者角度出发&#xff0c;了解攻击者的思路与打法&#xff0c;并结合本单位实际网络环境、运营管理情况&#xff0c;制定相应的技术防…

性能测试丨GreatSQL TPC-H 性能测试报告正式发布!

1、测试背景概述 本次测试针对GreatSQL开源数据库基于标准 TPC-H 场景的测试。 TPC-H&#xff08;商业智能计算测试&#xff09;是美国交易处理效能委员会&#xff08;TPC&#xff0c;TransactionProcessing Performance Council&#xff09;组织制定的用来模拟决策支持类应用…

抽取CLOB字段中XML的特定元素的VALUE值

在ORACLE数据库中&#xff0c;有时XML文件会被保存在CLOB字段中。 这时候&#xff0c;若是我们要获取此字段XML中特定元素的VALUE值&#xff0c;就需要用到xmltype 这个函数。 如下面的 XML文件&#xff0c;保存在 TABLE_A 的CLOB_K 字段&#xff0c;若是我们要获取其中的 Y…

C语言从入门到精通(第5版)-----读书笔记

第一章 C语言概述 1.1 C语言的发展史 1.1.1程序语言简述 1、机器语言 低级语言&#xff0c;又称二进制代码语言。一种使用0、1表示的二进制代码编写指令以执行计算机操作的语言。 特点&#xff1a;计算机可以直接识别&#xff0c;不需要进行任何翻译。 2、汇编语言 为了减…

selection instruction

在LLVM的代码生成框架中,确实存在三种类型的指令表达,它们会在同一个SelectionDAG(选择有向无环图)中共存。这些类型分别是: 一般LLVM ISD节点: 这些是LLVM提供的通用、平台无关的节点,用于表示各种常见的算术、逻辑、内存和控制流操作。例如,ISD::ADD表示一个加法操作…

RDMA内核态通信测试krping学习

krping模块是一个内核可加载模块&#xff0c;它实现了客户机/服务器ping/pong程序&#xff0c;这个模块仅仅为了测试内核rdma的API&#xff08;单边的READ和Write&#xff1b;双边的SEND和RECEIVE&#xff09;。该模块允许通过一个名为/proc/krping的/proc条目建立连接并运行pi…

ElasticSearch8 - 基本操作

前言 本文记录 ES 的一些基本操作&#xff0c;就是对官方文档的一些整理&#xff0c;按自己的习惯重新排版&#xff0c;凑合着看。官方的更详细&#xff0c;建议看官方的。 下文以 books 为索引名举例。 新增 添加单个文档 (没有索引会自动创建) POST books/_doc {"n…

服务器总是宕机问题记录

博主介绍&#xff1a; 22届计科专业毕业&#xff0c;来自湖南&#xff0c;主要是在CSDN记录一些自己在Java开发过程中遇到的一些问题&#xff0c;欢迎大家一起讨论学习&#xff0c;也欢迎大家的批评指正。 文章目录 背景调整总结 背景 2核2G的服务器&#xff0c;服务器安装了t…

Redis Cluster集群模式容器化部署

Redis Cluster集群模式容器化部署 安装Docker和docker-compose准备docker-compose文件准备Redis配置文件Linux内核参数优化启停Redis实例Redis集群搭建 环境准备&#xff1a; IP版本角色端口172.x.x.11RHEL 7.9master6379172.x.x.12RHEL 7.9master6379172.x.x.13RHEL 7.9maste…

清华镜像介绍

清华镜像&#xff0c;全称为清华大学开源软件镜像站&#xff0c;是由清华大学计算机系维护的一套开源软件镜像站点。该站点不仅为编程人员提供了一个丰富的资源平台&#xff0c;也为科研人员和需要进行软件开发或运维工作的人员提供了极大的便利。 首先&#xff0c;清华镜像的…

计算机网络:物理层中的数字传输系统全景概览解析

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

Rust 双向链表 LinkedList 和安全删除元素的方法

一、LinkedList 基本用法 在Rust中&#xff0c;LinkedList 是标准库中 std::collections 模块提供的一个双向链表实现。这个双向链表在每个节点中都保存了其前一个和后一个节点的引用&#xff0c;允许在链表的任一端进行有效的添加和移除操作。 以下是一个简单的示例&#xf…

Django之Celery篇(三)

一、任务交给Celery Django任务交给Celery的方法和普通使用Celery任务的调用基本无区别,只是将执行代码的放到到View视图中 而获取结果,往往并不能把结果和第1次请求一起响应,若想获取结果是通过第2次请求获取结果 代码如下: from django.http import HttpResponsefrom …