整合SSM——(SpringMVC+Spring+Mybatis)

  

目录

SSM整合 

创建项目

导入依赖

配置文件

SpringConfig

MyBatisConfig

JdbcConfig

ServletConfig

SpringMvcConfig

功能模块

测试

业务层接口测试

控制层测试


    SSM是Java Web开发中常用的三个主流框架组合的缩写,分别对应SpringSpring MVCMyBatis。这三个框架协同工作,能够完成企业级应用开发中的业务逻辑、Web层交互及数据持久化任务。

  1. Spring:作为SSM的基础框架,主要负责依赖注入(DI)和面向切面编程(AOP)。它简化了Java程序对数据库的访问,提高了数据库的访问效率和稳定性。
  2. Spring MVC:实际上是Spring框架的扩展,属于Spring框架的一部分。它主要负责Web层的交互,使得开发Web应用变得更加简单和高效。
  3. MyBatis:是一个支持普通SQL查询、存储过程和高级映射的持久层框架。它消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索,使得开发者可以更加专注于业务逻辑的实现。

SSM整合 

创建项目

    首先新建一个项目,详情请见:SpringMVC概述以及入门案例-CSDN博客,新建项目后再main下方新建test目录用作测试:

     

导入依赖

 ssm整合需要导入一些依赖包,具体如下:

  • spring-webmvc
  • spring-jdbc
  • spring-contest
  • mybatis
  • mybatis-spring
  • mysql-connector-java
  • druid
  • junit
  • javax.servlet-api
  • jackson-databind
<dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.3.20</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.3.18</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.3.20</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.6</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.3.1</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.8</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.12.5</version></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency></dependencies>

配置文件

    接下来在java包下面新建软件包config,用于存放各种配置来,分别是:SpringConfig、MyBatisConfig、JdbcConfig、ServletConfig、SpringMvcConfig。以及resources目录下的db.properities。

SpringConfig

    该配置类的作用是:作为Spring配置文件,扫描指定的包,并且导入加载其他需要的配置文件:

@Configuration
@ComponentScan({"com.cc.service"})
@PropertySource(("db.properties"))  //加载外部属性文件
@Import({JdbcConfig.class, MyBatisConfig.class})  //导入其他配置类
public class SpringConfig {
}
MyBatisConfig

MyBatis的XML方式:

@Configuration
public class MyBatisXmlConfig {@Beanpublic SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) throws Exception {SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();factoryBean.setDataSource(dataSource);// 关键配置:显式指定XML映射文件位置factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));return factoryBean;}@Beanpublic MapperScannerConfigurer mapperScannerConfigurer() {MapperScannerConfigurer msc = new MapperScannerConfigurer();msc.setBasePackage("com.cc.dao");// 关键配置:要求接口与XML文件关联(默认行为)msc.setSqlSessionFactoryBeanName("sqlSessionFactory");return msc;}
}

 

注解配置方式:

@Configuration
public class MyBatisAnnotationConfig {@Beanpublic SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource) {SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();factoryBean.setDataSource(dataSource);return factoryBean;}@Beanpublic MapperScannerConfigurer mapperScannerConfigurer() {MapperScannerConfigurer msc = new MapperScannerConfigurer();msc.setBasePackage("com.cc.dao");// 关键配置:启用注解扫描模式msc.setAnnotationClass(Mapper.class);msc.setSqlSessionFactoryBeanName("sqlSessionFactory");return msc;}
}
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;import javax.sql.DataSource;public class MyBatisConfig {//配置了一个MyBatis的SqlSessionFactory,指定了使用的数据源和类型别名包路径。@Beanpublic SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();factoryBean.setDataSource(dataSource);factoryBean.setTypeAliasesPackage("com.cc.domain");return factoryBean;}//通过Spring配置了一个MapperScannerConfigurer,指定了需要扫描的Mapper接口所在的包路径。//这样,MyBatis就可以根据这些配置自动地找到并注册Mapper接口@Beanpublic MapperScannerConfigurer mapperScannerConfigurer(){MapperScannerConfigurer msc = new MapperScannerConfigurer();msc.setBasePackage("com.cc.dao");return msc;}
}

