JDBC讲解(第二篇)
上篇主要讲解了JDBC的介绍与下载驱动的方式,这篇主要讲解JDBC的运用。
API主要类/接口的功能
1.与数据库建立连接
1.DriverManager类:装载驱动程序,并为了创建新的数据库连接提供支持。
2.Connection接口:负责连接数据库并担任传送数据的任务。
2.发送SQL语句
1.Statement接口:由Connection产生,负责执行SQL语句。
2.PreparedStatement接口:Statement的子接口,也由Connection产生,同样负责执行SQL语句。与Statement接口相比,PrearedStatement接口具有高安全性、高性能、高可读性和高可维护性等优点。
3.返回处理结果
ResultSet接口:负责保存和处理Statement执行后产生的查询结果。
使用Statement的作用
Statement
是 Java 数据库连接(JDBC)API 中的一个核心接口,它用于执行静态的 SQL 语句并返回结果。以下是 Statement
的主要作用和特点:
主要作用
- 执行 SQL 查询:
- 使用
executeQuery(String sql)
方法执行 SQL 查询语句(如SELECT
),并返回一个ResultSet
对象,该对象包含查询结果。
- 使用
- 执行 SQL 更新:
- 使用
executeUpdate(String sql)
方法执行 SQL 更新语句(如INSERT
、UPDATE
、DELETE
),并返回一个整数,表示受影响的行数。
- 使用
- 执行任何 SQL 语句:
- 使用
execute(String sql)
方法可以执行任何 SQL 语句,并根据语句类型返回相应的结果。对于查询语句,它返回true
并设置ResultSet
对象;对于更新语句,它返回false
并更新受影响的行数。然而,由于execute
方法的行为取决于 SQL 语句的类型,因此通常不如executeQuery
和executeUpdate
明确和方便。
- 使用
特点
- 简单直接:
Statement
接口提供了最直接的方式来执行 SQL 语句,无需额外的配置或处理。 - 灵活性:可以执行任何类型的 SQL 语句,包括查询、更新和DDL(数据定义语言)语句。
- 低安全性:由于 SQL 语句是直接拼接的,因此容易受到 SQL 注入攻击。对于包含用户输入的情况,应使用
PreparedStatement
来避免这种风险。 - 低性能:对于需要重复执行的 SQL 语句,
Statement
每次都会解析和编译 SQL,这可能导致性能下降。相比之下,PreparedStatement
会将 SQL 语句预编译并缓存起来,从而提高性能。
使用场景
- 简单查询和更新:对于不涉及用户输入或不需要高性能的简单查询和更新操作,
Statement
是一个可行的选择。 - 一次性操作:对于只需要执行一次的 SQL 语句(如创建表、删除表等DDL操作),
Statement
也是合适的。
注意事项
- 关闭资源:使用完
Statement
后,应确保关闭它以释放数据库资源。这通常是在finally
块中完成的。 - 异常处理:捕获并处理
SQLException
以处理可能发生的数据库错误。 - 避免 SQL 注入:对于包含用户输入的情况,应使用
PreparedStatement
而不是Statement
来防止 SQL 注入攻击。
总的来说,Statement
是 JDBC API 中用于执行 SQL 语句的基本工具之一,但在实际开发中,根据具体需求和场景,可能需要考虑使用更安全的 PreparedStatement
或其他高级功能来提高性能和安全性。
案例:
下是一个使用JDBC进行增删改查(CRUD)操作的简单案例。这个案例将展示如何向一个名为employees
的数据库表中插入、查询、更新和删除记录。
首先,假设你的employees
表结构如下:
CREATE TABLE employees (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
position VARCHAR(100) NOT NULL,
salary DECIMAL(10, 2) NOT NULL
);
接下来是Java代码:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class EmployeeCRUD {
// JDBC URL, 用户名和密码(请根据实际情况修改)
private static final String JDBC_URL = "jdbc:mysql://localhost:3306/your_database";
private static final String JDBC_USER = "your_username";
private static final String JDBC_PASSWORD = "your_password";
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
Statement statement = null;
try {
// 打开数据库连接
connection = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD);
// 插入数据
String insertSQL = "INSERT INTO employees (name, position, salary) VALUES (?, ?, ?)";
preparedStatement = connection.prepareStatement(insertSQL);
preparedStatement.setString(1, "John Doe");
preparedStatement.setString(2, "Software Engineer");
preparedStatement.setBigDecimal(3, new BigDecimal("75000.00"));
preparedStatement.executeUpdate();
// 查询数据
String selectSQL = "SELECT * FROM employees";
statement = connection.createStatement();
resultSet = statement.executeQuery(selectSQL);
while (resultSet.next()) {
System.out.println("ID: " + resultSet.getInt("id") +
", Name: " + resultSet.getString("name") +
", Position: " + resultSet.getString("position") +
", Salary: " + resultSet.getBigDecimal("salary"));
}
// 更新数据
String updateSQL = "UPDATE employees SET salary = ? WHERE id = ?";
preparedStatement = connection.prepareStatement(updateSQL);
preparedStatement.setBigDecimal(1, new BigDecimal("80000.00"));
preparedStatement.setInt(2, 1); // 假设要更新的是id为1的记录
preparedStatement.executeUpdate();
// 删除数据
String deleteSQL = "DELETE FROM employees WHERE id = ?";
preparedStatement = connection.prepareStatement(deleteSQL);
preparedStatement.setInt(1, 2); // 假设要删除的是id为2的记录
preparedStatement.executeUpdate();
} catch (SQLException e) {
// 处理SQL异常
e.printStackTrace();
} finally {
// 清理资源
try {
if (resultSet != null) resultSet.close();
if (preparedStatement != null) preparedStatement.close();
if (statement != null) statement.close();
if (connection != null) connection.close();
} catch (SQLException e) {
// 处理关闭资源时的异常
e.printStackTrace();
}
}
}
}
注意事项
- JDBC URL:确保JDBC URL正确无误,并且数据库服务器正在运行。
- 异常处理:使用
try-catch
块捕获并处理SQLException
。 - 资源管理:在
finally
块中关闭ResultSet
、PreparedStatement
、Statement
和Connection
,以确保数据库资源得到释放。 - 数据安全性:使用
PreparedStatement
来防止SQL注入攻击。 - 事务处理:在实际应用中,你可能需要处理事务,以确保数据的一致性。这通常涉及到在多个操作之间设置保存点、回滚或提交事务。
这个案例展示了如何使用JDBC进行基本的CRUD操作。然而,在实际开发中,你可能会使用更高级的框架(如Spring JDBC、Hibernate或MyBatis)来简化数据库操作并提高代码的可维护性。
原文地址:https://blog.csdn.net/2401_88512872/article/details/143837325
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!