[SpringBoot]Spring MVC(6.0)----图书管理系统(初)
图书管理系统
需求:
1. 登录: 用户输入账号,密码完成登录功能.
2. 列表展示: 展示图书.
准备工作
将前端代码复制到 static 目录下.
约定前后端交互接口
两个功能: 用户登录 和 图书列表展示.
需求分析:
1. 用户登录
url : /user/login
param : userName 和 password
return : String(提示)
2. 图书列表展示url : /book/getBookList
param : 无
return : 图书列表
后端代码
创建图书类
import lombok.Data;import java.math.BigDecimal;@Data
public class BookInfo {private Integer id;private String bookName;private String author;private Integer num;private BigDecimal price;private String publishName;private Integer status;//对于可枚举的属性(以后可能会改的属性),通常用数字表示: 1-可借阅, 2-不可借阅private String statusCN;
}
创建UserController, 实现登录验证接口.
import jakarta.servlet.http.HttpSession;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RequestMapping("/user")
@RestController
public class UserController {@RequestMapping("/login")public String login(String userName, String password, HttpSession session) {//校验用户信息是否合法.if(!StringUtils.hasLength(userName) || !StringUtils.hasLength(password)) {return "用户名或密码为空";}//判断用户名和密码是否正确//理论上应该从数据库中获取, 但是目前还没学习 mybatis, 所以先这么写.if(!"admin".equals(userName) || !"admin".equals(password)) {return "用户名或密码错误";}session.setAttribute("userName",userName);return "";}
}
创建BookController, 获取图书列表
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;@RequestMapping("/book")
@RestController
public class BookController {@RequestMapping("/getBookList")public List<BookInfo> getBookList() {List<BookInfo> bookInfos = new ArrayList<>();//mock(模拟) 数据for (int i = 1; i <= 15; i++) {BookInfo bookInfo = new BookInfo();bookInfo.setId(i);bookInfo.setBookName("图书"+i);bookInfo.setAuthor("作者"+i);bookInfo.setNum(i*2+1);bookInfo.setPrice(new BigDecimal(i*3));bookInfo.setPublishName("出版社"+i);if(i % 5 == 0) {bookInfo.setStatus(2);bookInfo.setStatusCN("不可借阅");}else {bookInfo.setStatus(1);bookInfo.setStatusCN("可借阅");}bookInfos.add(bookInfo);}return bookInfos;}
}
前端页面代码
登录页面:login.html
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><link rel="stylesheet" href="css/bootstrap.min.css"><link rel="stylesheet" href="css/login.css"><script type="text/javascript" src="js/jquery.min.js"></script>
</head><body><div class="container-login"><div class="container-pic"><img src="pic/computer.png" width="350px"></div><div class="login-dialog"><h3>登陆</h3><div class="row"><span>用户名</span><input type="text" name="userName" id="userName" class="form-control"></div><div class="row"><span>密码</span><input type="password" name="password" id="password" class="form-control"></div><div class="row"><button type="button" class="btn btn-info btn-lg" onclick="login()">登录</button></div></div></div><script src="js/jquery.min.js"></script><script>function login() {$.ajax({url : "/user/login",type : "post",data : {userName : $("#userName").val(),password : $("#password").val(),},success:function(result) {if(result != "") {alert("用户名或密码错误,请重新输入");}else {location.href = "book_list.html";}}});}</script>
</body></html>
图书列表展示:book_list.html
<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>图书列表展示</title><link rel="stylesheet" href="css/bootstrap.min.css"><link rel="stylesheet" href="css/list.css"><script type="text/javascript" src="js/jquery.min.js"></script><script type="text/javascript" src="js/bootstrap.min.js"></script><script src="js/jq-paginator.js"></script></head><body><div class="bookContainer"><h2>图书列表展示</h2><div class="navbar-justify-between"><div><button class="btn btn-outline-info" type="button" onclick="location.href='book_add.html'">添加图书</button><button class="btn btn-outline-info" type="button" onclick="batchDelete()">批量删除</button></div></div><table><thead><tr><td>选择</td><td class="width100">图书ID</td><td>书名</td><td>作者</td><td>数量</td><td>定价</td><td>出版社</td><td>状态</td><td class="width200">操作</td></tr></thead><tbody></tbody></table><div class="demo"><ul id="pageContainer" class="pagination justify-content-center"></ul></div><script>getBookList();function getBookList() {$.ajax({url:"/book/getBookList",type:"get",success:function(books) {var finnalHtml = "";for(var book of books) {finnalHtml += '<tr>';finnalHtml += '<td><input type="checkbox" name="selectBook" value="1" id="selectBook" class="book-select"></td>';finnalHtml += '<td>'+book.id+'</td>';finnalHtml += '<td>'+book.bookName+'</td>';finnalHtml += '<td>'+book.author+'</td>';finnalHtml += '<td>'+book.num+'</td>';finnalHtml += '<td>'+book.price+'</td>';finnalHtml += '<td>'+book.publishName+'</td>';finnalHtml += '<td>'+book.statusCN+'</td>';finnalHtml += '<td>';finnalHtml += '<div class="op">';finnalHtml += '<a href="book_update.html?bookId='+book.id+'">修改</a>';finnalHtml += '<a href="javascript:void(0)" onclick="deleteBook('+book.id+')">删除</a>';finnalHtml += '</div>';finnalHtml += '</td>';finnalHtml += '</tr>';}$("tbody").html(finnalHtml);}});}//翻页信息$("#pageContainer").jqPaginator({totalCounts: 100, //总记录数pageSize: 10, //每页的个数visiblePages: 5, //可视页数currentPage: 1, //当前页码first: '<li class="page-item"><a class="page-link">首页</a></li>',prev: '<li class="page-item"><a class="page-link" href="javascript:void(0);">上一页<\/a><\/li>',next: '<li class="page-item"><a class="page-link" href="javascript:void(0);">下一页<\/a><\/li>',last: '<li class="page-item"><a class="page-link" href="javascript:void(0);">最后一页<\/a><\/li>',page: '<li class="page-item"><a class="page-link" href="javascript:void(0);">{{page}}<\/a><\/li>',//页面初始化和页码点击时都会执行onPageChange: function (page, type) {console.log("第"+page+"页, 类型:"+type);}});function deleteBook(id) {var isDelete = confirm("确认删除?");if (isDelete) {//删除图书alert("删除成功");}}function batchDelete() {var isDelete = confirm("确认批量删除?");if (isDelete) {//获取复选框的idvar ids = [];$("input:checkbox[name='selectBook']:checked").each(function () {ids.push($(this).val());});console.log(ids);alert("批量删除成功");}}</script></div>
</body></html>
效果展示
当账号密码错误时候
密码正确时候
应用分层
通过上面的练习, 我们学习了Spring MVC简单功能的开发, 但是我们也发现了一些问题。
目前我们程序的代码有点"杂乱", 然而当前只是"一点点功能"的开发. 如果我们把整个项目功能完成代码会更加的"杂乱无章"(文件乱, 代码内容也乱)。
分层结构介绍
什么是应用分层?
应用分层 是一种软件开发设计思想, 它将应用程序分成N个层次, 这N个层次分别负责各自的职责, 多个层次之间协同提供完整的功能. 根据项目的复杂度, 把项目分成三层, 四层或者更多层.
常见的MVC设计模式, 就是应用分层的一种具体体现.
应用分层的目的
在最开始的时候,为了让项目快速上线,我们通常是不考虑分层的. 但是随着业务越来越复杂,大量的
代码混在一起,会出现逻辑不清晰、各模块相互依赖(高耦合)、代码扩展性差、改动一处就牵动全局的问题。 所以学习对项进行分层就是我们程序员的必修课了.
如何分层
“MVC” 就是把整体的系统分成了 Model(模型), View(视图)和 Controller(控制器)三个层次,也就是将用户视图和业务处理隔开,并且通过控制器连接起来,很好地实现
了表现和逻辑的解耦,是一种标准的软件分层架构。
目前更主流的开发方式是 “前后端分离” 的方式, 后端开发工程师不再需要关注前端的实现, 对于Java后端开发者, 又有了一种新的分层架构: 把整体架构分为表现层、业务逻辑层和数据层. 这种分层方式也称之为"三层架构".
1. 表现层: 就是展示数据结果和接受用户指令的,是最靠近用户的一层;
2. 业务逻辑层: 负责处理业务逻辑, 里面有复杂业务的具体实现;
3. 数据层: 负责存储和管理与应用程序相关的数据。
按照上面的层次划分, Spring MVC 站在后端开发人员的角度上, 也进行了支持, 把上面的代码划分为三个部分:
请求处理、响应数据:负责,接收页面的请求,给页面响应数据.
逻辑处理: 负责业务逻辑处理的代码.
数据访问: 负责业务数据的维护操作,包括增、删、改、查等操作
这三个部分, 在Spring的实现中, 均有体现:
Controller:控制层。接收前端发送的请求,对请求进行处理,并响应数据。
Service:业务逻辑层。处理具体的业务逻辑。
Dao:数据访问层,也称为持久层。负责数据访问操作,包括数据的增、删、改、查。
代码重构
使用上面的分层思想, 来对代码进行改造。
先创建对应的包路径, 并把代码移到对应的目录
在dao 目录下创建 BookDao文件 在service 目录下创建 BookService文件:
将 BookController 中的代码改写成:
@RequestMapping("/getBookList")public List<BookInfo> getBookList() {BookService bookService = new BookService();return bookService.getBookList();}
应用分层的好处
1. 降低层与层之间的依赖, 结构更加的明确, 利于各层逻辑的复用.
2. 开发人员可以只关注整个结构中的其中某一层, 极大地降低了维护成本和维护时间.
3. 可以很容易的用新的实现来替换原有层次的实现.
4. 有利于标准化.
Spring MVC总结
学习Spring MVC, 其实就是学习各种Web开发需要用的到注解。
a. @RequestMapping: 路由映射
b. @RequestParam: 后端参数重命名
c. @RequestBody: 接收JSON类型的参数
d. @PathVariable: 接收路径参数
e. @RequestPart: 上传文件
f. @ResponseBody: 返回数据
g. @CookieValue: 从Cookie中获取值
h. @SessionAttribute: 从Session中获取值
i. @RequestHeader: 从Header中获取值
j. @Controller: 定义一个控制器, Spring 框架启动时加载, 把这个对象交给Spring管理. 默认返回
视图.k. @RestController: @ResponseBody + @Controller 返回数据
注释是Spring MVC的关键,但是我们还需要关注的是与前端进行交互的思想。这对我们开发网页有很大的作用
相关文章:
[SpringBoot]Spring MVC(6.0)----图书管理系统(初)
图书管理系统 需求: 1. 登录: 用户输入账号,密码完成登录功能. 2. 列表展示: 展示图书. 准备工作 将前端代码复制到 static 目录下. 约定前后端交互接口 两个功能: 用户登录 和 图书列表展示. 需求分析: 1. 用户登录 url : /user/login param : userName 和 password return …...
C语言:基础篇之常见概念
文章目录 1.C语言是什么?2.C语言的历史和辉煌3.编译器的选择VS20223.1 编译和链接3.2 编译器的对比3.3 VS2022 的优缺点 4.VS项目和源文件、头文件介绍5.第一个C语言程序6.main函数7.printf和库函数8.关键字介绍9.字符和ASCII编码10.字符串和\011.转义字符12.语句和…...
Ansible模块——管理100台Linux的最佳实践
使用 Ansible 管理 100 台 Linux 服务器时,推荐遵循以下 最佳实践,以提升可维护性、可扩展性和安全性。以下内容结合实战经验进行总结,适用于中大型环境(如 100 台服务器): 一、基础架构设计 1. 分组与分层…...
算法与数据结构:质数、互质判定和裴蜀定理
文章目录 质数质数判定质数筛选质因数分解互质判定裴蜀定理 质数 首先回顾「质数」的定义:若一个正整数无法被除了 1 和它自身之外的任何自然数整除,则称该数为质数(或素数),否则称该正整数为合数。 根据上述定义&…...
基于C#的Modbus通信协议全面解析与实现指南
目录 1. Modbus协议概述 1.1 Modbus网络结构 1.2 Modbus功能码 2. Modbus RTU模式实现 2.1 RTU模式特点 2.2 CRC-16校验算法 2.3 使用NModbus4库实现RTU通信 3. Modbus TCP/IP模式实现 3.1 TCP模式特点 3.2 MBAP报文头结构 3.3 使用NModbus实现TCP通信 3.4 原生TCP套…...
IVX:重构 AI 原生开发范式,让模型调用成为指尖艺术
一、AI 原生开发的技术跃迁:从黑箱集成到白盒重构 在传统 AI 开发范式中,将 GPT-4o、Mediapipe 等模型集成到业务系统往往需要经历 "模型训练 - API 对接 - 前端适配" 的复杂流程。开发团队需同时掌握机器学习框架(如 TensorFlow&…...
源码分析之Leaflet中TileLayer
概述 TileLayer 是 Layer 的子类,继承自GridLayer基类,用于加载和显示瓦片地图。它提供了加载和显示瓦片地图的功能,支持自定义瓦片的 URL 格式和参数。 源码分析 源码实现 TileLayer的源码实现如下: export var TileLayer …...
Java虚拟机 - 程序计数器和虚拟机栈
运行时数据结构 Java运行时数据区程序计数器为什么需要程序计数器执行流程虚拟机栈虚拟机栈作用虚拟机栈核心结构运行机制 Java运行时数据区 首先介绍Java运行时数据之前,我们要了解,对于计算机来说,内存是非常重要的资源,因为内…...
大语言模型 15 - Manus 超强智能体 开源版本 OpenManus 案例与原理深入解析
写在前面 Manus 是由中国初创公司 Monica.im 于 2025 年 3 月推出的全球首款通用型 AI 智能体(AI Agent),旨在实现“知行合一”,即不仅具备强大的语言理解和推理能力,还能自主执行复杂任务,直接交付完整成…...
开源CMS系统中哪些常见的安全漏洞最需要注意?
在当今数字化时代,开源内容管理系统(CMS)因其灵活性和低成本广受欢迎。然而,开源CMS的安全漏洞也频频成为黑客攻击的突破口。本文将带大家全面了解下开源CMS中需要警惕的安全漏洞以及防护建议,以帮助开发者和管理员更好…...
文件包含靶场实现
文件包含漏洞(File Inclusion Vulnerability)是 Web 安全中常见的高危漏洞,主要分为 本地文件包含(LFI) 和 远程文件包含(RFI) 1、典型利用方式 利用方式示例 Payload说明路径遍历?page../../…...
在 JavaScript 中正确使用 Elasticsearch,第二部分
作者:来自 Elastic Jeffrey Rengifo 回顾生产环境中的最佳实践,并讲解如何在无服务器环境中运行 Elasticsearch Node.js 客户端。 想获得 Elastic 认证?查看下一期 Elasticsearch Engineer 培训的时间! Elasticsearch 拥有大量新…...
DataLight(V1.7.12)版本更新发布
DataLight(V1.7.12)版本更新发布 亲爱的 DataLight 用户们, DataLight 发布 V1.7.12 版本,此版本带来了新服务 DINKY 的支持,以及多项问题修复,进一步提升了平台的易用性和稳定性。 一. 更新日志 在此次…...
LeetCode-前缀和-和为K的子数组
LeetCode-前缀和-和为K的子数组 ✏️ 关于专栏:专栏用于记录 prepare for the coding test。 文章目录 LeetCode-前缀和-和为K的子数组📝 和为K的子数组🎯题目描述🔍 输入输出示例🧩题目提示🧪前缀和❓什么…...
MySQL基础关键_014_MySQL 练习题
目 录 一、有以下表,请用一条 SQL 语句查询出每门课程都大于 80 分的学生 二、综合题1(数据自行模拟) 1.查询身份证号为“440401430103082”的申请日期 2.查询同一个身份证号有两条及以上记录的身份证号码及记录个数 3.将身份证号码为“4…...
femap许可与云计算集成
随着云计算技术的迅猛发展,越来越多的企业开始将关键应用和服务迁移到云端,以享受其带来的弹性扩展、高效管理和成本优化等优势。Femap作为一款强大的电磁仿真工具,通过与云计算的集成,将为企业带来前所未有的许可管理和仿真分析体…...
uni-app项目从0-1基础架构搭建全流程
前情 最近新接了一个全新项目,我负责从0开始搭建小程序,我选用的技术栈是uni-app技术栈,UI库选择的是uview-plus,CSS引入现在流行的tainlwindcss,实现CSS原子化书写,实现小程序分包,分包中实现…...
轻量级高性能推理引擎MNN 学习笔记 04.线性回归
1. 线性回归 MNN 官方给的iOS Demo中,输入是图片,输出是分类结果,相对来讲,略微有些复杂,我们现在用一个最简单的线性回归模型,来说明MNN的用法。 该线性回归是yaxb (其中a2,b0.01)…...
使用 React PDF 构建 React.js PDF 查看器的指南
在本文中,我们将重点介绍在React.js中制作 PDF 查看器的最受欢迎的开源库。具体来说,我们将利用著名的开源库react-pdf的功能,指导您完成创建 React.js PDF 查看器的过程。 通过本教程,您将在第一部分学习如何使用 React-PDF 在 …...
动力电池点焊机厂家:驱动新能源制造的精密力量|比斯特自动化
在新能源汽车、储能系统等产业蓬勃发展的背景下,动力电池点焊机作为电池模组生产的核心设备,正经历着技术迭代与市场需求的双重升级。这类厂家通过持续研发与创新,不仅满足了电池制造企业对焊接精度、效率与稳定性的严苛要求,更推…...
React的合成事件(SyntheticEventt)
文章目录 前言 前言 React的合成事件(SyntheticEvent)是React为了统一不同浏览器的事件处理行为而封装的一套跨浏览器事件系统。它与原生事件的主要区别如下: 1. 事件绑定方式 • 合成事件:使用驼峰命名法绑定事件(如…...
知识中台Top5:Baklib上榜推荐
Baklib知识中台优势 在数字化转型浪潮中,Baklib凭借其知识中台的核心设计理念,构建了企业级知识管理的差异化竞争力。区别于传统文档管理系统,该平台通过四库体系(知识资源库、场景规则库、服务模型库、应用组件库)实…...
在Windows系统中使用C++与Orthanc交互:基于DICOMweb的医学影像应用开发
🧑 博主简介:CSDN博客专家、CSDN平台优质创作者,高级开发工程师,数学专业,10年以上C/C, C#, Java等多种编程语言开发经验,拥有高级工程师证书;擅长C/C、C#等开发语言,熟悉Java常用开…...
视频太大?用魔影工厂压缩并转MP4,画质不打折!
在日常生活中,我们常常需要将视频文件转换成不同的格式以适应各种设备或平台的播放需求。魔影工厂作为一款功能强大且操作简单的视频转换工具,深受用户喜爱。本文中简鹿办公将手把手教你如何使用魔影工厂将视频转换为MP4格式,并进行个性化设置…...
Wan2.1 通过首尾帧生成视频
Wan2.1 通过首尾帧生成视频 flyfish 使用 Wan2.1-FLF2V-14B-720P 模型,通过输入两张图像(起始帧和结束帧),生成一段连贯的视频。 First Last Frame-to-Video 即 “首末帧到视频” 技术 import numpy as np import torch import…...
宝塔+fastadmin:给项目添加定时任务
一、定时任务脚本编写 1. 使用 shebang 声明执行器 #!/usr/bin/env php 这是 Unix/Linux 系统中脚本文件的标准开头。表示这个脚本使用系统环境变量中的 php 来执行。2. 定义 ThinkPHP 入口路径并加载框架 define(APP_PATH, __DIR__ . /../../application/); require __DIR__…...
[自动化集成] 使用明道云上传附件并在Python后端处理Excel的完整流程
在企业日常自动化场景中,使用低代码平台如明道云搭建前端界面,结合自定义Python后端服务,实现灵活数据处理是一种高效的组合方式。本文将分享一个典型的集成用例:用户通过明道云上传文本和Excel附件,Python后端接收并解析这些信息,最终实现完整的数据处理闭环。 项目背景…...
前端项目采用响式布局
要让整个前端项目采用响应式布局,可以从多个方面进行优化,以下是一些具体的建议和实现方法: 1. 使用 ElementPlus 的响应式特性 ElementPlus 组件库本身提供了一些响应式的能力,例如 el-col 组件可以用于创建响应式的网格布局。…...
【Unity】DOTween的常用函数解释
DOTween插件常用函数解释 1.DOTween.To(通用变化动画) 解释:将某一个值在一定的时间内变化到另一个值(通用的函数),可用于大部分的动画变化 使用示例: using UnityEngine; using DG.Tweenin…...
飞桨paddle import fluid报错【已解决】
跟着飞桨的安装指南安装了paddle之后 pip install paddlepaddle有一个验证: import paddle.fluid as fluid fluid.install check.run check()报错情况如下,但是我在pip list中,确实看到了paddle安装上了 我import paddle别的包,…...
ELK简介和docker版安装
使用场景 主要还是给开发人员“打捞日志”用的。 ELK 是由三个开源工具组成的套件(Elasticsearch、Logstash 和 Kibana),主要用于日志的收集、分析和可视化。以下是 ELK 常见的使用场景: 日志集中化管理 收集来自多个服务器或服…...
DockerHub被封禁,怎么将镜像传到国内?一种简单合规的镜像同步到国内方案[最佳实践]
Docker将容器化技术普及,推动云计算向云原生的演进。Docker的核心创新技术之一是容器镜像,它是一种文件的打包方式,将应用程序运行的操作系统、库、运行环境等依赖全部打包一起。在其他任意环境,只要可以运行docker服务࿰…...
飞桨paddle ‘ParallelEnv‘ object has no attribute ‘_device_id‘【已解决】
书借上回,自从我反复重装paddle之后,我发现了,只要pip list中有库,但是代码报错,那就是飞桨没把代码更新完全,只能自己去改源代码 我又遇到报错了: 根据报错信息,找到ParallelEnv报…...
网络安全面试题(一)
文章目录 一、基础概念与模型1. 什么是通信协议?列举三种常见的网络通信模型?2. 解释OSI七层模型及各层功能3. TCP/IP四层模型与OSI模型的对应关系是什么?4. 五层协议体系结构与TCP/IP模型的区别?5. 什么是面向连接与非面向连接的服务&…...
【Leetcode 每日一题】3355. 零数组变换 I
问题背景 给定一个长度为 n n n 的整数数组 n u m s nums nums 和一个二维数组 q u e r i e s queries queries,其中 q u e r i e s [ i ] [ l i , r i ] queries[i] [l_i, r_i] queries[i][li,ri]。 对于每个查询 q u e r i e s [ i ] queries[i] quer…...
RK3588 ArmNN CPU/GPU ResNet50 FP32/FP16/INT8 推理测试
RK3588 ArmNN CPU/GPU ResNet50 FP32/FP16/INT8 推理测试 **背景与目标** 一.性能数据【INT8模型在CPU上推理的结果已经不对,暂未分析原因】二.操作步骤2.1 在x86-Linux上生成onnx模型,以及tflite量化模型(避免在RK3588上安装过多依赖)2.1.1 创建容器2.1.2 安装依赖2.1.3 下载推…...
力扣第5题:最长回文子串(动态规划)
小学生一枚,自学信奥中,没参加培训机构,所以命名不规范、代码不优美是在所难免的,欢迎指正。 标签: 字符串、动态规划、中心扩散法 语言: C 题目: 给你一个字符串s,找到s中最长的…...
HCIP实验五
一、实验拓扑图: 二、实验需求分析: 1. PreVal策略:要求确保R4通过R2到达192.168.10.0/24 ,需在R4上针对去往该网段路由配置PreVal策略,为经R2的路径赋予更高优先值,影响本地路由表选路。 2. AS Path策略…...
python Numpy-数组
目录 Numpy: 一、Ndarray 1 定义 2 数组的属性方法 2.1 数组的维度:np.ndarray.shape 2.2 元素的类型:np.ndarray.dtype 2.3 数组元素的个数:np.ndarray.size 2.4 转置 3 ndarray 所存储元素的数据类型 4 数组创建 4.1 a…...
数据库分库分表从理论到实战
1.分库分表基础理论 1.1 分库分表基本概念 定义:分库分表是一种将单一数据库中的数据分散存储到多个数据库或表中的技术方案,其核心思想是通过"分而治之"的方式解决数据库性能瓶颈问题。分库:将表按业务或数据量拆分到不同数据库中…...
Java异常处理与File类终极指南
Java异常处理与File类终极指南 目录 异常体系全维度拆解异常处理十五种高阶模式自定义异常企业级实践File类深度探索与NIO进化论分布式系统异常处理架构性能调优与安全防护全网最全异常代码库一、异常体系全维度拆解 1.1 Java异常DNA解析 // 异常类的核心继承关系 public cla…...
pmap中的mode列,脏页,写时复制
写时复制(Copy-on-Write,简称 COW) 是一种计算机编程中的优化技术,主要用于内存或存储资源的管理。其核心思想是:只有在真正需要修改数据时,才会执行实际的复制操作,从而避免不必要的资源开销。…...
通过COM获取正在运行的Excel实例并关闭 c#实现
利用COM对象模型获取正在运行的Excel实例并关闭。示例代码如下: using Excel Microsoft.Office.Interop.Excel; using System.Runtime.InteropServices; try { Excel.Application excelApp (Excel.Application)Marshal.GetActiveObject("Excel.Applicatio…...
运行在华为云kubernetes应用接入APM服务
1 APM概述 在云时代微服务架构下应用日益丰富,纷杂的应用异常问题接踵而来。应用运维面临巨大挑战: 分布式应用关系错综复杂,应用性能问题分析定位困难,应用运维面临如何保障应用正常、快速完成问题定位、迅速找到性能瓶颈的挑战…...
虚幻引擎5-Unreal Engine笔记之摄像头camera
虚幻引擎5-Unreal Engine笔记之摄像头camera code review! 目录 第一部分:摄像头的基础概念 1.1 UE5 中摄像头的定义与作用1.2 UE5 中摄像头的类型与分类 第二部分:摄像头的代码结构与分类 2.1 摄像头是类还是组件?2.2 组件的本质ÿ…...
mysql的基础命令
1.SQL的基本概念 SQL 是用于管理和操作关系型数据库的标准编程语言。是所有关系型数据库(如 MySQL、PostgreSQL、Oracle 等)的通用语言。 SQL语句分类 DDL: Data Defination Language 数据定义语言 CREATE,DROP,ALTER DML: Da…...
去中心化算力池:基于IPFS+智能合约的跨校GPU资源共享平台设计
点击 “AladdinEdu,同学们用得起的【H卡】算力平台”,H卡级别算力,按量计费,灵活弹性,顶级配置,学生专属优惠。 一、问题背景:高校算力孤岛的困境 现状痛点 各高校GPU集群利用率差异显著&…...
数据库(二):ORM技术
什么是 ORM? ORM(Object-Relational Mapping) 是一种用于实现 对象模型(面向对象)与关系模型(数据库)之间映射的技术,使程序员可以通过操作对象的方式访问数据库数据,而无…...
Oracle基础知识
目录 1.别名的使用 2.AND的优先级高于OR 3.where后面可以接别名,order by后面不可以 4.Oracle中SQL的执行顺序(重点) 5.dual万用表 6.是否区分大小写 7.Oracle常用数据类型 8.Oracle常用函数 (1)length字符、lengthb字节和cast强制类型转换 (2)数据类型转…...
使用 vite-plugin-dynamic-base 实现运行时动态设置上下文路径
我们一般会在编译之前设置上下文,那么如何在编译之后动态设置上下文的路径? 本文使用的技术栈是 Go(Gin) Vue.js(Vite) 本文使用到的第三方包:https://github.com/chenxch/vite-plugin-dynam…...