使用注解方式的关键代码是setAnnotationClass(Mapper.class),但是只要在Mapper接口的方法上使用了@Select等注解,即时未配置也会隐式支持注解

JdbcConfig

配置数据源,并且交给spring容器管理。

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;import javax.sql.DataSource;public class JdbcConfig {//注入值@Value("${jdbc.driver}")private String driver;@Value("${jdbc.url}")private String url;@Value("${jdbc.username}")private String username;@Value("${jdbc.password}")private String password;@Beanpublic DataSource dataSource(){DruidDataSource dataSource = new DruidDataSource();dataSource.setDriverClassName(driver);dataSource.setUrl(url);dataSource.setUsername(username);dataSource.setPassword(password);return dataSource;}
}
ServletConfig
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;import javax.servlet.Filter;public class ServletConfig extends AbstractAnnotationConfigDispatcherServletInitializer{@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class[]{SpringConfig.class};}@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class[]{SpringMvcConfig.class};}@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}@Overrideprotected Filter[] getServletFilters() {CharacterEncodingFilter filter = new CharacterEncodingFilter();filter.setEncoding("UTF-8");return new Filter[]{filter};}
}
SpringMvcConfig
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;@Configuration
@ComponentScan("com.cc.controller")
@EnableWebMvc
public class SpringMvcConfig {
}

功能模块

首先依据准备的表结构创建对应的POJO类:

public class User {private int id;private String name;private int age;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "User{" +"id=" + id +", name='" + name + '\'' +", age=" + age +'}';}
}

接下来就是关于数据库操作的Dao:

public interface UserDao {@Insert("insert into user(name,age) values(#{name},#{age})")public void save(User user);@Update("update user set name=#{name} where id = #{id}")public void update(User user);@Delete("delete from user where id =#{id}")public void delete(Integer id);@Select("select * from user where id =#{id}")public User getById(Integer id);@Select("select * from user")public List<User> getAll();
}

以及Dao对应的Service接口和实现类

public interface UserService {/*** 保存* @param user* @return*/public boolean save(User user);/*** 修改* @param user* @return*/public boolean update(User user);/**\* 根据id删除* @param id* @return*/public boolean delete(Integer id);/*** 根据id查询* @param id* @return*/public User getById(Integer id);/*** 查询所有* @return*/public List<User> getAll();
}
@Service
public class UserServiceImpl implements UserService {@Autowiredprivate UserDao userDao;@Overridepublic boolean save(User user) {userDao.save(user);return true;}@Overridepublic boolean update(User user) {userDao.update(user);return true;}@Overridepublic boolean delete(Integer id) {userDao.delete(id);return true;}@Overridepublic User getById(Integer id) {return userDao.getById(id);}@Overridepublic List<User> getAll() {return userDao.getAll();}
}

剩下就是REST风格的Controller控制类:

@RestController
@RequestMapping("/users")
public class UserController {@Autowiredprivate UserService userService;@PostMappingpublic boolean save(@RequestBody User user) {return userService.save(user);}@PutMappingpublic boolean update(@RequestBody User user) {return userService.update(user);}@DeleteMapping("/{id}")public boolean delete(@PathVariable Integer id) {return userService.delete(id);}@GetMapping("/{id}")public User getById(@PathVariable Integer id) {return userService.getById(id);}@GetMappingpublic List<User> getAll() {return userService.getAll();}
}

测试

   在开发中通常要进行两种测试,分别是业务接口测试,第二个是表现层的接口测试。

业务层接口测试

在test目录下新建测试包:

@RunWith(SpringJUnit4ClassRunner.class)  //使用Spring的测试运行器来运行测试。
@ContextConfiguration(classes = SpringConfig.class)
public class UserServiceTest {@Autowiredprivate UserService userService;@Testpublic void testGetById(){User user = userService.getById(2);System.out.println(user);}@Testpublic void testGetAll(){List<User> user = userService.getAll();System.out.println(user);}}

能够查询到数据,说明业务层没问题,接下来测试控制层,启动Tomcat:

控制层测试

在postman进行测试:

查询所有:

 

 新增:

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

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

相关文章

P1042【深基8,例1】乒乓球

