数据库连接准备
在使用Java建立数据库之前,需要完成环境准备工作,确保已安装JDK(建议版本为8或以上)并配置好环境变量,根据目标数据库类型(如MySQL、PostgreSQL、SQLite等)下载对应的JDBC驱动程序,例如MySQL的Connector/J,将下载的JAR文件添加到项目的类路径中,若使用Maven或Gradle,可在pom.xml或build.gradle文件中添加依赖坐标,MySQL的Maven依赖为:

<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
需确认数据库服务已启动,并获取连接所需的URL、用户名、密码等信息,这些参数将用于后续的数据库连接操作。
加载JDBC驱动与建立连接
Java通过JDBC(Java Database Connectivity)规范与数据库交互,第一步是加载并注册数据库驱动,以MySQL为例,通过Class.forName()方法加载驱动类:
Class.forName("com.mysql.cj.jdbc.Driver");
加载驱动后,使用DriverManager.getConnection()方法建立数据库连接,该方法需传入数据库URL、用户名和密码,
String url = "jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC"; String username = "root"; String password = "password"; Connection connection = DriverManager.getConnection(url, username, password);
URL格式为jdbc:数据库类型://主机名:端口/数据库名?参数,参数部分可根据需求调整(如时区、SSL配置等),连接成功后,Connection对象代表与数据库的会话,后续所有操作均基于此对象。
创建数据库与表
若数据库不存在,需先通过SQL语句创建,可通过Connection.createStatement()执行DDL(数据定义语言)语句,创建名为userdb的数据库:
Statement statement = connection.createStatement(); String createDatabaseSQL = "CREATE DATABASE IF NOT EXISTS userdb"; statement.executeUpdate(createDatabaseSQL);
创建数据库后,需选择该数据库并创建数据表,创建users表,包含id、username、email等字段:
statement.executeUpdate("USE userdb");
String createTableSQL = "CREATE TABLE IF NOT EXISTS users (" +
"id INT AUTO_INCREMENT PRIMARY KEY," +
"username VARCHAR(50) NOT NULL UNIQUE," +
"email VARCHAR(100) NOT NULL," +
"created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP" +
")";
statement.executeUpdate(createTableSQL);
执行executeUpdate()方法可创建、修改或删除数据库对象,返回受影响的行数(此处通常为0或1)。

执行SQL操作
数据库建好后,可执行增删改查(CRUD)操作,根据SQL类型选择不同方法:executeUpdate()用于INSERT、UPDATE、DELETE等写操作,executeQuery()用于SELECT查询操作。
插入数据
使用PreparedStatement可防止SQL注入,推荐用于动态SQL语句,向users表插入数据:
String insertSQL = "INSERT INTO users (username, email) VALUES (?, ?)";
PreparedStatement preparedStatement = connection.prepareStatement(insertSQL);
preparedStatement.setString(1, "john_doe");
preparedStatement.setString(2, "john@example.com");
int affectedRows = preparedStatement.executeUpdate();
System.out.println("插入成功,影响行数:" + affectedRows);
PreparedStatement通过占位符参数化查询,setXxx()方法设置参数类型(如setString、setInt等)。
查询数据
查询操作需使用executeQuery(),并通过ResultSet处理结果集,查询所有用户:
String selectSQL = "SELECT id, username, email FROM users";
ResultSet resultSet = statement.executeQuery(selectSQL);
while (resultSet.next()) {
int id = resultSet.getInt("id");
String username = resultSet.getString("username");
String email = resultSet.getString("email");
System.out.printf("ID: %d, 用户名: %s, 邮箱: %s%n", id, username, email);
}
ResultSet的next()方法移动游标至下一行,getXxx()方法根据列名或索引获取值。
更新与删除数据
更新数据示例:
String updateSQL = "UPDATE users SET email = ? WHERE username = ?"; preparedStatement = connection.prepareStatement(updateSQL); preparedStatement.setString(1, "new_john@example.com"); preparedStatement.setString(2, "john_doe"); preparedStatement.executeUpdate();
删除数据示例:

String deleteSQL = "DELETE FROM users WHERE username = ?"; preparedStatement = connection.prepareStatement(deleteSQL); preparedStatement.setString(1, "john_doe"); preparedStatement.executeUpdate();
事务管理
事务确保数据库操作的原子性,要么全部成功,要么全部回滚,默认情况下,JDBC每条SQL语句是一个独立事务,可通过Connection对象手动控制事务:
try {
connection.setAutoCommit(false); // 关闭自动提交
// 执行多个SQL操作
statement.executeUpdate("INSERT INTO users (username, email) VALUES ('alice', 'alice@example.com')");
statement.executeUpdate("UPDATE accounts SET balance = balance - 100 WHERE user_id = 1");
connection.commit(); // 提交事务
} catch (SQLException e) {
connection.rollback(); // 回滚事务
e.printStackTrace();
} finally {
connection.setAutoCommit(true); // 恢复自动提交
}
事务管理需确保异常时调用rollback(),成功时调用commit(),避免数据不一致。
资源释放与最佳实践
数据库连接、Statement、PreparedStatement和ResultSet等资源属于JDBC对象,需显式释放以避免内存泄漏,推荐使用try-with-resources语句自动关闭资源:
try (Connection connection = DriverManager.getConnection(url, username, password);
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("SELECT * FROM users")) {
// 处理结果集
} catch (SQLException e) {
e.printStackTrace();
}
try-with-resources会自动实现Closeable接口的资源关闭,无需手动调用close(),需注意以下最佳实践:
- 连接池优化:使用HikariCP、Druid等连接池管理数据库连接,避免频繁创建和销毁连接。
- SQL注入防护:始终使用
PreparedStatement拼接动态参数,而非直接拼接SQL字符串。 - 异常处理:捕获
SQLException并记录日志,避免程序因异常中断。 - 配置外部化:将数据库URL、用户名、密码等敏感信息存储在配置文件中(如
application.properties),而非硬编码在代码中。
通过以上步骤,即可使用Java完成数据库的建立、连接及基本操作,实际开发中,还需结合具体业务需求设计数据库结构,并优化SQL语句性能,确保系统稳定高效运行。
















