Java JDBC 数据库连接
JDBC(Java Database Connectivity)是 Java 访问数据库的标准 API。理解 JDBC 的使用是进行数据库应用开发的基础。本章将详细介绍 Java 中的 JDBC 使用。
JDBC 驱动与连接
JDBC 概述
JDBC是 Java 访问数据库的标准接口,提供了统一的数据库访 问方式。
JDBC 架构:
Java 应用程序
↓
JDBC API
↓
JDBC 驱动
↓
数据库
JDBC 驱动类型
四种 JDBC 驱动类型:
- Type 1:JDBC-ODBC Bridge(已过时)
- Type 2:Native API Driver
- Type 3:Network Protocol Driver
- Type 4:Pure Java Driver(推荐)
加载驱动
import java.sql.*;
// 方式 1:显式加载(Java 5+ 可以省略)
Class.forName("com.mysql.cj.jdbc.Driver");
// 方式 2:使用 DriverManager(Java 6+ 自动加载)
// 不需要显式加载
建立连接
import java.sql.*;
// 数据库连接 URL
String url = "jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC";
String username = "root";
String password = "password";
// 建立连接
Connection connection = DriverManager.getConnection(url, username, password);
// 或使用 Properties
Properties props = new Properties();
props.setProperty("user", username);
props.setProperty("password", password);
Connection connection2 = DriverManager.getConnection(url, props);
常用数据库连接 URL
// MySQL
String mysqlUrl = "jdbc:mysql://localhost:3306/mydb";
// PostgreSQL
String pgUrl = "jdbc:postgresql://localhost:5432/mydb";
// SQLite
String sqliteUrl = "jdbc:sqlite:mydb.db";
// Oracle
String oracleUrl = "jdbc:oracle:thin:@localhost:1521:orcl";
// SQL Server
String sqlServerUrl = "jdbc:sqlserver://localhost:1433;databaseName=mydb";
SQL 执行与结果查询
Statement
Statement 用于执行静态 SQL 语句。
Connection connection = DriverManager.getConnection(url, username, password);
Statement statement = connection.createStatement();
// 执行查询
ResultSet rs = statement.executeQuery("SELECT * FROM users");
// 执行更新
int rows = statement.executeUpdate("UPDATE users SET name='张三' WHERE id=1");
// 执行任意 SQL
boolean hasResult = statement.execute("SELECT * FROM users");
statement.close();
connection.close();
PreparedStatement(推荐)
PreparedStatement 用于执行预编译的 SQL 语句,防止 SQL 注入。
// 使用占位符
String sql = "SELECT * FROM users WHERE id = ? AND name = ?";
PreparedStatement pstmt = connection.prepareStatement(sql);
// 设置参数
pstmt.setInt(1, 1);
pstmt.setString(2, "张三");
// 执行查询
ResultSet rs = pstmt.executeQuery();
// 执行更新
String updateSql = "UPDATE users SET name = ? WHERE id = ?";
PreparedStatement updateStmt = connection.prepareStatement(updateSql);
updateStmt.setString(1, "李四");
updateStmt.setInt(2, 1);
int rows = updateStmt.executeUpdate();
pstmt.close();
优势:
- 防止 SQL 注入
- 性能更好(预编译)
- 代码更清晰
ResultSet
ResultSet 表示查询结果集。
String sql = "SELECT id, name, age FROM users";
PreparedStatement pstmt = connection.prepareStatement(sql);
ResultSet rs = pstmt.executeQuery();
// 遍历结果集
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
System.out.println("ID: " + id + ", Name: " + name + ", Age: " + age);
}
// 或使用索引
while (rs.next()) {
int id = rs.getInt(1);
String name = rs.getString(2);
int age = rs.getInt(3);
}
rs.close();
ResultSet 的常用方法
// 移动光标
rs.next(); // 下一行
rs.previous(); // 上一行
rs.first(); // 第一行
rs.last(); // 最后一行
rs.absolute(5); // 移动到第 5 行
// 获取数据
rs.getInt("id");
rs.getString("name");
rs.getDouble("price");
rs.getDate("birthday");
rs.getTimestamp("created_at");
// 检查
boolean hasNext = rs.next();
boolean isFirst = rs.isFirst();
boolean isLast = rs.isLast();