【题目背景】国际乒联现在主席沙拉拉自从上任以来就立志于推行一系列改革&#xff0c;以推动乒乓球运动在全球的普及。其中 11 分制改革引起了很大的争议&#xff0c;有一部分球员因为无法适应新规则只能选择退役。华华就是其中一位&#xff0c;他退役之后走上了乒乓球研究工作…

ubuntu24.04上使用qemu和buildroot模拟vexpress-ca9开发板构建嵌入式arm linux环境

1 准备工作 1.1 安装qemu 在ubuntu系统中使用以下命令安装qemu。 sudo apt install qemu-system-arm 安装完毕后&#xff0c;在终端输入: qemu- 后按TAB键&#xff0c;弹出下列命令证明安装成功。 1.2 安装arm交叉编译工具链 sudo apt install gcc-arm-linux-gnueabihf 安装之…

用 R 语言打造交互式叙事地图:讲述黄河源区生态变化的故事

目录 🌟 项目背景:黄河源头的生态变迁 🧰 技术栈介绍 🗺️ 最终效果预览 💻 项目构建步骤 1️⃣ 数据准备 2️⃣ 构建 Leaflet 地图 3️⃣ 使用 scrollama 实现滚动触发事件 4️⃣ 使用 R Markdown / Quarto 打包发布 🎬 效果展示截图 📦 完整代码仓库 …

CTF--秋名山车神

一、原网页&#xff1a; 二、步骤&#xff1a; 1.尝试用计算器计算&#xff1a; 计算器溢出&#xff0c;无法正常计算 2.使用python计算&#xff1a; 得出计算结果为&#xff1a;1864710043732437134701060769 3.多次刷新页面&#xff1a; 发现变量为value&#xff0c;要用pos…

CRC实战宝典:从原理到代码,全面攻克循环冗余校验

CRC实战宝典&#xff1a;从原理到代码&#xff0c;全面攻克循环冗余校验 github开源&#xff1a;CRC软硬件协同测试项目 CRC 简介 CRC&#xff08;循环冗余校验&#xff09;是一种强大的错误检测技术&#xff0c;广泛应用于数字网络和存储系统。它是确保数据完整性的重要方法…

【大模型】DeepSeek + Coze 打造个人专属AI智能体使用详解

目录 一、前言 二、AI智能体介绍 2.1 什么是AI智能体 2.2 AI智能体核心能力 2.3 AI智能应用场景 三、coze 介绍 3.1 coze是什么 3.1.1 平台概述 3.1.2 平台适用人群 3.2 平台核心功能 3.3 coze可以做什么 3.4 为什么选择coze 四、coze 搭建AI智能体操作实践 4.1 搭…

MySQL入门:数据表的创建

​今天我们来介绍一下除HTML外的另一种语言&#xff1a;MySQL语言&#xff1b; MySQL&#xff1a;即一种用于管理和处理关系数据库的标准语言。要用于执行查询、更新、管理数据库中的数据以及定义和操作数据库结构。 接下来我会逐一介绍它的作用以及其中数据表&#xff0c;数据…

[图论]生成树 引言

生成树 引言 生成树&#xff1a;一个连通图的生成树是该图的一个极小连通子图。生成树中含有图中全部(设 V V V个)顶点及构成一棵树的 V − 1 V-1 V−1条边&#xff0c;且生成树中不应有环。最小生成树(MST)&#xff1a;图的所有生成树中&#xff0c;边权之和最小的生成树。显…

AI调试工具有哪些?

一、深度学习框架专用调试工具 TensorBoard • 功能&#xff1a;实时监控训练指标&#xff08;损失值、准确率&#xff09;、可视化神经网络结构、分析参数分布和梯度信息 • 适用框架&#xff1a;TensorFlow、PyTorch&#xff08;通过插件&#xff09; • 特点&#xff1a;支持…

深入理解 MCP 协议:开启 AI 交互新时代

深入理解 MCP 协议&#xff1a;开启 AI 交互新时代&#x1f680; 在当今人工智能蓬勃发展的时代&#x1f310;&#xff0c;大型语言模型&#xff08;LLM&#xff09;已经在众多领域展现出了强大的能力&#xff0c;令人惊叹&#x1f44f;&#xff01;然而&#xff0c;传统的 LLM…

