当前位置: 首页 > news >正文

基于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]语义分割_转置卷积

转置卷积&#xff08;Transposed Convolution&#xff09; 抽丝剥茧&#xff0c;带你理解转置卷积&#xff08;反卷积&#xff09; 目录 一、概念 1、定义 2、运算步骤 二、常见参数 一、概念 1、定义 转置卷积&#xff08;Transposed Convolution&#xff09;&#xf…...

面板小程序命令行工具介绍

Ray 体系提供配套的工程化解决方案。 由于多端构建的一些客观原因&#xff0c;在构建流程的设计上&#xff0c;必须将工程套件安装在项目内。 项目内的依赖至少包含以下内容&#xff1a; {"dependencies": {"ray-js/ray": "latest"},"de…...

DBA技术栈MongoDB: 数据增改删除

该博文主要介绍mongoDB对文档数据的增加、更新、删除操作。 1.插入数据 以下案例演示了插入单个文档、多个文档、指定_id、指定多个索引以及插入大量文档的情况。在实际使用中&#xff0c;根据需求选择适合的插入方式。 案例1&#xff1a;插入单个文档 db.visitor.insert({…...

Xcode查看APP文件目录

一、连接真机到MAC电脑上 二、打开Devices 点击window -> Devices and Simulatores 三、选中设备、选择app 四、选择下载内容 五、查看文件内容 得到的文件 右键显示包内容&#xff0c;获得APP内数据 六、分发证书无法下载 使用分发的证书无法下载文件内容&#xf…...

【视频媒体】深入了解直播视频流

深入了解直播视频流&#x1f3a5; YouTube、TikTok live和Twitch上的直播视频是如何工作的&#xff1f; 直播视频流与常规流媒体不同&#xff0c;因为视频内容通过互联网近乎实时发送&#xff0c;通常只有几秒钟的延迟。 下图解释了实现这一目标背后所发生的事情。 步骤1&…...

【01】mapbox js api加载arcgis切片服务

需求&#xff1a; 第三方的mapbox js api加载arcgis切片服务&#xff0c;同时叠加在天地图上&#xff0c;天地图坐标系web墨卡托。 效果图&#xff1a; 形如这种地址去加载http://zjq2022.gis.com:8080/demo/loadmapboxtdt.html 思路&#xff1a; 需要制作一个和天地图比例…...

图像分割实战-系列教程15:deeplabV3+ VOC分割实战3-------网络结构1

&#x1f341;&#x1f341;&#x1f341;图像分割实战-系列教程 总目录 有任何问题欢迎在下面留言 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 deeplab系列算法概述 deeplabV3 VOC分割实战1 deeplabV3 VOC分割实战2 deeplabV3 VOC分割实战3 dee…...

【Docker】安装nacos以及实现负载均衡

&#x1f973;&#x1f973;Welcome 的Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Docker的相关操作吧 目录 &#x1f973;&#x1f973;Welcome 的Huihuis Code World ! !&#x1f973;&#x1f973; 前言 一.nacos单个部署 1.镜像拉取 …...

如何用数据赋能社媒营销决策?

在数字化时代&#xff0c;越来越多的商家开始意识到数据分析对于改善经营的重要性。 传统决策更多依赖过往经验、商业直觉、他人的思路模板等方法&#xff0c;或者依靠描述性统计、简单的数据分析。在数字时代&#xff0c;则通过精细化数据分析&#xff0c;做出更明智的营销决策…...

初识k8s(概述、原理、安装)

文章目录 概述由来主要功能 K8S架构架构图组件说明ClusterMasterNodekubectl 组件处理流程 K8S概念组成PodPod控制器ReplicationController&#xff08;副本控制器&#xff09;ReplicaSet &#xff08;副本集&#xff09;DeploymentStatefulSet &#xff08;有状态副本集&#…...

【Java】Maven的基本使用

Maven的基本使用 Maven常用命令 complie&#xff1a;编译clean&#xff1a;清理test&#xff1a;测试package&#xff1a;打包install&#xff1a;安装 mvn complie mvn clean mvn test mvn package mvn installMaven生命周期 IDEA配置Maven Maven坐标 什么是坐标&#xff1f;…...

【RT-DETR有效改进】遥感旋转网络 | LSKNet动态的空间感受野网络(轻量又提点)

