JDBC查询操作

JDBC查询操作

2026年5月19日·#javawebai/后端基础Java/JDBC/SQL/数据库·592 字 3 分钟
浏览量加载中...
AI 摘要- DeepSeek

基于JDBC实现数据库查询操作,包括预编译SQL、ResultSet解析与SQL注入防护。

JDBC查询操作#

定义#

JDBC查询操作通过 PreparedStatement 执行 SELECT 语句,返回 ResultSet 结果集,遍历解析后获取数据。

语法/用法#

核心代码流程#

// 1. 获取连接
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/web", "root", "1234");
// 2. 创建预编译的PreparedStatement对象
PreparedStatement pstmt = conn.prepareStatement(
"SELECT * FROM user WHERE username = ? AND password = ?");
// 3. 设置参数
pstmt.setString(1, "daqiao");
pstmt.setString(2, "123456");
// 4. 执行查询
ResultSet rs = pstmt.executeQuery();
// 5. 处理结果集
while (rs.next()) {
int id = rs.getInt("id");
String username = rs.getString("username");
String password = rs.getString("password");
String name = rs.getString("name");
int age = rs.getInt("age");
}
// 6. 关闭资源
rs.close();
pstmt.close();
conn.close();

参数化测试版本#

@ParameterizedTest
@CsvSource({"daqiao,123456"})
public void testJdbc(String _username, String _password) throws Exception {
Connection conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/web", "root", "1234");
PreparedStatement pstmt = conn.prepareStatement(
"SELECT * FROM user WHERE username = ? AND password = ?");
pstmt.setString(1, _username);
pstmt.setString(2, _password);
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
// 解析结果...
}
rs.close();
pstmt.close();
conn.close();
}

Maven依赖#

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.30</version>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>5.9.3</version>
<scope>test</scope>
</dependency>

ResultSet 详解#

ResultSet(结果集对象)封装了DQL查询语句查询的结果。

方法说明
next()将光标从当前位置向前移动一行,返回 true(有效行)/ false(无效行)
getXxx(列编号)按列索引获取数据
getXxx("列名")按列名获取数据(推荐)

解析步骤:光标初始指向第0行 → 每次 next() 前移一行 → 有数据则用 getXxx 取值。

预编译SQL#

两种风格对比#

风格示例特点
静态SQL"SELECT * FROM user WHERE username = 'daqiao'"参数硬编码,不安全
预编译SQL"SELECT * FROM user WHERE username = ?"参数动态传递,推荐

SQL注入#

SQL注入:通过控制输入来修改事先定义好的SQL语句,以达到执行代码对服务器进行攻击的方法。

典型攻击输入:密码输入 ' or '1' = '1,拼接后SQL变为:

SELECT * FROM user WHERE username = 'xxx' AND password = '' or '1' = '1'

or '1'='1' 恒为真,导致绕过登录验证。

解决方案#

预编译SQL将 ' or '1'='1 整体作为字符串参数处理(转义为普通字符串),而非SQL逻辑的一部分,从而杜绝SQL注入。

性能优势#

预编译SQL在数据库端可缓存执行计划,同一SQL模板多次执行时性能更高。

注意事项#

  • 始终使用预编译SQL(PreparedStatement),禁止直接拼接SQL字符串。
  • ResultSet、PreparedStatement、Connection 使用完毕后必须关闭,推荐使用 try-with-resources。
  • JDBC执行DQL语句用 executeQuery(),返回 ResultSet。

评论区

[ 标签 ]
# AI37# AI 编程2# AI工具1# AI绘图1# AI辅助开发2# Ajax7# Apifox1# AstrBot3# Astro2# CC Switch1# CDN2# Claude Code1# claudecode2# ClaudeCode1# Cloudflare2# CloudFlare2# CloudFlare-ImgBed3# coc4# CSS10# DeepSeek6# deepseek2# DELETE1# Docker5# EdgeOne3# Gist1# git1# GitHub1# hexo-circle-of-friends1# HTML9# HTTP10# ImageManager1# Java23# java13# JavaScript11# JavaWeb113# JDBC7# JSON2# JUnit1# LangChain25# Linux4# Logback1# Maven17# Muse Spark1# Mybatis1# MyBatis18# MySQL45# MySql1# NapCat1# Node.js1# obsidian2# Obsidian5# OpenCode4# ORM1# PathVariable1# PicGo1# PyCharm1# Python70# RequestBody1# RequestMapping1# RESTful风格1# skills1# Slf4j1# SpringBoot37# SpringMVC5# SQL2# Streamlit5# Svelte2# TailwindCSS1# Telegram3# Tlias2# Vercel1# vscode2# Vue20# Waline3# Web3# WebDAV1# Web基础6# Web开发6# WinSCP1# YAML1# 三层架构1# 中二宣言1# 书籍1# 使用文档10# 写作1# 函数2# 刷步数1# 前端52# 动态1# 动漫1# 包1# 单词2# 博客8# 博客工作流1# 博客开发2# 参数接收1# 友链1# 反思2# 后端48# 图床6# 地图1# 备份2# 大模型1# 奇思妙想1# 存储1# 学习方法6# 学校1# 宝塔面板3# 宝宝10# 实战4# 对象1# 导航栏1# 工具2# 布局2# 开发1# 开发工具1# 开发规范1# 开心1# 异常处理1# 影视2# 微信1# 性能优化2# 总结1# 想法15# 感受1# 感悟11# 指南1# 提示词工程2# 插件5# 故障排除1# 效率工具2# 教程10# 数据分析9# 数据库27# 数据结构1# 文件操作2# 斩神1# 日常95# 日志框架1# 朋友圈1# 朱元璋1# 模块1# 模板1# 正则表达式2# 测试3# 游戏2# 爬虫7# 生活迁移1# 电影2# 电脑1# 碎碎念1# 视觉识别1# 类1# 类型注解1# 网络基础2# 网络教室1# 羊毛2# 脚本2# 脚本工具1# 自动化2# 蓝奏云1# 表单1# 订阅推荐2# 记录2# 评论系统1# 词根1# 词缀1# 说说1# 足迹1# 跑步2# 路径参数1# 转载2# 运动1# 部署11# 部落冲突1# 配置1# 随机图1# 面向对象5# 音乐3# 音标1# 项目实战11# 饮食1# 驼峰命名1# 高德地图1
[ 公告 ]

如果你喜欢,那么欢迎来到我的世界!

了解更多
[ 音乐 ]
封面

音乐

暂未播放

0:000:00
暂无歌词
找不到相关结果。
[ contents ]
[ 全部文章 ]