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

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 的架构分为两层:

  1. 应用程序层:开发者编写的 Java 代码。
  2. 驱动层:数据库厂商提供的 JDBC 驱动(如 mysql-connector-java)。

核心接口与类

组件作用
DriverManager管理数据库驱动,建立与数据库的连接
Connection表示与数据库的会话,用于管理事务和创建语句对象
Statement执行静态 SQL 语句(如 SELECT, INSERT
PreparedStatement预编译 SQL 语句,防止 SQL 注入,提升性能
CallableStatement调用数据库存储过程
ResultSet封装查询结果集,支持遍历和读取数据

三、JDBC 工作流程详解

6 步完成数据库操作

注册驱动
建立连接
创建Statement
执行SQL
处理结果
关闭资源
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

根据需求选择 StatementPreparedStatement

// 静态 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:为什么前者更优秀?

对比项StatementPreparedStatement
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 操作数据库的标准,通过驱动实现跨数据库兼容。
  • PreparedStatementStatement 更安全高效。
  • 事务和连接池是提升性能与稳定性的关键。

掌握 JDBC,您已打通 Java 与数据库的桥梁! 🚀

相关文章:

JDBC 完全指南:掌握 Java 数据库交互的核心技术

JDBC 完全指南&#xff1a;掌握 Java 数据库交互的核心技术 一、JDBC 是什么&#xff1f;为什么它如此重要&#xff1f; JDBC&#xff08;Java Database Connectivity&#xff09;是 Java 语言中用于连接和操作关系型数据库的标准 API。它允许开发者通过统一的接口访问不同的数…...

Vue父子组件传递笔记

Vue父子组件传递笔记 props 父组件向子组件进行传值 &#xff08;1&#xff09;在父组件APP.vue <template><div> <!-- 给子组件Child.vue传递以msg的信号&#xff0c;传递的信息内容为messages --><Child :msg"messages"></Child>…...

文件上传漏洞与phpcms漏洞安全分析

目录 1. 文件上传漏洞简介 2. 文件上传漏洞的危害 3. 文件上传漏洞的触发条件 1. 文件必须能被服务器解析执行 2. 上传目录必须支持代码执行 3. 需要能访问上传的文件 4. 例外情况&#xff1a;非脚本文件也可能被执行 4. 常见的攻击手法 4.1 直接上传恶意文件 4.2 文件…...

【deepseek】辅助思考生物学问题:ICImapping构建遗传图谱gap较大

基于ICImapping构建遗传图谱的常见问题与解答 问题一&#xff1a;染色体两端标记间遗传距离gap较大 答疑一 标记密度不足&#xff08;如芯片设计时分布不均&#xff09;重组概率低基因组结构变异软件算法限制 Deepseek的解释 #### 1. **染色体末端的重组率较低** - **现象*…...

linux磁盘非lvm分区

linux磁盘非lvm分区 类似于windows划分C盘、D盘&#xff0c;并且不需要多个磁盘空间合一 图形化直接分区 通过gparted 这个提供直观的图形化分区&#xff0c;类似windows的磁盘管理工具 下载方式&#xff1a; 乌班图/debian系列&#xff1a; sudo apt install gparted红帽…...

Windows下sql server2012安装流程

准备工作 确认系统要求&#xff1a;确保 Windows 系统为 Windows 7 或更高版本&#xff0c;且为 64 位操作系统&#xff0c;CPU 在 2GHz 以上&#xff0c;内存 4GB 或更高。 下载安装包&#xff1a;从微软官方网站或其他可靠渠道下载 SQL Server 2012 安装包。 关闭相关软件&am…...

css之英文换行样式

在 CSS 中&#xff0c;要实现英文文本自动换行但不从单词中间断开的效果&#xff0c;可以使用 word-wrap 或 overflow-wrap 属性。以下是相关的 CSS 属性和它们的配置&#xff1a; 使用 overflow-wrap 或 word-wrap /* This property is used to handle word breaking */ .wo…...

绝美焦糖暖色调复古风景画面Lr调色教程,手机滤镜PS+Lightroom预设下载!

调色教程 通过 Lr 软件丰富的工具和功能&#xff0c;对风景照片在色彩、影调等方面进行调整。例如利用基本参数调整选项&#xff0c;精准控制照片亮度、对比度、色温、色调等基础要素&#xff1b;运用 HSL 面板可对不同色彩的色相、饱和度以及明亮度进行单独调节&#xff1b;利…...

文件解析:doc、docx、pdf

1.doc解析 ubuntu/debian系统应先安装工具 apt-get install python-dev libxml2-dev libxslt1-dev antiword unrtf poppler-utils pstotext tesseract-ocr \ flac ffmpeg lame libmad0 libsox-fmt-mp3 sox libjpeg-dev swig pip install textract解析&#xff1a; import te…...

计算机网络基础:VLAN(虚拟局域网)

1. VLAN 虚拟局域网&#xff1a;可以用来隔离广播 广播和广播域&#xff1a; arp 出不了路由器&#xff0c;只能攻击内网 路由器可以隔离广播&#xff08;物理隔离&#xff09;缺点是成本高、不灵活 2. VLAN 隔离广播 静态VLAN&#xff1a;基于交换机端口号划分 动态VLAN&am…...

C++学习笔记(十一)——循环结构

循环结构的作用 循环结构用于重复执行某一代码块&#xff0c;直到满足特定条件后退出循环。 C 提供了以下三种循环结构&#xff1a; for 循环&#xff08;确定次数的循环&#xff09;while 循环&#xff08;条件控制的循环&#xff09;do-while 循环&#xff08;至少执行一次的…...

【C++】二叉树相关算法题

一、根据二叉树创建字符串 题目描述&#xff1a; 给你二叉树的根节点 root &#xff0c;请你采用前序遍历的方式&#xff0c;将二叉树转化为一个由括号和整数组成的字符串&#xff0c;返回构造出的字符串。 空节点使用一对空括号对 “()” 表示&#xff0c;转化后需要省略所有…...

物联网IoT系列之MQTT协议基础知识

文章目录 物联网IoT系列之MQTT协议基础知识物联网IoT是什么&#xff1f;什么是MQTT&#xff1f;为什么说MQTT是适用于物联网的协议&#xff1f;MQTT工作原理核心组件核心机制 MQTT工作流程1. 建立连接2. 发布和订阅3. 消息确认4. 断开连接 MQTT工作流程图MQTT在物联网中的应用 …...

【大学生体质】智能 AI 旅游推荐平台(Vue+SpringBoot3)-完整部署教程

智能 AI 旅游推荐平台开源文档 项目前端地址 ☀️项目介绍 智能 AI 旅游推荐平台&#xff08;Intelligent AI Travel Recommendation Platform&#xff09;是一个利用 AI 模型和数据分析为用户提供个性化旅游路线推荐、景点评分、旅游攻略分享等功能的综合性系统。该系统融合…...

【Node.js入门笔记1---初始Node.js)】