前言 大家好&#xff0c;我是Snu77&#xff0c;这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进&#xff0c;内容持续更新&#xff0c;每周更新文章数量3-10篇。 专栏以ResNet18、ResNet50为基础修改版本&#xff0c;同时修改内容也支持Re…...

【进阶之路】如何提升 Java 编程内力?

如何提升 Java 编程内力&#xff1f; 可能很多初学者在学完 SpringBoot 之后&#xff0c;做了 1-2 个项目之后&#xff0c;不知道该去学习什么了&#xff0c;其实这时候需要去学习的东西还有很多&#xff0c;接下来我会列举一下主要需要从哪些方面来对 Java 编程深入学习&#…...

Git一台电脑 配置多个账号

Git一台电脑 配置多个账号 Git一台电脑 配置多个账号 常用的Git版本管理有 gitee github gitlab codeup &#xff0c;每个都有独立账号&#xff0c;经常需要在一个电脑上向多个代码仓提交后者更新代码&#xff0c;本文以ssh 方式为例配置 1 对应账号 公私钥生成 建议&#…...

2024年华为OD机试真题-素数之积-Java-OD统一考试(C卷)

题目描述: RSA加密算法在网络安全世界中无处不在,它利用了极大整数因数分解的困难度,数据越大,安全系数越高,给定一个32位正整数,请对其进行因数分解,找出是哪两个素数的乘积。 输入描述: 一个正整数num 0 < num <= 2147483647 输出描述: 如果成功找到,以单个空…...

汤姆·齐格弗里德《纳什均衡与博弈论》笔记(2)

第三章 纳什均衡——博弈论的基础 冯诺伊曼没有解决的问题 博弈论在其建立初始也显现出了严重的局限性。冯诺伊曼解决了二人零和博弈&#xff0c;但对多人博弈问题仍无法解决。如果只是鲁宾逊克鲁索和星期五玩游戏&#xff0c;博弈论可以很好地被应用&#xff0c;但它无法精确…...

QT上位机开发(动态数据采集与监控)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 上位机开发中,有一种类型的应用软件很特殊,它几乎没有什么交互操作,主要的工作就是检测和显示。如果说在此基础上有什么扩展的话,可能就是安全监控和报警。所以,这个上位机软件…...

vue2 -- 截图工具html2canvas

文章目录 🍉需求描述🍉基础功能实现🍉下载另存为本地图片功能🍉需求描述 可以将网页中的指定元素或整个页面截取为图片,以便保存或分享。 🍉基础功能实现 在 Vue 中使用 html2canvas 实现 1:安装 html2canvas 库。你可以使用 npm 安装,命令如下: npm install …...

笔记-孙子兵法-第三篇-谋攻(1)-不战而屈人之兵,上兵伐谋,韩信之死

笔记-From 《华杉讲透孙子兵法》和《兵以诈立&#xff0c;我读孙子》 第三篇-谋攻&#xff08;1&#xff09;不战而屈人之兵 《孙子兵法》第一篇讲计&#xff0c;第二篇讲野战&#xff0c;第三篇就讲攻城。 《孙子》尚谋&#xff0c;认为最好是“不战而屈人之兵”&#xff0…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

在Ubuntu中设置开机自动运行(sudo)指令的指南

在Ubuntu系统中&#xff0c;有时需要在系统启动时自动执行某些命令&#xff0c;特别是需要 sudo权限的指令。为了实现这一功能&#xff0c;可以使用多种方法&#xff0c;包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法&#xff0c;并提供…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版&#xff01;&#xff01;&#xff01;6.8截至答题&#xff0c;大家注意呀&#xff01; 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:&#xff08; B &#xff09; A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

c#开发AI模型对话

AI模型 前面已经介绍了一般AI模型本地部署&#xff0c;直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型&#xff0c;但是目前国内可能使用不多&#xff0c;至少实践例子很少看见。开发训练模型就不介绍了&am…...

Spring AI与Spring Modulith核心技术解析

Spring AI核心架构解析 Spring AI&#xff08;https://spring.io/projects/spring-ai&#xff09;作为Spring生态中的AI集成框架&#xff0c;其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似&#xff0c;但特别为多语…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

《C++ 模板》

目录 函数模板 类模板 非类型模板参数 模板特化 函数模板特化 类模板的特化 模板&#xff0c;就像一个模具&#xff0c;里面可以将不同类型的材料做成一个形状&#xff0c;其分为函数模板和类模板。 函数模板 函数模板可以简化函数重载的代码。格式&#xff1a;templa…...