微信、抖音、小红书emoji符号大全

1、Emoji 日常符号 &#x1f463;&#x1f440;&#x1f441;️&#x1f444;&#x1f48b;&#x1f442;&#x1f9bb;&#x1f443;&#x1f445;&#x1f9e0;&#x1fac0;&#x1fac1;&#x1f9b7;&#x1f9b4;&#x1f4aa;&#x1f9be;&#x1f9bf;&#x1f9b5;&a…

【嵌入式】——Linux系统远程操作和程序编译

目录 一、虚拟机配置网络设置 二、使用PuTTY登录新建的账户 1、在ubuntu下开启ssh服务 2、使用PuTTY连接 三、树莓派实现远程登录 四、树莓派使用VNC viewer登录 五、Linux使用talk聊天程序 1、使用linux自带的talk命令 2、使用c语言编写一个talk程序 一、虚拟机配置网络…

春和景明-C语言简单代码

题目要求&#xff1a; 请在centOS Linux中编写一个C语言程序实现如下功能&#xff1a; 同时创建100个用户&#xff0c;用户的账户名称为&#xff1a;Student01 Student02 … Student100;设置每个用户的初始密码为&#xff1a;stud123456请用gcc编译C的源代码&#xff0c;生…

设计模式之工厂模式(factory pattern):在商品对象创建系统中的应用

目录 一、设计思路 1. 简单工厂模式 2. 工厂方法模式 3. 抽象工厂模式 二、UML类图&#xff08;PlantUML格式&#xff09; 1.简单工厂模式 2.工厂方法模式 3.抽象工厂模式 三、实现过程与结果 1. 简单工厂模式 2. 工厂方法模式 3. 抽象工厂模式 四、总结 在面向对…

Trae,字节跳动推出的 AI 编程助手插件

Trae 插件是 Trae 旗下全新一代的人工智能编程助手&#xff08;前身为 MarsCode 编程助手&#xff09;&#xff0c;以插件形式集成在本地开发环境中&#xff0c;具备极高的兼容性和灵活性&#xff0c;旨在提升开发效率和代码质量。它支持超过100种编程语言&#xff0c;兼容主流…

工作纪实_63-Mac电脑使用brew安装软件

最近在接触kafka&#xff0c;想着在自己的电脑安装一套环境&#xff0c;docker也能行&#xff0c;但是还是想装一些原生的软件试试看&#xff0c;因此便想着整理一下brew的命令&#xff0c;这命令确实是方便&#xff0c;不需要下载tar包乱八七糟的东西&#xff0c;一键安装 bre…

Python语法系列博客 · 第8期[特殊字符] Lambda函数与高阶函数:函数式编程初体验

上一期小练习解答&#xff08;第7期回顾&#xff09; ✅ 练习1&#xff1a;找出1~100中能被3或5整除的数 result [x for x in range(1, 101) if x % 3 0 or x % 5 0]✅ 练习2&#xff1a;生成字符串长度字典 words ["apple", "banana", "grape…

Redis--主从复制

目录 一、配置 1.1 建立复制 1.2 断开复制 1.3 安全性 1.4 只读 1.5 传输延迟 二、拓扑 2.1 一主一从结构 2.2 一主多从结构 2.3 树形主从结构 在分布式系统中为了解决单点问题&#xff0c;通常会把数据复制多个副本部署到其他服务器&#xff0c;满足故障恢 复和负载均衡等需求…

已注册商标如何防止被不使用撤销!

近年来已注册商标被撤销越来越多&#xff0c;不乏著名企业或机构&#xff0c;普推知产商标老杨看到前一阵看到央视和百度等申请的商标也被申请撤销&#xff0c;连续三年不使用撤销也是正常的商标流程。 已注册商标被撤销普推老杨看到案例主要是集中在一些早期申请注册的好记的商…

解密大模型背后的秘密:训练、优化与挑战

解密大模型背后的秘密&#xff1a;训练、优化与挑战 在当今的人工智能领域&#xff0c;大模型&#xff08;Large Language Models, LLMs&#xff09;已经成为了一个不可忽视的存在。从自然语言处理到图像生成&#xff0c;再到推荐系统&#xff0c;大模型以其强大的泛化能力和创…