【Spring Boot】深入解析:#{} 和 ${}
1.#{} 和 ${}的使用
1.1数据准备
1.1.1.MySQL数据准备
(1)创建数据库:
CREATE DATABASE mybatis_study DEFAULT CHARACTER SET utf8mb4;
(2)使用数据库
-- 使⽤数据数据
USE mybatis_study;
(3)创建用户表
-- 创建表[⽤⼾表]CREATE TABLE `user_info` (`id` INT ( 11 ) NOT NULL AUTO_INCREMENT,`username` VARCHAR ( 127 ) NOT NULL,`password` VARCHAR ( 127 ) NOT NULL,`age` TINYINT ( 4 ) NOT NULL,`gender` TINYINT ( 4 ) DEFAULT '0' COMMENT '1-男 2-⼥ 0-默认',`phone` VARCHAR ( 15 ) DEFAULT NULL,`delete_flag` TINYINT ( 4 ) DEFAULT 0 COMMENT '0-正常, 1-删除',`create_time` DATETIME DEFAULT now(),`update_time` DATETIME DEFAULT now() ON UPDATE now(),PRIMARY KEY ( `id` )
) ENGINE = INNODB DEFAULT CHARSET = utf8mb4;
(4)添加用户信息
-- 添加⽤⼾信息
INSERT INTO mybatis_study.user_info( username, `password`, age, gender, phone )
VALUES ( 'admin', 'admin', 18, 1, '18612340001' );
INSERT INTO mybatis_study.user_info( username, `password`, age, gender, phone )
VALUES ( 'zhangsan', 'zhangsan', 18, 1, '18612340002' );
INSERT INTO mybatis_study.user_info( username, `password`, age, gender, phone )
VALUES ( 'lisi', 'lisi', 18, 1, '18612340003' );
INSERT INTO mybatis_study.user_info( username, `password`, age, gender, phone )
VALUES ( 'wangwu', 'wangwu', 18, 1, '18612340004' );
1.1.2.创建对应的实体类
实体类的属性名与表中的字段名⼀⼀对应
@Data
public class UserInfo {private Integer id;private String username;private String password;private Integer age;private Integer gender;private String phone;private Integer deleteFlag;private Date createTime;private Date updateTime;}
注意:在实际开发中不管什么实体类都要设置删除标志、创建时间、修改时间
1.2 获取Integer类型
1.2.1 #{}
Mapper接口:
@Mapper
public interface UserInfoMapper {// 获取参数中的 UserId@Select("select * from user_info where id = #{userId} ")UserInfo queryById(@Param("userId") Integer id);
测试代码:
@Slf4j
@SpringBootTest //启动Sring 容器
class UserInfoMapperTest {@Testvoid queryById() {UserInfo result = userInfoMapper.queryById(8);log.info(result.toString());}
}
运行结果:
通过日志可以发现,?
进行占位,传的参数进行绑定到占位符。
1.2.2 ${}
Mapper接口:
@Mapper
public interface UserInfoMapper {// 获取参数中的 UserId@Select("select * from user_info where id = ${userId} ")UserInfo queryById(@Param("userId") Integer id);
测试代码:
@Slf4j
@SpringBootTest //启动Sring 容器
class UserInfoMapperTest {@Testvoid queryById() {UserInfo result = userInfoMapper.queryById(8);log.info(result.toString());}
}
运行结果:
通过日志可以发现,SQL命令是完整的,因为,该方法是把字符串拼接在一起执行的。
1.3 获取String类型
1.3.1 #{}
Mapper接口:
@Mapper
public interface UserInfoMapper {// 获取参数中的 username@Select("select * from user_info where username = #{username} ")List<UserInfo> queryByUsername( String username);
测试代码:
@Slf4j
@SpringBootTest //启动Sring 容器
class UserInfoMapperTest {@Autowiredprivate UserInfoMapper userMapper;@Testvoid queryByUsername() {userMapper.queryByUsername("lisi");}
}
运行结果:
通过日志可以发现,?
进行占位,传的参数进行绑定到占位符。
1.3.2 ${}
Mapper接口:
@Mapper
public interface UserInfoMapper {// 获取参数中的 username@Select("select * from user_info where username = ${username} ")List<UserInfo> queryByUsername( String username);
测试代码:
@Slf4j
@SpringBootTest //启动Sring 容器
class UserInfoMapperTest {@Autowiredprivate UserInfoMapper userMapper;@Testvoid queryByUsername() {userMapper.queryByUsername("lisi");}
}
运行结果:报错
从SQL语句中明显的看到WHERE username 后面的字符串没有引号,导致报错。
因为,${}直接把字符内容直接放进SQL语句中而没有加单引号。
修改后的mapper接口:
@Mapper
public interface UserInfoMapper {// 获取参数中的 username@Select("select * from user_info where username = '${username}' ")UserInfo queryByUsername( String username);
2.#{} 和 ${}的区别
2.1 预编译SQL和即时SQL的执行过程
2.1.1 预编译SQL执行过程
#{}是预编译SQL。
第一步:数据库客户端(如 JDBC 驱动)将 SQL 模板发送到数据库服务器。
// SQL模版
PreparedStatement pstmt = connection.prepareStatement("SELECT * FROM user WHERE id = ? AND name = ?");
第二步:SQL 预编译
(1)数据库解析 SQL 模板,生成执行计划(包括语法检查、语义分析、优化等),并缓存该计划。
(2)此时,占位符 ? 的具体值尚未填充,数据库只处理 SQL 的结构。
第三步:客户端通过 PreparedStatement 的方法设置参数值
//参数值以二进制形式单独发送到数据库,不会直接拼接到 SQL 中,避免了 SQL 注入
pstmt.setInt(1, 123); // 绑定 id
pstmt.setString(2, "Alice"); // 绑定 name
第四步:SQL 执行
(1)数据库使用缓存的执行计划,将绑定参数代入执行计划,直接运行查询或更新操作。
(2)如果相同的 SQL 模板再次执行(仅参数不同),数据库可复用缓存的执行计划,减少编译开销。
2.1.2 即时QL执行过程
${}是即时SQL。
第一步:SQL 语句拼接
SELECT * FROM user ORDER BY ${columnName}//如果 columnName = "age"//生成
SELECT * FROM user ORDER BY age; DROP TABLE user;
第二步:SQL 发送到数据库
客户端将拼接好的完整 SQL 字符串通过 Statement 或类似接口发送到数据库
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery(sql);
第三步:SQL解析与编译
语法解析:检查 SQL 语句的语法是否正确。
语义分析:验证表名、列名等是否存在,权限是否足够。
优化:生成执行计划,选择最优的查询路径。
第四步:SQL执行
数据库根据生成的执行计划执行 SQL,完成查询或更新操作。
2.2性能比较
预编译SQL(#{})性能更高:
绝⼤多数情况下, 某⼀条 SQL 语句可能会被反复调⽤执⾏, 或者每次执⾏的时候只有个别的值不同(⽐如 select 的 where ⼦句值不同, update 的 set ⼦句值不同, insert 的 values 值不同). 如果每次都需要经过上⾯的语法解析, SQL优化、SQL编译等,则效率就明显不⾏了
预编译SQL,编译⼀次之后会将编译后的SQL语句缓存起来,后⾯再次执⾏这条语句时,不会再次编译 (只是输⼊的参数不同), 省去了解析优化等过程, 以此来提⾼效率
预编译SQL(#{})更安全(防⽌SQL注⼊):
由于没有对⽤⼾输⼊进⾏充分检查,⽽SQL⼜是拼接⽽成,在⽤⼾输⼊参数时,在参数中添加⼀些 SQL关键字,达到改变SQL运⾏结果的⽬的,也可以完成恶意攻击。
2.3 排序举例
排序需要用到SQL的关键字asc
和desc
,把该两个关键字设置为参数时需要用到${}
,因为#{}
会把asc
和desc
认为是字符串
2.3.1 #{}
Mapper接口:
@Mapper
public interface UserInfoMapper {@Select("select * from userInfo order by username #{flag}")List<UserInfo> findAll(String flag);
}
测试代码
@Slf4j
@SpringBootTest //启动Sring 容器
class UserInfoMapperTest {@Autowiredprivate UserInfoMapper userMapper;@Testvoid findAll() {userMapper.findAll("asc");}
}
运行结果:
2.3.2 #{}
Mapper接口:
@Mapper
public interface UserInfoMapper {@Select("select * from userInfo order by username ${flag}")List<UserInfo> findAll(String flag);
}
测试代码
@Slf4j
@SpringBootTest //启动Sring 容器
class UserInfoMapperTest {@Autowiredprivate UserInfoMapper userMapper;@Testvoid findAll() {userMapper.findAll("asc");}
}
运行结果:
2.4 like 查询
2.4.1 #{}
Mapper接口:
@Mapper
public interface UserInfoMapper {@Select("select * from user_info where username like '%#{s}%'")List<UserInfo> queryLike(String s);
}
测试代码:
@Slf4j
@SpringBootTest //启动Sring 容器
class UserInfoMapperTest {@Autowiredprivate UserInfoMapper userMapper;@Testvoid queryLike() {String s = "6";userMapper.queryLike(s);}
}
运行结果:
把 #{} 改成 可以正确查出来 , 但是 {} 可以正确查出来, 但是 可以正确查出来,但是{}存在SQL注⼊的问题, 所以不能直接使⽤ ${}.解决办法: 使⽤ mysql 的内置函数 concat() 来处理,实现代码如下:
修改后的Mapper接口:
@Mapper
public interface UserInfoMapper {@Select("select * from user_info where username like concat('%',#{s},'%') ")List<UserInfo> queryLike(String s);
运行结果:
2.4.2 ${}
Mapper接口:
@Mapper
public interface UserInfoMapper {@Select("select * from user_info where username like '%${s}%' ")List<UserInfo> queryLike(String s);
}
测试代码:
@Slf4j
@SpringBootTest //启动Sring 容器
class UserInfoMapperTest {@Autowiredprivate UserInfoMapper userMapper;@Testvoid queryLike() {String s = "6";userMapper.queryLike(s);}
}
运行结果:
3.什么是SQL注入?
SQL注⼊:是通过操作输⼊的数据来修改事先定义好的SQL语句,以达到执⾏代码对服务器进⾏攻击的⽅法。
举例:
下面定义的接口是由username得到该username的信息
Mapper接口:
@Mapper
public interface UserInfoMapper {// 获取参数中的 username@Select("select * from user_info where username = ${username} ")List<UserInfo> queryByUsername( String username);
可以通过输入' or username='
来获取该表中所有人的信息
测试代码:
@Slf4j
@SpringBootTest //启动Sring 容器
class UserInfoMapperTest {@Autowiredprivate UserInfoMapper userMapper;@Testvoid queryByUsername() {userMapper.queryByUsername("lisi");}
}
运行结果:
可以看出来, 查询的数据越界了接口的定义。所以⽤于查询的字段,尽量使⽤#{}
预查询的⽅式
SQL注⼊是⼀种⾮常常⻅的数据库攻击⼿段, SQL注⼊漏洞也是⽹络世界中最普遍的漏洞之⼀。
4.数据库连接池
4.1介绍
数据库连接池负责分配、管理和释放数据库连接,它允许应⽤程序重复使⽤⼀个现有的数据库连接,⽽不是再重新建⽴⼀个.
没有使⽤数据库连接池的情况: 每次执⾏SQL语句, 要先创建⼀个新的连接对象, 然后执⾏SQL语句, SQL语句执⾏完, 再关闭连接对象释放资源. 这种重复的创建连接, 销毁连接⽐较消耗资源
使⽤数据库连接池的情况: 程序启动时, 会在数据库连接池中创建⼀定数量的Connection对象, 当客⼾请求数据库连接池, 会从数据库连接池中获取Connection对象, 然后执⾏SQL, SQL语句执⾏完, 再把 Connection归还给连接池.
优点:
1.减少了⽹络开销
2.资源重⽤
3.提升了系统的性能
4.26.2使⽤
常⻅的数据库连接池:
•C3P0
•DBCP
•Druid
•Hikari
⽬前⽐较流⾏的是 Hikari, Druid
Hikari : SpringBoot默认使⽤的数据库连接池
Hikari 是⽇语"光"的意思(ひかり), Hikari也是以追求性能极致为⽬标
2.Druid
如果我们想把默认的数据库连接池切换为Druid数据库连接池, 只需要引⼊相关依赖即可
<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-3-starter</artifactId><version>1.2.21</version>
</dependency>
如果SpringBoot版本为2.X, 使⽤druid-spring-boot-starter 依赖
<dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.17</version>
</dependency>
Druid连接池是阿⾥巴巴开源的数据库连接池项⽬
功能强⼤,性能优秀,是Java语⾔最好的数据库连接池之⼀
相关文章:
【Spring Boot】深入解析:#{} 和 ${}
1.#{} 和 ${}的使用 1.1数据准备 1.1.1.MySQL数据准备 (1)创建数据库: CREATE DATABASE mybatis_study DEFAULT CHARACTER SET utf8mb4;(2)使用数据库 -- 使⽤数据数据 USE mybatis_study;(3ÿ…...
SpringMVC知识体系
SpringMVC 知识体系 1. SpringMVC 基础 MVC 设计模式 Model: 模型层,处理业务逻辑View: 视图层,负责界面展示Controller: 控制层,处理请求并协调模型和视图 核心组件 DispatcherServlet: 前端控制器HandlerMapping: 处理器映射Controller: …...
如何将 PDF 中的文本提取为 JSON 格式
一些 PDF 文件是“带标签”的,意味着它们包含关于文件结构的信息。这种结构作为元数据嵌入在 PDF 中,由一系列标签组成,用于标记诸如标题、段落、列表、表格和图像等元素。 这非常类似于 HTML,其中的文本包含在具有语义意义的元素…...
深度解析:基于Python的微信小程序自动化操作实现
引言 在当今数字化时代,自动化技术正在改变我们与软件交互的方式。本文将深入解析一个使用Python实现的微信小程序自动化操作脚本,该脚本能够自动识别屏幕上的特定图像并执行点击操作。这种技术在自动化测试、批量操作和效率工具开发中有着广泛的应用前…...
【网络安全】网络钓鱼的类型
1. 网络钓鱼简介 网络钓鱼是最常见的社会工程学类型之一,它是一种利用人为错误来获取私人信息、访问权限或贵重物品的操纵技术。之前,您学习了网络钓鱼是如何利用数字通信诱骗人们泄露敏感数据或部署恶意软件的。 有时,网络钓鱼攻击会伪装成…...
Python----深度学习(基于深度学习Pytroch线性回归和曲线回归)
一、引言 在当今数据驱动的时代,深度学习已成为解决复杂问题的有力工具。它广泛应用于图像识别、自然语言处理和预测分析等领域。回归分析是统计学的一种基础方法,用于描述变量之间的关系。通过回归模型,我们可以预测连续的数值输出…...
重构智能场景:艾博连携手智谱,共拓智能座舱AI应用新范式
2025年4月24日,智能座舱领域创新企业艾博连科技与国产大模型独角兽智谱,在上海国际车展艾博连会客厅签署合作协议。双方宣布将深度整合智谱在AI大模型领域的技术积淀与艾博连在汽车智能座舱场景的落地经验,共同推进下一代"有温度、懂需求…...
Streamlit从入门到精通:构建数据应用的利器
在数据科学与机器学习日益普及的今天,如何快速将模型部署为可交互的应用成为了许多数据科学家的重要任务。Streamlit,作为一个开源的Python库,专为数据科学家设计,能够帮助我们轻松构建美观且直观的Web应用。本文将从入门到精通&a…...
4.1.1 类的序列化与反序列化(XmlSerializer)
本文介绍XML序列化和反序列化操作 本例子中被序列化的类(Devices)中有一个List,其元素类型为:DigitalInputInfo. 序列化以及反序列化都很简单: 序列化:即把类的对象输出到文件中。 StreamWriter streamWriter new StreamWriter(filePath); …...
新增优惠券
文章目录 概要整体架构流程技术细节小结 概要 接口分析 一个基本的新增接口,按照Restful风格设计即可,关键是请求参数。之前表分析时已经详细介绍过这个页面及其中的字段,这里不再赘述。 需要特别注意的是,如果优惠券限定了使…...
Qt 处理 XML 数据
在 Qt 中,处理 XML 数据通常使用 Qt 提供的 QDomDocument、QXmlStreamReader 和 QXmlStreamWriter 类。这些类可以帮助你读取、修改和写入 XML 数据。 1. 使用 QDomDocument 处理 XML QDomDocument 提供了对 XML 文档的 DOM(Document Object Model&…...
STM32F407使用ESP8266实现阿里云OTA(下)
文章目录 前言一、函数分析1.get_bin()函数2.download_bin()函数3.串口1中断函数二、完整工程分析前言 从上一章中,我们已经成功连接阿里云并且成功拿到了升级包的下载地址,在本文我们将升级包下载下来并且存储到SD卡中,最终将程序写入FLASH中完成APP的跳转,至此我们的OTA…...
树型结构(知识点梳理及例题精讲)
大家好啊,这一集,我们来学习树型结构,请确保看完预习篇,再来看此篇哦 树型结构(预习课)-CSDN博客 话不多说,直接开讲 -------------------------------------------------------分割线-------…...
使用HYPRE库并行装配IJ稀疏矩阵指南: 矩阵预分配和重复利用
使用HYPRE库并行装配IJ稀疏矩阵指南 HYPRE是一个流行的并行求解器库,特别适合大规模稀疏线性系统的求解。下面介绍如何并行装配IJ格式的稀疏矩阵,包括预先分配矩阵空间和循环使用。 1. 初始化矩阵 首先需要创建并初始化一个IJ矩阵: #incl…...
win11什么都不动之后一段时间黑屏桌面无法显示,但鼠标仍可移动,得要熄屏之后才能进入的四种解决方法
现象: 1. 当时新建运行的资源管理器的任务卡了或者原本资源管理器卡了 比如:当时在文本框中输入explorer 注:explorer.exe是Windows的文件资源管理器,它用于管理Windows的图形外壳,包括桌面和文件管理 按住CtrlAltEs…...
C语言编程--15.四数之和
题目: 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复)&…...
从单机工具到协同平台:开源交互式模拟环境的技术演进之路
从单机工具到协同平台:开源交互式模拟环境的技术演进之路 一、引言:从“孤岛”到“生态”的模拟技术变革 二十年前,模拟软件如LAMMPS(分子动力学)、ANSYS(工程仿真)以单机版为主,用…...
Python函数与模块笔记
Python函数与模块笔记 目录 函数 无参函数带参函数变量作用域Lambda函数常用内置函数 模块与包 模块的定义与导入包的使用常用模块(keyword、random、sys、time) 一、函数 1. 无参函数 定义语法: def 函数名(): 代码块 return [表达式]…...
Jenkins:开启高效软件开发的魔法之门
一、Jenkins 是什么 Jenkins 是一款基于 Java 开发的开源持续集成工具,在软件开发流程中占据着举足轻重的地位。它的前身是 Hudson ,于 2004 年由 Sun 公司的 Kohsuke Kawaguchi 开发,2011 年因商标纠纷更名为 Jenkins。发展至今,…...
正则表达式学习指南
正则表达式学习指南 在编程的世界里,正则表达式(Regular Expressions,简称regex)是一门不可或缺的艺术,它赋予了开发者强大的文本处理能力,让看似复杂的字符串匹配和替换任务变得简单而高效。本文旨在为初…...
React-组件通信
1、父子组件通信 (1)父传子(props 传值) // 父组件 function App() {const name 张三return (<div className"App"><Son name{name} /></div>); }// 子组件 function Son(props) {return (<div…...
MuJoCo 机械臂 PPO 强化学习逆向运动学(IK)
视频讲解: MuJoCo 机械臂 PPO 强化学习逆向运动学(IK) 代码仓库:https://github.com/LitchiCheng/mujoco-learning 结合上期视频,我们安装了stable_baselines3和gym,今天用PPO尝试强化学习得到关节空间到达…...
代码随想录算法训练营第一天:数组part1
今日学习的文章链接和视频链接 ● 自己看到题目的第一想法 ● 看完代码随想录之后的想法 ● 自己实现过程中遇到哪些困难 ● 今日收获,记录一下自己的学习时长 状态 思路理解完成 30% 代码debug完成 60% 代码模板总结并抽象出来 100% 题目 704 二分查找 题目链接…...
C++学习:六个月从基础到就业——STL算法(二)排序与变序算法
C学习:六个月从基础到就业——STL算法(二)排序与变序算法 本文是我C学习之旅系列的第二十六篇技术文章,也是第二阶段"C进阶特性"的第四篇,主要介绍C STL算法库中的排序和变序算法。查看完整系列目录了解更多…...
JVM性能优化之年轻代参数设置
一、引言 在Java应用开发中,性能问题往往是最难预测却又最影响用户体验的关键因素。即便代码逻辑完美,若JVM(Java虚拟机)配置不当,也可能导致频繁GC停顿、内存泄漏,甚至引发系统崩溃。JVM性能优化并非简单…...
A*迷宫寻路
二、实验内容 以寻路问题为例实现A*算法的求解程序,设计两种不同的估价函数: 1.设置两种地图: 根据题意,用矩阵设置两个地图。 地图1:设置5行5列的迷宫,代码如下: 地图2:设置20行…...
秒出PPT推出更强版本,AI PPT工具进入新纪元!
在现代职场中,PPT是我们沟通和展示信息的重要工具。无论是做产品演示,还是准备工作汇报,一份精美的PPT能大大提升演示效果。然而,传统的PPT制作往往需要消耗大量时间,尤其是在排版、设计和内容调整上。如今,…...
electron-updater实现自动更新
electron-updater 是一个专为 Electron 应用设计的自动更新工具,能够帮助开发者轻松实现跨平台的自动更新功能。它支持 Windows、macOS 和 Linux 系统,通过简单的配置即可集成到 Electron 应用中,自动检查应用的最新版本并在后台完成更新。el…...
Ubuntu22学习记录
Ubuntu22学习记录 虚拟机挂载共享文件夹离线安装.net core3.1离线安装mysql离线安装supervisor离线安装nginx开机自启 虚拟机挂载共享文件夹 sudo vmhgfs-fuse .host:/ /mnt/hgfs -o allow_other 挂载路径:/mnt/hgfs/离线安装.net core3.1 离线安装mysql 离线安装…...
【MinerU】:一款将PDF转化为机器可读格式的工具——RAG加强(Docker版本)
目录 创建容器 安装miniconda 安装mineru CPU运行 GPU加速 多卡问题 创建容器 构建Dockerfile文件 开启ssh服务,设置密码为1234等操作 # 使用官方 Ubuntu 24.04 镜像 FROM ubuntu:24.04# 安装基础工具和SSH服务 RUN apt-get update && \apt-get ins…...
leetcode 69和367
69. Sqrt(x) 代码: class Solution { public:int mySqrt(int x) {int left 0;int right x;long long mid 0;int res 0;long long temp 0;while(left < right){mid left ((right - left)>>1);temp mid*mid;if(temp x){res mid;break;}else if(te…...
# 代码随想录算法训练营Day37 | Leetcode300.最长递增子序列、674.最长连续递增序列、718.最长重复子数组
代码随想录算法训练营Day37 | Leetcode300.最长递增子序列、674.最长连续递增序列、718.最长重复子数组 一、最长递增子序列 相关题目:Leetcode300 文档讲解:Leetcode300 视频讲解:Leetcode300 1. Leetcode300.最长递增子序列 给你一个整数数…...
中小企业技术跃迁:云原生后端如何实现高效低成本系统建设
📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:技术变革的“门槛”能否被跨越? 过去十年,云计算与容器化技术飞速发展,互联网巨头纷纷构建自己的云原生基础设施,实现系统模块化、弹性伸缩、自动化运维。然而,中小企业在这股浪潮中…...
系统架构师2025年论文《系统架构风格2》
论软件系统架构风格 摘要: 某市医院预约挂号系统建设推广应用项目是我市卫生健康委员会 2019 年发起的一项医疗卫生行业信息化项目,目的是实现辖区内患者在辖区各公立医疗机构就诊时,可以通过多种线上渠道进行预约挂号。我作为系统架构师参与此项目。本文围绕软件系统架构…...
Java面试实战:电商场景下的Spring Cloud微服务架构与缓存技术剖析
第一轮提问 面试官: 谢飞机,我们先从基础问题开始。请问你知道Spring Boot和Spring Cloud的区别吗? 谢飞机: 当然知道!Spring Boot主要用于快速构建独立运行的Spring应用,而Spring Cloud则是在Spring Boot的基础上实现分布式系统…...
快速配置linux远程开发-go语言
1.go安装包安装 2.go env 配置 go env -w GO111MODULEon go env -w GOPROXYxx go env -w GOSUMDBoff go env -w GOPRIVATExx 3.复制linux公钥到gitlab中,用于通过ssh免密拉取gitlab项目 ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 4.设置…...
C++23文本编码革新:迈向更现代的字符处理
文章目录 一、字符集与编码(P2314R4)二、统一的字符字面量编码(P2316R2)三、具名通用字符转义(P2071R2)四、带分隔的转义序列(P2290R3)五、支持UTF-8作为可移植源文件编码࿰…...
CentOS系统中MySQL安装步骤分享
在 CentOS 系统上安装 MySQL,需要依次进行环境检查、软件源配置、安装 MySQL、启动服务等操作。我将按照规范流程,为你详细分享完整且具体的安装步骤。 在 CentOS 系统中安装 MySQL 数据库,能够为各类应用提供高效稳定的数据存储和管理服务。…...
【产品经理从0到1】Axure介绍
01. 上期内容回顾 创建元件库的时候,在添加原件时不知道怎么操作。讲解很耐心,希望课上分解步骤多带着练习下;PC 端的原型,相对于移动端,非常自由,没有任何的设计规范;但是,要求 PC…...
30天通过软考高项-第二天
30天通过软考高项-第二天 任务:项目立项管理、项目整合管理 思维导图阅读 知识点记忆 章节习题练习 知识点练习 手写回忆ITTO 立项管理-背 1. 项目可研的5个方面 基金社运法 技术可行性、经济可行性、社会效益可行性、运行环境可行性、其他(法律、政…...
yt-dlp 下载时需要 cookie
下载 b 站 歌曲 yt-dlp -x --proxy http://127.0.0.1:1080 --audio-format mp3 https://www.bilibili.com/video/BV1Zn4y1X75b解决方案,使用 firefox 登录相关网站 yt-dlp -o "downloads/%(title)s.%(ext)s" -f "bestvideo[height<1080]bestaud…...
快速上手GO的net/http包,个人学习笔记
更多个人笔记:(仅供参考,非盈利) gitee: https://gitee.com/harryhack/it_note github: https://github.com/ZHLOVEYY/IT_note 针对GO中net/http包的学习笔记 基础快速了解 创建简单的GOHTTP服务 func …...
Flask + ajax上传文件(二)--多文件上传
Flask多文件上传完整教程 本教程将详细介绍如何使用Flask实现多文件上传功能,并使用时间戳为上传文件自动命名,避免文件名冲突。 一、环境准备 确保已安装Python和Flask pip install flask项目结构 flask_upload/ ├── app.py ├── upload/ # 上传文…...
sysstat介绍以及交叉编译
文章目录 1. 工具集介绍2. 指令使用参考3. 交叉编译3.1 源码下载3.2 编译步骤 4. 工具验证4.1 将相关工具导入到设备4.2 功能验证 1. 工具集介绍 Sysstat 是一个功能强大的 Linux 系统性能监控工具包,提供实时监控和历史数据分析功能,帮助管理员优化系统…...
常见正则表达式整理与Java使用正则表达式的例子
一、常见正则表达式整理 1. 基础验证类 邮箱地址 ^[a-zA-Z0-9._%-][a-zA-Z0-9.-]\\.[a-zA-Z]{2,}$ (匹配如 userexample.com)手机号 ^1[3-9]\\\\d{9}$ (匹配国内11位手机号,如 13812345678)中文字符 ^[\u4e00-\u9fa5…...
UE5 Assimp 自用
记录一下配assimp库到ue中的过程。因为想在ue里面实现一些几何处理(虽然ue好像有相关的geo的代码),遂配置了一下assimp。 1. 编译整理生成自己所需要的文件。cmake编译,下载github 的官方的assimp-master,然后cmake都是默认的就行…...
java—12 kafka
目录 一、消息队列的优缺点 二、常用MQ 1. Kafka 2. RocketMQ 3. RabbitMQ 4. ActiveMQ 5. ZeroMQ 6. MQ选型对比 适用场景——从公司基础建设力量角度出发 适用场景——从业务场景角度出发 四、基本概念和操作 1. kafka常用术语 2. kafka常用指令 3. 单播消息&a…...
VS Code 智能代理模式:重塑开发体验
在编程领域,效率与精准度无疑是开发者们永恒的追求。而如今,VS Code 推出的智能代理模式(Agent Mode),正以前所未有的方式,彻底颠覆了传统开发流程,为程序员们带来了一场前所未有的效率革命。本…...
基于深度学习和单目测距的前车防撞及车道偏离预警系统
随着人工智能与计算机视觉技术的飞速发展,高级驾驶辅助系统(ADAS)已成为现代汽车智能化的关键标志。它不仅能有效提升行车安全,还能为自动驾驶时代的全面到来奠定坚实基础。本文深入剖析一套功能完备、基于深度学习模型的 ADAS 系统的架构与核心实现,带您领略智能驾驶背后…...
第二篇:Django配置及ORM操作
第二篇:Django配置及ORM操作 文章目录 第二篇:Django配置及ORM操作一、静态文件配置1、为什么要配置静态文件?2、如何配置静态文件?3、静态文件动态解析4、form表单默认是get请求数据 二、request对象方法初识三、pycharm链接数据…...