Chapter 105: What is JDBC? in Java
JDBC (Java Database Connectivity) is a vendor-neutral API in the JDK (java.sql and javax.sql) for talking to relational databases. Your code speaks Connection, Statement, PreparedStatement, and ResultSet; a driver JAR translates those calls into wire protocol the database understands.
Chapter 65 already showed JDBC inside a tiny HTTP API. These chapters slow down each moving part.
1. Topic title
JDBC: contracts in java.sql + a driver implementation + a JDBC URL that picks the database
2. What it means
Typical flow:
- Open a
Connectionto a server using ajdbc:… URL. - Create a
StatementorPreparedStatementwith SQL text. - For queries, walk a
ResultSetrow by row; for insert/update/delete, inspect update counts or generated keys.
SQLException (and subclasses like SQLTimeoutException) bundle SQLState, error codes, and chained causes—always log or wrap with context (which query, which tenant).
3. Why it is used
Portable SQL access without locking your domain model to one vendor’s proprietary SDK.
Foundation for connection pools (DataSource), ORMs, and Spring—they still sit on JDBC somewhere.
4. Mental sketch
JDBC is a universal remote control; each database ships the correct handset firmware (driver). Your buttons (prepare, bind, execute) stay the same; the infrared signals differ.
5. Java code example
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
import java.sql.ResultSet;
public class JdbcHelloOutline {
public static void main(String[] args) {
String url = System.getenv().getOrDefault("JDBC_URL", "jdbc:postgresql://localhost:5432/demo");
String user = System.getenv().getOrDefault("JDBC_USER", "demo");
String password = System.getenv().getOrDefault("JDBC_PASSWORD", "demo");
try (Connection conn = DriverManager.getConnection(url, user, password);
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("SELECT 1 AS one")) {
if (rs.next()) {
System.out.println(rs.getInt("one"));
}
} catch (SQLException e) {
System.err.println("sql error: " + e.getMessage());
}
}
}Compile and run with postgresql.jar on the classpath—same habit as Chapter 65.
6. Explanation of code
try-with-resources closes Connection, Statement, and ResultSet in safe order even if executeQuery throws partway through.
SELECT 1 is a smoke test—no tables required—verifies reachability and auth.
7. Common mistakes
Putting passwords in source—use environment variables, secrets managers, or IDE run configs not committed to git.
Treating JDBC as “magic strings only”—extract SQL to constants or repository methods so reviews stay possible.
8. Best practices
Decide one canonical DataSource (later chapter patterns / frameworks) per application instead of scattering DriverManager calls—tests can swap in H2 or Testcontainers.
Time zones and timestamps deserve explicit handling—Timestamp vs Instant mental map saves DST pain.
9. Small practice task
Run the outline against a real Postgres you control; set JDBC_* env vars; confirm 1 prints—then break the password on purpose and read the full SQLException chain in the log.
Beginner tip
If the error says “No suitable driver”, your classpath is missing the vendor JAR or the URL prefix does not match the driver you loaded—fix classpath before rewriting SQL.