Node.js入门笔记1 初始Node.js1.Node.js简介2.Node.js中js的运行环境3.Node.js 可以做什么4.Node.js 怎么学 初始Node.js 1.Node.js简介 Node.js 是一个基于 Chrome V8 引擎 的 JavaScript 运行时环境&#xff0c;用于在服务器端运行 JavaScript 代码。它让开发者可以用 Java…...

自学Java-JavaSE基础加强(多线程)

自学Java-JavaSE基础加强&#xff08;多线程&#xff09; 一、创建线程1、方式一&#xff1a;继承Thread类小结 2、方式二&#xff1a;实现Runnable接口小结 3、方式三&#xff1a;实现Callable接口4、小结 二、线程的常用方法三、线程安全1、认识线程安全2、模拟线程安全问题3…...

数字后端培训实战项目六大典型后端实现案例

Q1:请教一个问题&#xff0c;cts.sdc和func.sdc在innovus用如何切换&#xff1f;在flow哪一步切换输入cts.sdc&#xff1f;哪一步切换到func.sdc&#xff0c;具体如何操作&#xff1f; 这个学员其实就是在问使用分段长clock tree时具体的flow流程是怎么样的&#xff1f;针对时…...

安卓免费多功能工具:一站式解决 PDF 阅读、编辑、转换等需求

软件介绍 今天要给大家介绍一款功能强大的PDF处理软件——PDFgear Android版。它是专为安卓设备打造的&#xff0c;完全免费&#xff0c;无需破解和激活就能使用。 此前&#xff0c;我们分享过它的桌面端&#xff0c;收获了大家的一致好评。今天要着重介绍的手机APP版本&…...

diffuser库使用本地模型生成图像

实验目的 使用diffuser库生成图像的文章是很多的&#xff0c;使用方法也并不复杂&#xff0c;安装库后调用现成的模型和接口即可&#xff0c;但是因为网络原因&#xff0c;模型下载总会遇到问题&#xff0c;对于使用服务器的研究者来说&#xff0c;挂梯子并不可行&#xff0c;…...

递归—基础算法

#基线条件和递归条件 #每个递归函数都有两部分&#xff1a;基线条件和递归条件。递归条件指的是函数调用自己&#xff0c;而基线条件则指的是函数不再调用自己&#xff0c;从而避免形成无限循环。 #栈&#xff1a;栈是一种数据结构&#xff0c;它是一种线性数据结构&#xff0c…...

龙虎榜——20250610

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

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试

作者&#xff1a;Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位&#xff1a;中南大学地球科学与信息物理学院论文标题&#xff1a;BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接&#xff1a;https://arxiv.…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

DBAPI如何优雅的获取单条数据

API如何优雅的获取单条数据 案例一 对于查询类API&#xff0c;查询的是单条数据&#xff0c;比如根据主键ID查询用户信息&#xff0c;sql如下&#xff1a; select id, name, age from user where id #{id}API默认返回的数据格式是多条的&#xff0c;如下&#xff1a; {&qu…...

CMake 从 GitHub 下载第三方库并使用

有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...

关于 WASM:1. WASM 基础原理

一、WASM 简介 1.1 WebAssembly 是什么&#xff1f; WebAssembly&#xff08;WASM&#xff09; 是一种能在现代浏览器中高效运行的二进制指令格式&#xff0c;它不是传统的编程语言&#xff0c;而是一种 低级字节码格式&#xff0c;可由高级语言&#xff08;如 C、C、Rust&am…...

IoT/HCIP实验-3/LiteOS操作系统内核实验(任务、内存、信号量、CMSIS..)

文章目录 概述HelloWorld 工程C/C配置编译器主配置Makefile脚本烧录器主配置运行结果程序调用栈 任务管理实验实验结果osal 系统适配层osal_task_create 其他实验实验源码内存管理实验互斥锁实验信号量实验 CMISIS接口实验还是得JlINKCMSIS 简介LiteOS->CMSIS任务间消息交互…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...