基于SpringBoot的SSM整合案例
项目目录:

数据库表以及表结构
user表结构

user_info表结构



引入依赖
父模块依赖:
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.12.RELEASE</version></parent>
<properties>中的版本管理
<!--mybatis版本--><mybatis.spring.version>2.2.2</mybatis.spring.version><!--Druid版本--><druid.version>1.2.11</druid.version><!--mysql版本--><mysql.version>5.1.38</mysql.version>
<dependences>依赖:
<!--应用程序的web起步依赖,包含了构建web应用程序所需的基本组件和依赖--><!--使用该依赖可以快速启动一个基于SpringMVC的应用程序--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!--添加测试依赖,该依赖用于在SpringBoot应用程序中进行单元测试和继承测试--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>${mybatis.spring.version}</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>${druid.version}</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>${mysql.version}</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency>
添加配置文件
application.xml
spring:profiles:active: dev
server:port: 8088servlet:context-path: /ssm
mybatis:config-location: classpath:mybatis/mybatis-config.xmlmapper-locations: classpath:mybatis/**/*Mapper.xml
application-dev.xml
# 数据源配置
spring:datasource:type: com.alibaba.druid.pool.DruidDataSourcedriverClassName: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/ssm?useUnicode=true&characterEncoding=utf-8&useSSL=falseusername: rootpassword: rootdruid:# 初始连接数initialSize: 5# 最小连接池数量minIdle: 10# 最大连接池数量maxActive: 20# 配置获取连接等待超时的时间maxWait: 60000# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒timeBetweenEvictionRunsMillis: 60000# 配置一个连接在池中最小生存的时间,单位是毫秒minEvictableIdleTimeMillis: 300000# 配置一个连接在池中最大生存的时间,单位是毫秒maxEvictableIdleTimeMillis: 900000# 配置检测连接是否有效validationQuery: SELECT 1 FROM DUALtestWhileIdle: truetestOnBorrow: falsetestOnReturn: falsewebStatFilter:enabled: truestatViewServlet:enabled: true# 设置白名单,不填则允许所有访问allow:# 指定访问druid监控页面的请求映射路径# 开发中一般通过:服务器映射路径/druid/index,来访问监控页面url-pattern: /druid/*# 监控默认是可以直接访问的# 如果有以下配置,那么访问监控页面时会跳转到,控制台管理页面进行登录控制# 控制台管理用户名和密码login-username: druidlogin-password: druidfilter:stat:enabled: true# 慢SQL记录(控制慢查询sql语句显示为红色提醒)log-slow-sql: trueslow-sql-millis: 1000merge-sql: truewall:config:multi-statement-allow: true
全局配置文件mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><settings><setting name="logImpl" value="STDOUT_LOGGING"/></settings>
</configuration>
MybatisConfig配置类(用于扫描mapper接口包)
@Configuration
@MapperScan("com.yaorange.mapper")
public class MyBatisConfig {
}
公共类包
返回结果以及常量
public interface CommonConstant {/*** {@code 500 Server Error} (HTTP/1.0 - RFC 1945)*/Integer SC_INTERNAL_SERVER_ERROR_500 = 500;/*** {@code 200 OK} (HTTP/1.0 - RFC 1945)*/Integer SC_OK_200 = 2000;String ERROR_MSG = "操作失败";String OK_MSG = "操作成功";String LOGIN_ERROR_MSG = "用户名或密码错误";
}
@Data
public class PageInfo<T> {/*** 当前页*/private int pageNum;/*** 每页的数量*/private int pageSize;/*** 总记录数*/protected long total;/*** 结果集*/protected List<T> list;/*** 总页数*/private int pages;
}
数据层
entity实体类
@Data
public class User implements Serializable {/*** 用户Id*/private Integer userId;/*** 用户名*/private String userName;/*** 用户状态*/private Integer userState;/*** 用户详情id*/private UserInfo userInfo;private static final long serialVersionUID = 1L;
}
@Data
public class UserInfo implements Serializable {/*** 用户详情id*/private Integer infoId;/*** 家庭住址*/private String address;private static final long serialVersionUID = 1L;
}
mapper接口
public interface UserMapper {/**查询用户列表*/List<User> selectList();/**查询总记录数*/int countTotal();/**分页查询数据*/List<User> selectPage(@Param("start") int start,@Param("pageSize") Integer pageSize);/**通过Id查询用户信息*/User selectUserById(Integer userId);/**添加用户信息*/int insert(User user);/**批量删除用户*/int deleteUsers(Integer[] ids);
}
mapper.xml
<?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.yaorange.mapper.UserMapper"><resultMap id="BaseResultMap" type="com.yaorange.entity.User"><id property="userId" column="user_id" jdbcType="INTEGER"/><result property="userName" column="user_name" jdbcType="VARCHAR"/><result property="userState" column="user_state" jdbcType="VARCHAR"/></resultMap><resultMap id="User_UserInfo" type="com.yaorange.entity.User" extends="BaseResultMap"><association property="userInfo" javaType="com.yaorange.entity.UserInfo"><id property="infoId" column="user_info_id" jdbcType="INTEGER"/><result property="address" column="address" jdbcType="VARCHAR"/></association></resultMap><sql id="Base_Column_List">user_id,user_name,user_state,user_info_id</sql><insert id="insert" parameterType="com.yaorange.entity.User">INSERT INTO `ssm`.`user`( `user_name`, `user_state`, `user_info_id`)VALUES ( #{userName}, #{userState}, #{userInfo.infoId});</insert><delete id="deleteUsers">update user set user.user_state=1<where>user_id in<foreach collection="array" separator="," open="(" close=")" item="e">#{e}</foreach></where></delete><select id="selectList" resultMap="User_UserInfo">SELECTu.user_id,u.user_name,u.user_state,u.user_info_id,i.addressFROMuser AS u left joinuser_info AS ion u.user_info_id=i.info_idwhere u.user_state=0</select><select id="countTotal" resultType="java.lang.Integer">select Count(*) from user where user_state=0</select><select id="selectPage" resultMap="User_UserInfo">SELECTu.user_id,u.user_name,u.user_state,u.user_info_id,i.addressFROMuser AS u left joinuser_info AS ion u.user_info_id=i.info_idwhere u.user_state=0limit #{start},#{pageSize}</select><select id="selectUserById" resultMap="User_UserInfo">SELECTu.user_id,u.user_name,u.user_state,u.user_info_id,i.addressFROMuser AS u left joinuser_info AS ion u.user_info_id=i.info_idwhere u.user_state=0and u.user_id=#{userId}</select></mapper>
业务层
业务层接口
public interface UserService {/**查询用户列表数据*/List<User> selectList();/**分页查询用户数据*/PageInfo<User> page(Integer pageNum, Integer pageSize);User selectUserById(Integer userId);int insertUser(User user);int deleteUsers(Integer[] ids);
}
业务层实现类
@Service
@Transactional(rollbackFor = Exception.class)
public class UserServiceImpl implements UserService {@Autowiredprivate UserMapper userMapper;@Overridepublic List<User> selectList() {return userMapper.selectList();}@Overridepublic PageInfo<User> page(Integer pageNum, Integer pageSize) {//查询总条数int total=userMapper.countTotal();//总页数int pages=total%pageSize==0?total/pageSize:total/pageSize+1;//起始页int start=(pageNum-1)*pageSize;List<User> userList=userMapper.selectPage(start,pageSize);PageInfo<User> userPageInfo = new PageInfo<>();userPageInfo.setPageNum(pageNum);userPageInfo.setPageSize(pageSize);userPageInfo.setTotal(total);userPageInfo.setList(userList);userPageInfo.setPages(pages);return userPageInfo;}@Overridepublic User selectUserById(Integer userId) {return userMapper.selectUserById(userId);}@Overridepublic int insertUser(User user) {return userMapper.insert(user);}@Overridepublic int deleteUsers(Integer[] ids) {return userMapper.deleteUsers(ids);}}
控制层
@Controller
@ResponseBody
@RequestMapping("/user")
public class UserController {@Autowiredprivate UserService userService;@RequestMapping(value="/list",method = RequestMethod.GET)public Result<?> list(){List<User> userList =userService.selectList();return Result.ok(userList);}@RequestMapping(value = "/page",method = RequestMethod.GET)public Result<?> page(@RequestParam(defaultValue = "1") Integer pageNum,@RequestParam(defaultValue = "3") Integer pageSize){PageInfo<User> userPageInfo=userService.page(pageNum,pageSize);return Result.ok(userPageInfo);}@RequestMapping(method = RequestMethod.GET)public Result<?> selectUserById(@RequestParam Integer userId){User user=userService.selectUserById(userId);return Result.ok(user);}@RequestMapping(value="/add",method = RequestMethod.POST)public Result<?> addUser(@RequestBody User user){int row=userService.insertUser(user);if(row>0){return Result.ok(CommonConstant.OK_MSG);}return Result.error(CommonConstant.ERROR_MSG);}@RequestMapping(value="/batchDelete",method=RequestMethod.POST)public Result<?> deleteUsers(@RequestBody Integer ids[]){int rows=userService.deleteUsers(ids);if(rows>0){return Result.ok(CommonConstant.OK_MSG);}return Result.error(CommonConstant.ERROR_MSG);}
}
数据层测试代码
@RunWith(SpringRunner.class)
@SpringBootTest
public class UserServiceImplTest {@Autowiredprivate UserService userService;@Testpublic void selectList() {List<User> users = userService.selectList();users.stream().forEach(System.out::println);}@Testpublic void page() {PageInfo<User> pageList = userService.page(1, 10);System.out.println(pageList);}@Testpublic void selectUserById() {User user = userService.selectUserById(2);System.out.println(user);}@Testpublic void insertUser() {User user = new User();user.setUserName("陈六");user.setUserState(1);UserInfo userInfo = new UserInfo();userInfo.setInfoId(2);user.setUserInfo(userInfo);int i = userService.insertUser(user);System.out.println(i);}@Testpublic void deleteUsers() {Integer[] ids={1,5};int i = userService.deleteUsers(ids);System.out.println(i);}
}
Postman测试结果
批量删除

查询用户列表

根据id查用户

添加用户

相关文章:
基于SpringBoot的SSM整合案例
项目目录: 数据库表以及表结构 user表结构 user_info表结构 引入依赖 父模块依赖: <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.12.RELEASE</version>…...
[SS]语义分割_转置卷积
转置卷积(Transposed Convolution) 抽丝剥茧,带你理解转置卷积(反卷积) 目录 一、概念 1、定义 2、运算步骤 二、常见参数 一、概念 1、定义 转置卷积(Transposed Convolution)…...
面板小程序命令行工具介绍
Ray 体系提供配套的工程化解决方案。 由于多端构建的一些客观原因,在构建流程的设计上,必须将工程套件安装在项目内。 项目内的依赖至少包含以下内容: {"dependencies": {"ray-js/ray": "latest"},"de…...
DBA技术栈MongoDB: 数据增改删除
该博文主要介绍mongoDB对文档数据的增加、更新、删除操作。 1.插入数据 以下案例演示了插入单个文档、多个文档、指定_id、指定多个索引以及插入大量文档的情况。在实际使用中,根据需求选择适合的插入方式。 案例1:插入单个文档 db.visitor.insert({…...
Xcode查看APP文件目录
一、连接真机到MAC电脑上 二、打开Devices 点击window -> Devices and Simulatores 三、选中设备、选择app 四、选择下载内容 五、查看文件内容 得到的文件 右键显示包内容,获得APP内数据 六、分发证书无法下载 使用分发的证书无法下载文件内容…...
【视频媒体】深入了解直播视频流
深入了解直播视频流🎥 YouTube、TikTok live和Twitch上的直播视频是如何工作的? 直播视频流与常规流媒体不同,因为视频内容通过互联网近乎实时发送,通常只有几秒钟的延迟。 下图解释了实现这一目标背后所发生的事情。 步骤1&…...
【01】mapbox js api加载arcgis切片服务
需求: 第三方的mapbox js api加载arcgis切片服务,同时叠加在天地图上,天地图坐标系web墨卡托。 效果图: 形如这种地址去加载http://zjq2022.gis.com:8080/demo/loadmapboxtdt.html 思路: 需要制作一个和天地图比例…...
图像分割实战-系列教程15:deeplabV3+ VOC分割实战3-------网络结构1
🍁🍁🍁图像分割实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 deeplab系列算法概述 deeplabV3 VOC分割实战1 deeplabV3 VOC分割实战2 deeplabV3 VOC分割实战3 dee…...
【Docker】安装nacos以及实现负载均衡
🥳🥳Welcome 的Huihuis Code World ! !🥳🥳 接下来看看由辉辉所写的关于Docker的相关操作吧 目录 🥳🥳Welcome 的Huihuis Code World ! !🥳🥳 前言 一.nacos单个部署 1.镜像拉取 …...
如何用数据赋能社媒营销决策?
在数字化时代,越来越多的商家开始意识到数据分析对于改善经营的重要性。 传统决策更多依赖过往经验、商业直觉、他人的思路模板等方法,或者依靠描述性统计、简单的数据分析。在数字时代,则通过精细化数据分析,做出更明智的营销决策…...
初识k8s(概述、原理、安装)
文章目录 概述由来主要功能 K8S架构架构图组件说明ClusterMasterNodekubectl 组件处理流程 K8S概念组成PodPod控制器ReplicationController(副本控制器)ReplicaSet (副本集)DeploymentStatefulSet (有状态副本集&#…...
【Java】Maven的基本使用
Maven的基本使用 Maven常用命令 complie:编译clean:清理test:测试package:打包install:安装 mvn complie mvn clean mvn test mvn package mvn installMaven生命周期 IDEA配置Maven Maven坐标 什么是坐标?…...
【RT-DETR有效改进】遥感旋转网络 | LSKNet动态的空间感受野网络(轻量又提点)
前言 大家好,我是Snu77,这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进,内容持续更新,每周更新文章数量3-10篇。 专栏以ResNet18、ResNet50为基础修改版本,同时修改内容也支持Re…...
【进阶之路】如何提升 Java 编程内力?
如何提升 Java 编程内力? 可能很多初学者在学完 SpringBoot 之后,做了 1-2 个项目之后,不知道该去学习什么了,其实这时候需要去学习的东西还有很多,接下来我会列举一下主要需要从哪些方面来对 Java 编程深入学习&#…...
Git一台电脑 配置多个账号
Git一台电脑 配置多个账号 Git一台电脑 配置多个账号 常用的Git版本管理有 gitee github gitlab codeup ,每个都有独立账号,经常需要在一个电脑上向多个代码仓提交后者更新代码,本文以ssh 方式为例配置 1 对应账号 公私钥生成 建议&#…...
2024年华为OD机试真题-素数之积-Java-OD统一考试(C卷)
题目描述: RSA加密算法在网络安全世界中无处不在,它利用了极大整数因数分解的困难度,数据越大,安全系数越高,给定一个32位正整数,请对其进行因数分解,找出是哪两个素数的乘积。 输入描述: 一个正整数num 0 < num <= 2147483647 输出描述: 如果成功找到,以单个空…...
汤姆·齐格弗里德《纳什均衡与博弈论》笔记(2)
第三章 纳什均衡——博弈论的基础 冯诺伊曼没有解决的问题 博弈论在其建立初始也显现出了严重的局限性。冯诺伊曼解决了二人零和博弈,但对多人博弈问题仍无法解决。如果只是鲁宾逊克鲁索和星期五玩游戏,博弈论可以很好地被应用,但它无法精确…...
QT上位机开发(动态数据采集与监控)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 上位机开发中,有一种类型的应用软件很特殊,它几乎没有什么交互操作,主要的工作就是检测和显示。如果说在此基础上有什么扩展的话,可能就是安全监控和报警。所以,这个上位机软件…...
vue2 -- 截图工具html2canvas
文章目录 🍉需求描述🍉基础功能实现🍉下载另存为本地图片功能🍉需求描述 可以将网页中的指定元素或整个页面截取为图片,以便保存或分享。 🍉基础功能实现 在 Vue 中使用 html2canvas 实现 1:安装 html2canvas 库。你可以使用 npm 安装,命令如下: npm install …...
笔记-孙子兵法-第三篇-谋攻(1)-不战而屈人之兵,上兵伐谋,韩信之死
笔记-From 《华杉讲透孙子兵法》和《兵以诈立,我读孙子》 第三篇-谋攻(1)不战而屈人之兵 《孙子兵法》第一篇讲计,第二篇讲野战,第三篇就讲攻城。 《孙子》尚谋,认为最好是“不战而屈人之兵”࿰…...
.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...
Qt Widget类解析与代码注释
#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui; }//解释这串代码,写上注释 当然可以!这段代码是 Qt …...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
消息队列系统设计与实践全解析
文章目录 🚀 消息队列系统设计与实践全解析🔍 一、消息队列选型1.1 业务场景匹配矩阵1.2 吞吐量/延迟/可靠性权衡💡 权衡决策框架 1.3 运维复杂度评估🔧 运维成本降低策略 🏗️ 二、典型架构设计2.1 分布式事务最终一致…...
工厂方法模式和抽象工厂方法模式的battle
1.案例直接上手 在这个案例里面,我们会实现这个普通的工厂方法,并且对比这个普通工厂方法和我们直接创建对象的差别在哪里,为什么需要一个工厂: 下面的这个是我们的这个案例里面涉及到的接口和对应的实现类: 两个发…...
第22节 Node.js JXcore 打包
Node.js是一个开放源代码、跨平台的、用于服务器端和网络应用的运行环境。 JXcore是一个支持多线程的 Node.js 发行版本,基本不需要对你现有的代码做任何改动就可以直接线程安全地以多线程运行。 本文主要介绍JXcore的打包功能。 JXcore 安装 下载JXcore安装包&a…...
构建Docker镜像的Dockerfile文件详解
文章目录 前言Dockerfile 案例docker build1. 基本构建2. 指定 Dockerfile 路径3. 设置构建时变量4. 不使用缓存5. 删除中间容器6. 拉取最新基础镜像7. 静默输出完整示例 docker runDockerFile 入门syntax指定构造器FROM基础镜像RUN命令注释COPY复制ENV设置环境变量EXPOSE暴露端…...
基于django+vue的健身房管理系统-vue
开发语言:Python框架:djangoPython版本:python3.8数据库:mysql 5.7数据库工具:Navicat12开发软件:PyCharm 系统展示 会员信息管理 员工信息管理 会员卡类型管理 健身项目管理 会员卡管理 摘要 健身房管理…...
结合PDE反应扩散方程与物理信息神经网络(PINN)进行稀疏数据预测的技术方案
以下是一个结合PDE反应扩散方程与物理信息神经网络(PINN)进行稀疏数据预测的技术方案,包含完整数学推导、PyTorch/TensorFlow双框架实现代码及对比实验分析。 基于PINN的反应扩散方程稀疏数据预测与大规模数据泛化能力研究 1. 问题定义与数学模型 1.1 反应扩散方程 考虑标…...
