在使用 Java 操作数据库前,首先要确保开发环境已正确配置。你需要安装 JDK(Java Development Kit),同时根据不同的数据库类型,引入对应的 JDBC(Java Database Connectivity)驱动。例如,连接 MySQL 数据库,需要下载并导入 MySQL Connector/J 驱动;连接 Oracle 数据库,则要获取 Oracle JDBC 驱动。将下载好的驱动 jar 包添加到项目的依赖中,Maven 项目可在pom.xml文件中添加依赖坐标,Gradle 项目则在build.gradle文件中配置。
以 MySQL 驱动为例,Maven 项目的pom.xml配置如下:
TypeScript取消自动换行复制
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>二、建立数据库连接
Java 中通过DriverManager类和Connection接口来建立与数据库的连接。以下是连接 MySQL 数据库的示例代码:
TypeScript取消自动换行复制
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DatabaseConnection {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/your_database_name";
String username = "your_username";
String password = "your_password";
try (Connection connection = DriverManager.getConnection(url, username, password)) {
if (connection != null) {
System.out.println("成功连接到数据库!");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}在上述代码中,url指定了数据库的地址、端口和数据库名称;username和password分别为数据库的登录用户名和密码。DriverManager.getConnection()方法用于尝试建立连接,使用try-with-resources语句可以确保连接在使用完毕后自动关闭,避免资源泄漏。
执行 SQL 语句:增删改查操作
3.1 查询操作(SELECT)
使用Statement或PreparedStatement接口执行查询语句。PreparedStatement相较于Statement,具有更好的安全性,能有效防止 SQL 注入攻击。以下是使用PreparedStatement执行查询的示例:
TypeScript取消自动换行复制
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class DatabaseQuery {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/your_database_name";
String username = "your_username";
String password = "your_password";
String sql = "SELECT * FROM your_table_name WHERE id = ?";
try (Connection connection = DriverManager.getConnection(url, username, password);
PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
preparedStatement.setInt(1, 1); // 设置参数值,假设id为整数类型
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println("ID: " + id + ", Name: " + name);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}在上述代码中,?为占位符,通过setInt()等方法设置参数值,executeQuery()方法执行查询并返回ResultSet对象,通过ResultSet的相关方法获取查询结果。
3.2 插入操作(insert)
使用PreparedStatement执行插入语句,示例如下:
TypeScript取消自动换行复制
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class DatabaseInsert {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/your_database_name";
String username = "your_username";
String password = "your_password";
String sql = "insert INTO your_table_name (name, age) VALUES (?, ?)";
try (Connection connection = DriverManager.getConnection(url, username, password);
PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
preparedStatement.setString(1, "John");
preparedStatement.setInt(2, 30);
int rowsAffected = preparedStatement.executeUpdate();
if (rowsAffected > 0) {
System.out.println("数据插入成功!");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}executeUpdate()方法用于执行增删改操作,返回受影响的行数。
3.3 更新操作(UPDATE)
更新数据的示例代码如下:
TypeScript取消自动换行复制
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class DatabaseUpdate {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/your_database_name";
String username = "your_username";
String password = "your_password";
String sql = "UPDATE your_table_name SET age = ? WHERE name = ?";
try (Connection connection = DriverManager.getConnection(url, username, password);
PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
preparedStatement.setInt(1, 31);
preparedStatement.setString(2, "John");
int rowsAffected = preparedStatement.executeUpdate();
if (rowsAffected > 0) {
System.out.println("数据更新成功!");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}3.4 删除操作(delete)
删除数据的代码示例:
TypeScript取消自动换行复制
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class DatabaseDelete {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/your_database_name";
String username = "your_username";
String password = "your_password";
String sql = "delete FROM your_table_name WHERE id = ?";
try (Connection connection = DriverManager.getConnection(url, username, password);
PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
preparedStatement.setInt(1, 1);
int rowsAffected = preparedStatement.executeUpdate();
if (rowsAffected > 0) {
System.out.println("数据删除成功!");
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
数据库事务处理
数据库事务具有原子性、一致性、隔离性和持久性(ACID)特性。在 Java 中,通过Connection接口的相关方法来控制事务。示例代码如下:
TypeScript取消自动换行复制
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class DatabaseTransaction {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/your_database_name";
String username = "your_username";
String password = "your_password";
try (Connection connection = DriverManager.getConnection(url, username, password)) {
connection.setAutoCommit(false); // 关闭自动提交,开启事务
String sql1 = "UPDATE account SET balance = balance - 100 WHERE id = 1";
String sql2 = "UPDATE account SET balance = balance + 100 WHERE id = 2";
try (PreparedStatement statement1 = connection.prepareStatement(sql1);
PreparedStatement statement2 = connection.prepareStatement(sql2)) {
statement1.executeUpdate();
statement2.executeUpdate();
connection.commit(); // 提交事务
System.out.println("事务处理成功!");
} catch (SQLException e) {
connection.rollback(); // 回滚事务
e.printStackTrace();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}在上述代码中,通过setAutoCommit(false)关闭自动提交开启事务,commit()方法提交事务,rollback()方法回滚事务,确保数据的一致性和完整性。
资源释放与异常处理
在 Java 数据库编程中,及时释放数据库连接、语句对象(Statement或PreparedStatement)和结果集对象(ResultSet)至关重要。使用try-with-resources语句可以方便地实现资源的自动关闭。对于异常处理,捕获SQLException并进行适当处理,例如记录日志或向用户返回友好的错误提示,有助于提高程序的健壮性和可维护性。