SSM(Spring-Mybatis-SpringMVC)
文章目录
- 1. 介绍
- 1.1 概念介绍
- 2 SSM整合框架
- 3. SSM功能模块开发
- 4 测试
- 4.1 业务层接口测试
- 4.2 表现层接口测试
- 5.优化 -表现层数据封装
- 6.异常处理
1. 介绍
1.1 概念介绍
SSM项目是指
基于Spring+SpringMVC+MyBatis框架搭建的Java Web项目。
- Spring是负责
管理和组织项目的IOC容器和AOP功能- SpringMVC是一个轻量级的
MVC框架,用于处理Web请求和响应- MyBatis是一种
持久化框架,用于进行数据库操作的ORM框架。
学习笔记:
Spring:https://blog.csdn.net/meini32/article/details/132474555
SpringMVC:https://blog.csdn.net/meini32/article/details/132545058
Mybatis:https://blog.csdn.net/meini32/article/details/132068955
Mybatis商品增删改查案例:https://blog.csdn.net/meini32/article/details/132095237
2 SSM整合框架
关键内容
Spring
- SpringConfig
SpringMVC
- SpringMvcConfig
- ServletConfig
Mybatis
- MyBatisConfig
- JdbcConfig
- jdbc.properties
MyBatis
jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/db1
jdbc.username=root
jdbc.password=123456
package com.it.config;import javax.sql.DataSource;
import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;//jdbcConfigpublic 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 druidDataSource = new DruidDataSource();druidDataSource.setDriverClassName(driver);druidDataSource.setUrl(url);druidDataSource.setUsername(username);druidDataSource.setPassword(password);return druidDataSource;}
}
-----------------------------------------------------
package com.it.config;import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.context.annotation.Bean;
import javax.sql.DataSource;//MyBatisConfig
public class MybatisConfig {//创建和管理数据库会话@Beanpublic SqlSessionFactoryBean sqlSessionFactory(DataSource dataSource){SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();factoryBean.setDataSource(dataSource);factoryBean.setTypeAliasesPackage("com.it.domain");return factoryBean;}@Bean//创建并配置MapperScannerConfigurer对象public MapperScannerConfigurer mapperScannerConfigurer(){MapperScannerConfigurer mapperScannerConfigurer = new MapperScannerConfigurer();mapperScannerConfigurer.setBasePackage("com.it.dao");return mapperScannerConfigurer;}
}
web容器配置类
SpringMVC
- SpringMvcConfig
- ServletConfig
//ServletConfig
@Configuration
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[]{"/"};}
}----------------------------------------------------------------------
//SpringMvcConfig
@Configuration
@ComponentScan("com.it.controller")
@EnableWebMvc
public class SpringMvcConfig {
}
Spring
- SpringConfig
//整合Spring应用程序,实现对组件和属性的管理和使用
@Configuration
@ComponentScan({"com.it.service"})
@PropertySource("jdbc.properties")
@Import({jdbcConfig.class, MybatisConfig.class})
public class SpringConfig {
}
3. SSM功能模块开发
内容
- 表与实体类;
- dao(接口+自动代理)
- service(接口+实现类)
- controller

添加相关依赖
<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.example</groupId><artifactId>spring-ssm</artifactId><packaging>war</packaging><version>1.0-SNAPSHOT</version><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>5.2.9.RELEASE</version></dependency><dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.9.0</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.5</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.3.0</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.32</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.3.13</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-test</artifactId><version>5.3.13</version></dependency><!-- 数据库连接池依赖--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.2.6</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.28</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency></dependencies><build><plugins><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.2</version><configuration><port>81</port><path></path></configuration></plugin></plugins></build>
</project>
import lombok.Data;@Data
public class User {private int id;private String username;private String password;
}------------------------------------------------------------------------
package com.it.dao;import com.it.domain.User;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;import java.util.List;//用户增删改查接口
public interface UserDao {@Insert("INSERT INTO tb_user values (null,#{name},#{password}}})")public void save(User user);@Update("UPDATE tb_user set name=#{id},password=#{password} where id=#{id}}")public void update(User user);@Delete("DELETE from tb_user where id = #{id}}")public void delete(Integer id);@Select("SELECT * FROM tb_user")public List<User> selectAll();@Select("SELECT * FROM tb_user WHERE id=#{id}")public User selectById(Integer id);}----------------------------------------------------------------------
package com.it.service;import com.it.domain.User;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.annotations.Update;import java.util.List;public interface UserService {/*** 保存* @param user* @return*/public boolean save(User user);/*** 修改* @param user* @return*/public boolean update(User user);/*** 删除* @param id* @return*/public boolean delete(Integer id);/*** 查全部* @return*/public List<User> selectAll();/*** 按id查找* @param id* @return*/public User selectById(Integer id);
}---------------------------------------------------------------------------
package com.it.service.impl;import com.it.dao.UserDao;
import com.it.domain.User;
import com.it.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class UserServiceImpl implements UserService {@Autowired //自动装配private UserDao userDao;public boolean save(User user) {userDao.save(user);return true;}public boolean update(User user) {userDao.update(user);return true;}public boolean delete(Integer id) {userDao.delete(id);return true;}public List<User> selectAll() {return userDao.selectAll();}public User selectById(Integer id) {return userDao.selectById(id);}
}------------------------------------------------------------------------
package com.it.controller;import com.it.domain.User;
import com.it.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import java.util.List;@RestController
@RequestMapping("/user")
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) {System.out.println(userService.delete(id));return userService.delete(id);}@GetMappingpublic List<User> selectAll() {System.out.println(userService.selectAll());return userService.selectAll();}@GetMapping("/{id}")public User selectById(@PathVariable Integer id) {return userService.selectById(id);}
}
4 测试
4.1 业务层接口测试

