JDBC 完全指南:掌握 Java 数据库交互的核心技术
JDBC 完全指南:掌握 Java 数据库交互的核心技术
一、JDBC 是什么?为什么它如此重要?
JDBC(Java Database Connectivity)是 Java 语言中用于连接和操作关系型数据库的标准 API。它允许开发者通过统一的接口访问不同的数据库(如 MySQL、Oracle、PostgreSQL 等),而无需关心底层数据库的具体实现。 JDBC是学习Mybatis的前提,Mybatis是JDBC的简化,清楚认识到jdbc的流程,才能更好理解Mybatis。Mybatis明天准时更新。
JDBC 的核心价值
- 跨数据库兼容性:同一套代码适配多种数据库(通过更换驱动即可)。
- 简化开发:封装数据库协议细节,开发者专注于业务逻辑。
- 性能可控:支持从原生 SQL 操作到连接池优化等多层调优。
二、JDBC 架构与核心组件
JDBC 的架构分为两层:
- 应用程序层:开发者编写的 Java 代码。
- 驱动层:数据库厂商提供的 JDBC 驱动(如
mysql-connector-java
)。
核心接口与类
组件 | 作用 |
---|---|
DriverManager | 管理数据库驱动,建立与数据库的连接 |
Connection | 表示与数据库的会话,用于管理事务和创建语句对象 |
Statement | 执行静态 SQL 语句(如 SELECT , INSERT ) |
PreparedStatement | 预编译 SQL 语句,防止 SQL 注入,提升性能 |
CallableStatement | 调用数据库存储过程 |
ResultSet | 封装查询结果集,支持遍历和读取数据 |
三、JDBC 工作流程详解
6 步完成数据库操作
1. 注册驱动(可选)
从 JDBC 4.0 开始,支持自动驱动加载,无需手动调用 Class.forName()
。
// 旧方式(JDBC 3.0)
Class.forName("com.mysql.cj.jdbc.Driver"); // JDBC 4.0+ 自动加载驱动(需驱动 JAR 包含 META-INF/services/java.sql.Driver 文件)
2. 建立连接
通过 DriverManager.getConnection()
获取 Connection
对象。
String url = "jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC";
String user = "root";
String password = "123456"; try (Connection conn = DriverManager.getConnection(url, user, password)) { // 使用连接执行操作
}
3. 创建 Statement
根据需求选择 Statement
或 PreparedStatement
。
// 静态 SQL(存在 SQL 注入风险)
Statement stmt = conn.createStatement(); // 预编译 SQL(推荐)
String sql = "INSERT INTO users(name, email) VALUES (?, ?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
4. 执行 SQL
- 查询:
executeQuery()
返回ResultSet
。 - 更新:
executeUpdate()
返回受影响的行数。
// 插入数据
pstmt.setString(1, "Alice");
pstmt.setString(2, "alice@example.com");
int rows = pstmt.executeUpdate();
System.out.println("插入行数: " + rows); // 查询数据
ResultSet rs = stmt.executeQuery("SELECT * FROM users");
5. 处理结果集
遍历 ResultSet
并读取数据。
while (rs.next()) { int id = rs.getInt("id"); String name = rs.getString("name"); System.out.println(id + ", " + name);
}
6. 关闭资源
使用 try-with-resources 自动关闭资源(Java 7+)。
try (Connection conn = DriverManager.getConnection(url, user, password); PreparedStatement pstmt = conn.prepareStatement(sql); ResultSet rs = pstmt.executeQuery()) { // 操作代码
} catch (SQLException e) { e.printStackTrace();
}
四、PreparedStatement vs Statement:为什么前者更优秀?
对比项 | Statement | PreparedStatement |
---|---|---|
SQL 注入风险 | 高(直接拼接 SQL) | 低(参数化查询) |
性能 | 每次执行需编译 SQL | 预编译一次,重复使用效率高 |
可读性 | 字符串拼接复杂 | 参数占位符(? )清晰易读 |
示例:PreparedStatement 防 SQL 注入
String input = "admin'; DROP TABLE users;--"; // 错误方式(Statement)
String sql = "SELECT * FROM users WHERE name = '" + input + "'";
// 实际 SQL: SELECT * FROM users WHERE name = 'admin'; DROP TABLE users;--' // 正确方式(PreparedStatement)
PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM users WHERE name = ?");
pstmt.setString(1, input); // 参数会被安全处理
五、事务管理:保证数据一致性
通过 Connection
对象控制事务:
try (Connection conn = DriverManager.getConnection(url, user, password)) { conn.setAutoCommit(false); // 关闭自动提交 // 执行多个操作 updateAccount(conn, "A", -100); updateAccount(conn, "B", 100); conn.commit(); // 提交事务
} catch (SQLException e) { conn.rollback(); // 回滚事务
}
关键方法:
setAutoCommit(boolean)
:启用/禁用自动提交。commit()
:提交事务。rollback()
:回滚事务。
六、连接池:提升性能的关键
为什么需要连接池?
- 频繁创建/关闭连接开销大。
- 连接池预先创建并管理连接,复用连接减少延迟。
常用连接池库
- HikariCP:高性能,Spring Boot 默认选择。
- Apache DBCP:稳定但性能一般。
- C3P0:功能丰富,但较老旧。
HikariCP 示例配置
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost/mydb");
config.setUsername("root");
config.setPassword("123456");
config.setMaximumPoolSize(10); try (HikariDataSource dataSource = new HikariDataSource(config); Connection conn = dataSource.getConnection()) { // 使用连接
}
七、异常处理与最佳实践
1. 处理 SQLException
- 捕获并记录异常,避免直接忽略。
- 使用
SQLException.getErrorCode()
获取数据库特定错误码。
2. 最佳实践
- 始终使用 PreparedStatement:防止 SQL 注入。
- 使用 try-with-resources:确保资源释放。
- 合理设置连接池参数:如最大连接数、超时时间。
- 日志记录 SQL 操作:便于调试和审计。
八、进阶:JdbcTemplate 与 ORM 框架
1. Spring JdbcTemplate
简化 JDBC 样板代码:
@Autowired
private JdbcTemplate jdbcTemplate; public List<User> getUsers() { return jdbcTemplate.query("SELECT * FROM users", (rs, rowNum) -> { User user = new User(); user.setId(rs.getInt("id")); user.setName(rs.getString("name")); return user; });
}
2. ORM 框架(如 MyBatis、Hibernate)
- MyBatis:通过 XML/注解映射 SQL,灵活性强。
- Hibernate:全自动 ORM,适合复杂对象模型。
九、完整示例:JDBC CRUD 操作
public class JdbcDemo { private static final String URL = "jdbc:mysql://localhost:3306/mydb"; private static final String USER = "root"; private static final String PASSWORD = "123456"; public static void main(String[] args) { // 插入用户 insertUser("Bob", "bob@example.com"); // 查询用户 List<User> users = getUsers(); users.forEach(System.out::println); } public static void insertUser(String name, String email) { String sql = "INSERT INTO users(name, email) VALUES (?, ?)"; try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD); PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setString(1, name); pstmt.setString(2, email); pstmt.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } } public static List<User> getUsers() { List<User> users = new ArrayList<>(); String sql = "SELECT * FROM users"; try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql)) { while (rs.next()) { User user = new User(); user.setId(rs.getInt("id")); user.setName(rs.getString("name")); user.setEmail(rs.getString("email")); users.add(user); } } catch (SQLException e) { e.printStackTrace(); } return users; }
}
**十、总结
核心要点回顾
- JDBC 是 Java 操作数据库的标准,通过驱动实现跨数据库兼容。
PreparedStatement
比Statement
更安全高效。- 事务和连接池是提升性能与稳定性的关键。
掌握 JDBC,您已打通 Java 与数据库的桥梁! 🚀
相关文章:
JDBC 完全指南:掌握 Java 数据库交互的核心技术
JDBC 完全指南:掌握 Java 数据库交互的核心技术 一、JDBC 是什么?为什么它如此重要? JDBC(Java Database Connectivity)是 Java 语言中用于连接和操作关系型数据库的标准 API。它允许开发者通过统一的接口访问不同的数…...
【STM32】STM32系列产品以及新手入门的STM32F103
📢 STM32F103xC/D/E 系列是一款高性能、低功耗的 32 位 MCU,适用于工业、汽车、消费电子等领域;基于 ARM Cortex-M3,主频最高 72MHz,支持 512KB Flash、64KB SRAM,适合复杂嵌入式应用,提供丰富的…...
esp32驱动带字库芯片TFT屏幕
前言 学习esp32单片机开发,前段时间在网上买了一块2.0寸TFT屏幕。 长这个样子,这个屏幕带汉字字库的硬件模块。我仔细看了一下这个字库模块上面写的字是25Q32FVSIG 1336 文档 卖家也发来了开发文档,是个doc文档,张这个样子。 开…...
[Python入门学习记录(小甲鱼)]第5章 列表 元组 字符串
第5章 列表 元组 字符串 5.1 列表 一个类似数组的东西 5.1.1 创建列表 一个中括号[ ] 把数据包起来就是创建了 number [1,2,3,4,5] print(type(number)) #返回 list 类型 for each in number:print(each) #输出 1 2 3 4 5#列表里不要求都是一个数据类型 mix [213,"…...
网络安全等级保护2.0 vs GDPR vs NIST 2.0:全方位对比解析
在网络安全日益重要的今天,各国纷纷出台相关政策法规,以加强信息安全保护。本文将对比我国网络安全等级保护2.0、欧盟的GDPR以及美国的NIST 2.0,分析它们各自的特点及差异。 网络安全等级保护2.0 网络安全等级保护2.0是我国信息安全领域的一…...
由麻省理工学院计算机科学与人工智能实验室等机构创建低成本、高效率的物理驱动数据生成框架,助力接触丰富的机器人操作任务
2025-02-28,由麻省理工学院计算机科学与人工智能实验室(CSAIL)和机器人与人工智能研究所的研究团队创建了一种低成本的数据生成框架,通过结合物理模拟、人类演示和基于模型的规划,高效生成大规模、高质量的接触丰富型机…...
leetcode15 三数之和
1.哈希法 为了避免重复 class Solution { public:vector<vector<int>> threeSum(vector<int>& nums) {set<vector<int>> temple;//使用 set 来存储符合条件的三元组,避免重复vector<vector<int>> out;//存放最终输…...
5c/c++内存管理
1. C/C内存分布 int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar 1;int localVar 1;int num1[10] { 1, 2, 3, 4 };char char2[] "abcd";const char* pChar3 "abcd";int* ptr1 (int*)malloc(sizeof(int) * 4);i…...
蓝桥备赛(11)- 数据结构、算法与STL
一、数据结构 1.1 什么是数据结构? 在计算机科学中,数据结构是一种 数据组织、管理和存储的格式。它是相互之间存在一种 或多种特定关系的数据元素的集合。 ---> 通俗点,数据结构就是数据的组织形式 , 研究数据是用什么方…...
C++ 二叉搜索树代码
C 二叉搜索树代码 #include <iostream> using namespace std;template<typename T> struct TreeNode{T val;TreeNode *left;TreeNode *right;TreeNode():val(0), left(NULL), right(NULL){}TreeNode(T x):val(x), left(NULL), right(NULL){} };template<typena…...
Flask 打包为exe 文件
进入虚拟环境 激活虚拟环境 .venv\Scripts\activatepython build.py 完成标识图片 已经完成打包了,完成,下边是我自己记录的 这时候,我自己数据库文件夹下是没有sql 脚本的,要自己拷贝下这个路径下的文件 E:\开源文件\python-wi…...
JavaWeb-idea配置smart tomcat
一,安装smart tomcat插件 在插件市场搜索smart tomcat 点击安装,我已经安装成功。 二,web项目配置tomcat 点击这里,选择edit 进来之后,选加号 然后选tomcat 在这里,配置完毕后,点apply&…...
DELETE/ UPDATE/ INSERT 语句会自动加锁
在数据库系统中,DELETE、UPDATE 和 INSERT 语句通常会自动加锁,以确保数据的一致性和并发控制。具体的锁类型和效果取决于数据库的实现(如 MySQL、PostgreSQL 等)以及事务的隔离级别。以下是这些操作通常加锁的行为和效果…...
docker本地部署ollama
启动ollama容器 1.使用该命令启动CPU版运行本地AI模型 docker run -d -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama 2.此命令用于启动GPU版本运行AI模型 前提是笔记本已配置NVIDIA的GPU驱动,可在shell中输入nvidia-smi查看详细情况…...
Linux线程机制
Linux 操作系统中的线程机制是基于 POSIX 线程(Pthreads) 标准实现的,通常称为 pthread。Linux 内核通过Native POSIX Thread Library提供了对多线程的支持。 1. 线程的基本概念 线程是进程中的一个执行单元,是 CPU 调度的基本单…...
LeetCode热题100JS(44/100)第八天|二叉树的直径|二叉树的层序遍历|将有序数组转换为二叉搜索树|验证二叉树搜索树|二叉搜索树中第K小的元素
543. 二叉树的直径 题目链接:543. 二叉树的直径 难度:简单 刷题状态:1刷 新知识: 解题过程 思考 示例 1: 输入:root [1,2,3,4,5] 输出:3 解释:3 ,取路径 [4,2,1,3] 或…...
Java与数据库
目录 一.本文焦点: 二.数据库常用数据类型 三.对数据库操作 四.对数据库中的表操作 五.条件表达 六. 表查询操作进阶 1.多表连接查询 1)交叉连接查询 2)内连接(取两表交集) 3)外连接 4)…...
MySQL表中数据基本操作
1.表中数据的插入: 1.insert insert [into] table_name [(column [,column]...)] values (value_list) [,(value_list)] ... 创建一张学生表: 1.1单行指定列插入: insert into student (name,qq) values (‘张三’,’1234455’); values左…...
基于GeoTools的GIS专题图自适应边界及高宽等比例生成实践
目录 前言 一、原来的生成方案问题 1、无法自动读取数据的Bounds 2、专题图高宽比例不协调 二、专题图生成优化 1、直接读取矢量数据的Bounds 2、专题图成果抗锯齿 3、专题成果高宽比例自动调节 三、总结 前言 在当今数字化浪潮中,地理信息系统(…...
蓝桥与力扣刷题(蓝桥 数字三角形)
题目: 上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和(路径上的每一步只可沿左斜线向下或右斜线向下走)。 输入描述…...
6. PromQL的metric name(在node exporter复制下来交给AI解释的)
目录 前言: Go 运行时指标: Go 内存统计指标: CPU 指标: 内存指标: 磁盘指标: 网络指标: 系统指标: 前言: 写这个得目的是为了后续方便查询,因为在pro…...
Windows设置目录及子目录大小写不敏感暨git克隆报错同名文件已存在的解决办法
在Windows系统中设置目录及其子目录为大小写不敏感,可以通过以下步骤完成: 步骤说明: 以管理员身份运行命令提示符或PowerShell 右键点击“开始”菜单,选择“命令提示符(管理员)”或“Windows PowerShell&…...
关于tresos Studio(EB)的MCAL配置之GPT
概念 GPT,全称General Purpose Timer,就是个通用定时器,取的名字奇怪了点。定时器是一定要的,要么提供给BSW去使用,要么提供给OS去使用。 配置 General GptDeinitApi控制接口Gpt_DeInit是否启用 GptEnableDisable…...
VScode 中文符号出现黄色方框的解决方法
VScode 中文符号出现黄色方框的解决方法 我的vscode的python多行注释中会将中文字符用黄色方框框处: 只需要打开设置搜索unicode,然后将这一项的勾选取消掉就可以了: 取消之后的效果如下: 另一种情况:中文显示出现黄色…...
WordPress使用(3)
前面文章讲述了如何利用docker进行wordpress系统的安装及相关设置,本文将介绍如何进行站点数据和数据库数据的备份。 1. 备份数据库 # 进入mysql容器内部 docker exec -it mysqlwp bash# 使用mysqldump 命令导出数据库 mysqldump -u root -p wordpress > wordp…...
Shell编程概述与Shell变量
目录 一、Shell编程基础 1.1、Shell脚本使用场景 1.2、Shell脚本的格式 1.3、Shell脚本的执行 1.4、Shell脚本错误调试 二、 重定向与管道符 2.1、重定向 2.2、管道符 三、Shell变量 3.1、变量分类 3.2、特殊符号 3.3、整数运算 3.4、read 3.5、局部变量与全局变量…...
使用QT + 文件IO + 鼠标拖拽事件 + 线程 ,实现大文件的传输
第一题、使用qss,通过线程,使进度条自己动起来 mythread.h #ifndef MYTHREAD_H #define MYTHREAD_H#include <QObject> #include <QThread> #include <QDebug>class mythread : public QThread {Q_OBJECT public:mythread(QObject* …...
【电路笔记】-时序逻辑电路
时序逻辑电路 文章目录 时序逻辑电路1、概述2、时序逻辑的分类3、时序逻辑SR触发器4、NAND门SR触发器5、正NAND门SR触发器6、NOR门SR触发器7、时序逻辑作为开关去抖电路8、门控或时钟SR触发器时序逻辑电路使用触发器作为存储元件,其输出取决于输入状态。 1、概述 与组合逻辑电…...
随机树算法 自动驾驶汽车的路径规划 静态障碍物(Matlab)
随着自动驾驶技术的蓬勃发展,安全、高效的路径规划成为核心挑战之一。快速探索随机树(RRT)算法作为一种强大的路径搜索策略,为自动驾驶汽车在复杂环境下绕过静态障碍物规划合理路径提供了有效解决方案。 RRT 算法基于随机采样思想…...
【AI深度学习基础】PyTorch初探
引言 PyTorch 是由 Facebook 开源的深度学习框架,专门针对 GPU 加速的深度神经网络编程,它的核心概念包括张量(Tensor)、计算图和自动求导机制。PyTorch作为Facebook开源的深度学习框架,凭借其动态计算图和直观的API设…...
探索.NET 10 的新特性,开发效率再升级!
前言 最近,.NET 10 发布啦,作为长期支持(LTS)版本,接下来的 3 年里它会给开发者们稳稳的幸福。今天咱就来唠唠它都带来了哪些超实用的新特性。可在指定链接下载。 新特性 下面将介绍了.NET 10的新特性,其…...
< 自用文儿 > CertBot 申请 SSL 证书 使用 challenge 模式 避开防火墙的阻挡
环境: 腾讯 VPS 腾讯会向你销售 SSL , 这个本是免费的。CertBot 默认申请证书要用到 80 端口,会蹭边什么什么条款,备案法律来阻止80端口的通讯,没有网站也一样被阻拦。 通过腾讯买的域名: bestherbs.cn …...
系统架构评估方法-ATAM方法
架构权衡分析方法(Architecture Tradeoff Analysis Method,ATAM) 是在SAAM的基础上 发展起来的,主要针对性能、实用性、安全性和可修改性,在系统开发之前,对这些质量属性 进行评价和折中。 (1)特定目标。 ATAM的目标是在考虑多个相互影响的质…...
deepseek在pycharm 中的配置和简单应用
对于最常用的调试python脚本开发环境pycharm,如何接入deepseek是我们窥探ai代码编写的第一步,熟悉起来总没坏处。 1、官网安装pycharm社区版(免费),如果需要安装专业版,需要另外找破解码。 2、安装Ollama…...
硬通货用Deekseek做一个Vue.js组件开发的教程
安装 Node.js 与 Vue CLI npm install -g vue/cli vue create my-vue-project cd my-vue-project npm run serve 通过 Vue CLI 可快速生成项目骨架,默认配置适合新手快速上手 目录结构 src/ ├── components/ # 存放组件文件 │ └── …...
类、方法和变量可使用的访问控制符和修饰符的表格展示
1. 类的修饰符 修饰符类别修饰符说明访问控制符public顶级类使用时,对所有包可见。嵌套类也可以使用。默认没有写访问修饰符时,仅在同一包内可见。protected (仅嵌套类)同一包内以及不同包的子类可见。private (仅嵌套类)仅在外部类内部可见。非访问修饰…...
FreeRTOS 任务管理与运行时间统计:API 解析与配置实践
1. FreeRTOS 任务相关 API 函数 1.1 FreeRTOS 任务相关 API 函数介绍 FreeRTOS 提供了一系列 API 来管理任务的状态、优先级和运行信息。以下是任务管理相关的主要 API 及其功能说明: 1.1.1 任务优先级管理 API 函数作用uxTaskPriorityGet()获取任务的当前优先级…...
基于提示驱动的潜在领域泛化的医学图像分类方法(Python实现代码和数据分析)
摘要 医学图像分析中的深度学习模型易受数据集伪影偏差、相机差异、成像设备差异等导致的分布偏移影响,导致在真实临床环境中诊断不可靠。领域泛化(Domain Generalization, DG)方法旨在通过多领域训练提升模型在未知领域的性能,但…...
【C++】5.4.3 范围for语句
范围for语句基本形式: for(声明变量:序列容器) {循环执行语句; } 其中,“序列容器”是指花括号括起来的初始值列表、数组、vector或者string等类型的对象,主要特点是拥有能返回迭代器的 begin() 和 end() 成员; “声明变量”是一个类似声明…...
LeetCode 排序章节
快速排序 简单 LCR 159. 库存管理 III 仓库管理员以数组 stock 形式记录商品库存表,其中 stock[i] 表示对应商品库存余量。请返回库存余量最少的 cnt 个商品余量,返回 顺序不限。 示例 1: 输入:stock [2,5,7,4], cnt 1 输出&a…...
常见的限流算法有哪些?
一、固定窗口算法(Fixed Window) 原理: 将时间划分为固定长度的窗口(如1秒、1分钟),每个窗口内统计请求次数,超过阈值则拒绝后续请求。例如:每秒限流100次,窗口结束后计…...
【pyqt】(十一)单选框
控件-单选框 单选框的类名为QRadioBox,在学习新的控件的时候, 需要掌握的内容主要除了属性之外,其信号触发方法也非常重要。还可以利用Designer来辅助我们进行学习,尤其是利用Designer的属性展示和设置。 单选框中,最…...
深度解析:视频软编码与硬编码的优劣对比
视频编码 一、基本原理与核心技术 压缩原理 通过时空冗余消除实现数据压缩: 空间冗余:利用帧内预测(如DC/角度预测)消除单帧内相邻像素相似性。时间冗余:运动估计与补偿技术(ME/MC)减少连续帧间…...
[Windows] 批量为视频或者音频生成字幕 video subtitle master 1.5.2
参考原文:[Windows] 批量为视频或者音频生成字幕 video subtitle master 1.5.2 Video Subtitle Master 1.5.2 介绍 Video Subtitle Master 1.5.2 是一款功能强大的客户端工具,能够批量为视频或音频生成字幕,还支持批量将字幕翻译成其他语言…...
Lab 3 Page Table
题目链接 我的问题: 1 每个进程的kernel stack是干啥的来着?在何时初始化的? 题目2:A kernel page table per process (hard) 1 一些题目要求 Your first job is to modify the kernel so that every process uses its own c…...
爬虫逆向:脱壳工具 frida-dexdump 的使用详解
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 1. 工具简介1.1 frida-dexdump介绍1.2 frida-dexdump支持场景1.3 frida-dexdump优点1.4 frida-dexdump工具使用方法2. 环境准备3. 安装 frida-dexdump4. 使用步骤4.1 步骤一:连接 Android 设备4.1 步骤二:安装目标应用…...
图论-腐烂的橘子
994.腐烂的橘子 在给定的 m x n 网格 grid 中,每个单元格可以有以下三个值之一:值 0 代表空单元格; 值 1 代表新鲜橘子; 值 2 代表腐烂的橘子。 每分钟,腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。返回 直到…...
FPGA-DE2115开发板实现4位全加器、3-8译码器。
文章目录 一、安装quartus二、4位全加器三、3-8译码器(8段数码管)四、参考文章 一、安装quartus 安装quartus参考文章:Quartus Prime 18.0与ModelSim的安装 Quartus II 18.0安装教程(非常详细)从零基础入门到精通&…...
【leetcode hot 100 48】旋转图像
方法一:(原地旋转)对于矩阵中第 i 行的第 j 个元素,在旋转后,它出现在倒数第 i 列的第 j 个位置。matrix[row][col]在旋转后的新位置为matrix[col][n−row−1]。只要旋转四次就能回到原点。 class Solution {public vo…...
TWind 的黑马点评随笔
TWind 的黑马点评随笔 目前是把黑马点评的技术部分完全做完了,不能说吃得饱饱,也算个半饱吧。 黑马点评严格来说不算项目,因为它给的前端过于垃圾,内容又重在Redis,所以称之为Redis练习貌似跟贴切。 尽管如…...