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/761088.shtml

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

相关文章

Python使用指定端口进行http请求的例子

使用requests库 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 class SourcePortAdapter(HTTPAdapter): """"Transport adapter" that allows us to set the source port.""" def __init__(self, port, *args, **kwargs): self.poolm…

JetPack之LiveData粘性原因分析及hook解决

目录 前言一、LiveData粘性原因分析1.1 发送消息流程1.2 监听消息流程1.3 根因分析 二、hook解决 前言 在 Android 中&#xff0c;LiveData 的默认行为是粘性的&#xff0c;即 LiveData 在设置数据后&#xff0c;即使观察者订阅时已经有数据存在&#xff0c;观察者仍会立即收到…

node.js 常用命令

Node.js的常用命令包括多种类型&#xff0c;从运行JavaScript文件到管理Node.js的模块和包。以下是一些主要的Node.js常用命令&#xff1a; 运行JavaScript文件&#xff1a; node filename.js 这个命令会调用Node.js程序来运行指定的JavaScript文件。 查看文件和目录&#xf…

【链表】Leetcode 19. 删除链表的倒数第 N 个结点【中等】

删除链表的倒数第 N 个结点 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5] 解题思路 1、使用快慢指针找到要删除节点的前一个节点。2、删…

使用Jmeter进行http接口测试的实践

前言&#xff1a; 本文主要针对http接口进行测试&#xff0c;使用Jmeter工具实现。 Jmter工具设计之初是用于做性能测试的&#xff0c;它在实现对各种接口的调用方面已经做的比较成熟&#xff0c;因此&#xff0c;本次直接使用Jmeter工具来完成对Http接口的测试。 一、开发接口…

深入理解二叉树构建和中序遍历

在计算机科学中&#xff0c;二叉树是一种重要的数据结构&#xff0c;用于模拟层次化结构的关系。本文将介绍一个简单的C语言程序&#xff0c;该程序实现了对输入字符数组的解析&#xff0c;并构建相应的二叉树&#xff0c;随后对二叉树进行中序遍历。 二叉树定义 首先&#x…

Redis监控工具

Redis 是一种 NoSQL 数据库系统&#xff0c;以其速度、性能和灵活的数据结构而闻名。Redis 在许多领域都表现出色&#xff0c;包括缓存、会话管理、游戏、排行榜、实时分析、地理空间、叫车、聊天/消息、媒体流和发布/订阅应用程序。Redis 数据集完全存储在内存中&#xff0c;这…

揭秘爆红AI图像增强神器:Magnific AI如何做到1亿像素放大?

最近有个很火的AI图像增强应用&#xff0c;叫Magnific AI。 你知道吗&#xff0c;它发布一个多月就有40万人注册了&#xff01; 这个应用确实非常实用&#xff0c;它不仅利用AI技术放大了图像&#xff0c;还能提升分辨率&#xff0c;从而使图片呈现得更加清晰。 值得一提的是…

扩展以太网(数据链路层)

目录 一、在物理层扩展以太网 二、在数据链路层扩展以太网 三、以太网交换机的特点 四、以太网交换机的交换方式 五、以太网交换机的自学习功能 六、小结 一、在物理层扩展以太网 使用光纤扩展&#xff1a; • 主机使用光纤&#xff08;通常是一对光纤&#xff09;和…

跨境电商商品数据集爬取方案|跨境电商商品采集API接口

跨境电商数据集介绍 我们就以电商商品的数据集作为依托&#xff0c;从而来了解什么是数据集&#xff0c;可以通过什么方式来进行数据集的获取。 什么是数据集 电商商品数据集通常是指收集自电子商务平台的商品信息的结构化数据集合。这些数据包括但不限于商品名称、价格、描…

有关Theano和PyTensor库

根据Github里面的介绍&#xff0c;PyTensor是源于Theano&#xff0c; Theano目前应该已经不再开发了&#xff0c;更新都是很多年前。 因此PyTensor在背景介绍中说 PyTensor is a fork of Aesara, which is a fork of Theano. Theano和PyTensor都是计算相关的库&#xff0c;可以…

数据结构面试常见问题之- Sort with Swap(0,*)

&#x1f600;前言 在数据结构面试中&#xff0c;排序算法是考察重点之一。传统的排序算法&#xff0c;例如冒泡排序、快速排序等&#xff0c;都依赖于元素之间的比较和交换操作。然而&#xff0c;在某些情况下&#xff0c;我们可能只允许使用特定的交换操作&#xff0c;例如只…

【网络原理】详解HTTPS协议加密过程

文章目录 &#x1f334;HTTPS协议是什么&#xff1f;&#x1f384;运营商劫持事件&#x1f332;HTTPS的工作过程&#x1f338;对称加密&#x1f338;非对称加密&#x1f338;引入证书&#x1f338;完整流程 &#x1f333;HTTPS加密总结⭕总结 &#x1f334;HTTPS协议是什么&…

Kafka主题二三事

客户端如果订阅了多次主题&#xff0c;则以最后一次为主&#xff0c;例如 consumer.subscribe(Arrays.asList(topic1)); consumer.subscribe(Arrays.asList(topic2)); 则订阅的只有topic2。 消费者订阅主题是支持正则表达式&#xff0c;这样如果有新topic上线&#xff0c;并且匹…

Spring Cloud Alibaba微服务从入门到进阶(七)(服务容错-Sentinel)

雪崩效应 我们把基础服务故障&#xff0c;导致上层服务故障&#xff0c;并且这个故障不断放大的过程&#xff0c;成为雪崩效应。 雪崩效应&#xff0c;往往是因为服务没有做好容错造成的。 微服务常见容错方案 仓壁模式 比如让controller有自己独立的线程池&#xff0c;线程池满…

SQL语句每日一练二

1.给出 Customers 表 如下&#xff1a; cust_idcust_namecust_contactcust_citya1Andy LiAndy LiOak Parka2Ben LiuBen LiuOak Parka3Tony DaiTony DaiOak Parka4Tom ChenTom ChenOak Parka5An LiAn LiOak Parka6Lee ChenLee ChenOak Parka7Hex LiuHex LiuOak Park 【问题】编…

【快速幂、欧拉函数】蓝桥杯第十四届---互质数的个数

给定 a, b&#xff0c;求 1 ≤ x < a^b 中有多少个 x 与 a^b 互质。由于答案可能很大&#xff0c;你只需要输出答案对 998244353 取模的结果。 输入格式 输入一行包含两个整数分别表示 a, b&#xff0c;用一个空格分隔。 输出格式 输出一行包含一个整数表示答案。 样例…

Windows 设置多显示器显示

Windows 设置多显示器显示 1. Windows 7 设置 HDMI 输出2. Windows 11 设置多显示器显示References 1. Windows 7 设置 HDMI 输出 2. Windows 11 设置多显示器显示 ​​​ References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

畅谈AIGC,ISIG-AIGC技术与应用发展峰会成功举办

3月16日&#xff0c;第四届ISIG中国产业智能大会在上海中庚聚龙酒店如期开幕&#xff0c;此次大会由苏州市金融科技协会指导、企智未来科技&#xff08;RPA中国、LowCode低码时代、AIGC开放社区&#xff09;主办。大会聚集了来自不同领域的专家学者、行业领军人物及技术研发者&…