4.2 表现层接口测试



5.优化 -表现层数据封装
- 前端接受数据格式封装到code属性用于区分操作
- 将特殊消息封装到message(msg)属性中
public class Result{private Object data;private Integer code;private String msg;
}
package com.it.controller;public class Code {//成功public static final Integer SAVE_OK = 20011;public static final Integer DELETE_OK = 20021;public static final Integer UPDATE_OK = 20031;public static final Integer GET_OK = 20041;public static final Integer PUT_OK = 20051;//失败public static final Integer SAVE_ERR = 20010;public static final Integer DELETE_ERR = 20020;public static final Integer UPDATE_ERR = 20030;public static final Integer GET_ERR = 20040;public static final Integer PUT_ERR = 20050;
}
----------------------------------------------------------------------------
package com.it.controller;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@Datapublic class Result {private Object data;private Integer code;private String msg;public Result(Integer code, String msg) {this.code = code;this.msg = msg;}public Result(Object data, Integer code) {this.data = data;this.code = code;}public Result(Object data, Integer code, String msg) {this.data = data;this.code = code;this.msg = msg;}
}
---------------------------------------------------------------------------
import java.util.List;@RestController
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;@PostMappingpublic Result save(@RequestBody User user) {boolean save = userService.save(user);return new Result(save,save?Code.SAVE_OK:Code.SAVE_ERR);}

6.异常处理
出现异常位置及原因
- 框架内部抛出异常:不合规使用
- 数据层抛出异常:外边服务器故障(超时访问)
- 业务层抛出异常:业务逻辑书写错误(遍历业务书写操作等)
- 表现层抛出异常:数据收集、校验等规则导致
- 工具类抛出异常:工具书写不严谨不健壮
项目异常分类
- 业务异常
- 原因:用户行为导致
- 解决:发送相应的信息传递给用户,提醒规范操作。
- 系统异常
- 原因:项目运行时可预计但无法避免的异常
- 解决:发送固定消息安抚用户;发送消息给处理人员;记录日志;
- 其他异常
- 原因:未预期的异常
- 解决:同上
解决:集中统一处理项目中出现的异常(异常处理器)
@RestControllerAdvice
作用:为Rest风格开发的控制器类做增强
.
@ExceptionHandler
作用:位于方法上方,设置指定异常处理方案,出现异常后终止原始控制器,转入当前方法执行。
package com.it.controller;import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestController;@RestController
public class ProjectExceptionAdvice {@ExceptionHandler(Exception.class)public Result doException(Exception e){System.out.println("出现异常");return new Result(500,"出错");}
}
步骤
- 自定义项目系统级异常
- 自定义业务级异常;
- 自定义异常编码;
- 触发自定义异常(模拟异常操作);
- 拦截异常并处理异常;
- 测试结果
package com.it.controller;import lombok.Data;//自定义项目级异常
@Data
public class SystemException extends RuntimeException{private Integer code;public SystemException(String message, Throwable cause, Integer code) {super(message);this.code = code;}}
package com.it.controller;import lombok.Data;//自定义项目业务级异常
@Data
public class BusinessException extends RuntimeException{private Integer code;public BusinessException(String message, Integer code) {super(message);this.code = code;}public BusinessException(String message, Throwable cause, Integer code) {super(message,cause);this.code = code;}
}
//异常编码public static final Integer SYSTEM_UNKNOW_ERROR = 50001;public static final Integer SYSTEM_TIMEOUT_ERROR = 50002;public static final Integer PROJECT_VALIDATE_ERROR = 60001;public static final Integer PROJECT_BUSINESS_ERROR = 60002;
package com.it.service.impl;import com.it.controller.BusinessException;
import com.it.controller.Code;
import com.it.dao.UserDao;
import com.it.domain.User;
import com.it.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.util.List;@Service
public class UserServiceImpl implements UserService {@Autowired //自动装配private UserDao userDao;//自定义异常public User selectById(Integer id) {if(id<0){throw new BusinessException("请输入正确的id",Code.PROJECT_BUSINESS_ERROR);}return userDao.selectById(id);}
}
package com.it.controller;import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.RestControllerAdvice;//拦截并处理异常
@RestControllerAdvice
public class ProjectExceptionAdvice {@ExceptionHandler(Exception.class)public Result doException(Exception e){System.out.println("出现异常");return new Result(500,"出错");}@ExceptionHandler(BusinessException.class)public Result doBussinessException(Exception e){System.out.println("出现业务异常");return new Result(501,null,"出错");}@ExceptionHandler(SystemException.class)public Result doSystemException(Exception e){System.out.println("出现系统异常");return new Result(500,"出错");}
}
测试结果


相关文章:
SSM(Spring-Mybatis-SpringMVC)
文章目录 1. 介绍1.1 概念介绍 2 SSM整合框架3. SSM功能模块开发4 测试4.1 业务层接口测试4.2 表现层接口测试 5.优化 -表现层数据封装6.异常处理 1. 介绍 1.1 概念介绍 SSM项目是指基于SpringSpringMVCMyBatis框架搭建的Java Web项目。 Spring是负责管理和组织项目的IOC容器和…...
MySQL——数据的删除以及MySQL中的约束
删除数据 删除表中的一行数据,也必须加上 WHERE条件,否则整列的数据都会被删除。删除语句: delete from 表名 where 条件; 他会将所有的符合条件的数据删除,如果不写条件,则表中的数据全部删除: 如果不添…...
静态路由 网络实验
静态路由 网络实验 拓扑图初步配置R1 ip 配置R2 ip 配置R3 ip 配置查看当前的路由表信息查看路由表信息配置静态路由测试 拓扑图 需求:实现 ip 192.168.1.1 到 192.168.2.1 的通信。 初步配置 R1 ip 配置 system-view sysname R1 undo info-center enable # 忽略…...
数据结构-01 数据结构基本概念,算法时间复杂度,空间复杂度
0 数据结构概述 四门课的关系 1 绪论 数据对象、数据元素、数据项关系 1.1 数据结构的基本概念 1.2 算法和算法评价 小练习 空间复杂度中的递归调用 n只是传入 n也是数组,计算存储数组flag的空间大小...
【Redis】Bitmap 使用及应用场景
前言:bitmap 占用空间小,查询效率高,在一些场景中使用 bitmap 是一个很好的选择。 一、bitmap 相关命令 SETBIT - 设置指定位置的比特值,可以设为 1 或 0 例如 SETBIT key 10 1,将在 key 对应的 bitmap 中第10位设置为…...
C#,数值计算——用于积分函数与方法的Stiel类的计算方法与源程序
1 文本格式 using System; namespace Legalsoft.Truffer { public class Stiel { public class pp : UniVarRealValueFun, RealValueFun { public Stiel st { get; set; } null; public pp() { } public doubl…...
报错:为什么数组明明有内容但打印的length是0
文章目录 一、问题二、分析三、解决1.将异步改为同步2.设置延迟 一、问题 在日常开发中,for 循环遍历调用接口,并将接口返回的值进行拼接,即push到一个新的数组中,但是在for循环内部是可以拿到这个新的数组,而for循环…...
go gin gorm连接postgres postgis输出geojson
go gin gorm连接postgres postgis输出geojson 1. 技术环境 go-gin-gorm postgres-postgis go vscode环境安装-智能提示配置 2. 简单实现代码 思路就是:采用原生sql实现查询、更新等,采用gorm的raw来执行sql语句 package mainimport ("fmt"&q…...
4. Java 的线程安全机制之`volatile`
前言:在多线程编程过程中,线程安全是一个非常重要的概念,它有助于保证多线程程序的正确性和健壮性。其中,volatile是实现线程安全的一种方式,保证内存的立马可见,下面将会详细介绍。 文章目录 是什么为什么…...
Vue + Element UI前端篇(二):Vue + Element 案例
Vue Element UI 实现权限管理系统 前端篇(二):Vue Element 案例 导入项目 打开 Visual Studio Code,File --> add Folder to Workspace,导入我们的项目。 安装 Element 安装依赖 Element 是国内饿了么公司提…...
Qt5中connect信号槽无效问题 C++
在写QT的组件信号槽时遇到一个问题,我的QspinBox组件用connect连接函数总是无效,解决办法是: 在QT5中推荐使用如下形式连接槽函数: QObject::connect(ui->spinBox,QOverload<int>::of(&QSpinBox::valueChanged),th…...
服务端 TCP 连接的 TIME_WAIT 过多问题的分析与解决
https://blog.csdn.net/zxlyx/article/details/120397006 本文给出一个 TIME_WAIT 状态的 TCP 连接过多的问题的解决思路,非常典型,大家可以好好看看,以后遇到这个问题就不会束手无策了。 问题描述 模拟高并发的场景,会出现批量…...
【Unity3D赛车游戏优化篇】【十】汽车粒子特效和引擎咆哮打造极速漂移
👨💻个人主页:元宇宙-秩沅 👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨💻 本文由 秩沅 原创 👨💻 收录于专栏:Uni…...
肖sir__设计测试用例方法之编写测试用例12
编写测试用例 一、用例模板 案例1: 案例2: 案例3: 二、测试工作重点: 编写测试用例、 执行用例 (依据测试用例) 三、测试流程(h模型) 1、拿到需求 2、编写测试计划(…...
Android 11.0 ota升级之Systemui下拉状态栏quick_settings_tiles_default值减少时更新的功能实现
1.前言 在11.0的系统rom定制化开发中,在定制功能需求中,在进行systemui的下拉状态栏定制以后,当需要ota升级的时候,发现在systemui下拉状态栏的快捷功能键部分去掉的 一些快捷功能并没有减少,这是因为systemui有缓存造成的只有清理缓存或者恢复出厂设置后才正常,所以今天…...
Android Studio中创建java项目
1.创建普通的android工程 2.创建一个module 3.module类型选择java library 4.填写libary和class的名字 5.生成的工程如图所示 6.然后点击Run --- Edit Configurations... 选择Application选项 设置所需要的参数 选中myjavalib后点击OK。然后打开刚创建的lib的gradle 编辑gradl…...
冠达管理:“旺季”来临,煤炭板块走高,云煤能源、陕西黑猫涨停
煤炭板块1日盘中发力走高,截至发稿,云煤动力、陕西黑猫涨停,兖矿动力涨超7%,晋控煤业、华阳股份涨超6%,山西焦煤、平煤股份涨超5%。 组织表明,动力大通胀背景下,未来3-5年煤炭供需偏紧的格局仍…...
【EI检索】第四届公共卫生与数据科学国际学术研讨会(ICPHDS 2023)
第四届公共卫生与数据科学国际学术研讨会(ICPHDS 2023) 2023 4th International Conference on Public Health and Data Science(ICPHDS 2023) 第四届公共卫生与数据科学国际学术研讨会(ICPHDS 2023)将于…...
对时序数据进行分类与聚类
我在最近的工作中遇到了一个问题,问题是我需要根据银行账户在一定时间内的使用信息对该账户在未来的一段时间是否会被销户进行预测。这是一个双元值的分类问题,只有两种可能,即会被销户和不会被销户。针对这个问题一般来说有两种解决策略。 …...
Win10如何找回图片查看器
近期有小伙伴反映在将Win10升级之后发现电脑自带的图片查看器没有了,这是怎么回事,该怎么找回呢,下面小编就给大家详细介绍一下Win10找回图片查看器的方法,有需要的小伙伴快来和小编一起阅读看看吧。 win10找回windows照片查看器…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命
在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...
相机从app启动流程
一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...
学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...
Device Mapper 机制
Device Mapper 机制详解 Device Mapper(简称 DM)是 Linux 内核中的一套通用块设备映射框架,为 LVM、加密磁盘、RAID 等提供底层支持。本文将详细介绍 Device Mapper 的原理、实现、内核配置、常用工具、操作测试流程,并配以详细的…...
2023赣州旅游投资集团
单选题 1.“不登高山,不知天之高也;不临深溪,不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...
C# 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
JavaScript基础-API 和 Web API
在学习JavaScript的过程中,理解API(应用程序接口)和Web API的概念及其应用是非常重要的。这些工具极大地扩展了JavaScript的功能,使得开发者能够创建出功能丰富、交互性强的Web应用程序。本文将深入探讨JavaScript中的API与Web AP…...
