JDBC(Java Database Connectivity)是 Java 中用于连接和操作数据库的标准 API。它允许 Java 应用程序与不同类型的数据库进行交互,执行查询、插入、更新和删除等操作。本文将详细介绍 JDBC 的各个类及其用法,以帮助您更好地理解和使用 JDBC。
JDBC 架构
在了解 JDBC 的各个类之前,让我们先了解 JDBC 的基本架构。JDBC 架构主要由以下几个部分组成:
-
JDBC API:这是 JDBC 的核心部分,包括一组接口和类,用于在 Java 应用程序和数据库之间建立连接以及执行 SQL 查询和更新操作。
-
JDBC 驱动程序管理器:这是 JDBC 驱动程序的管理器,用于加载并管理不同数据库的 JDBC 驱动程序。
-
JDBC 驱动程序:JDBC 驱动程序是数据库供应商提供的实现 JDBC 接口的类库,用于连接和与数据库进行通信。每个数据库都有自己的 JDBC 驱动程序。
-
数据库:这是要访问和操作的实际数据库,可以是各种类型的数据库,如 MySQL、Oracle、SQL Server 等。
-
JDBC 数据源:JDBC 数据源是一种管理数据库连接的方式,它可以在应用程序和数据库之间提供连接池的功能,以提高性能和资源利用率。
现在,让我们深入了解 JDBC 的各个类以及它们的作用。
1. java.sql.DriverManager
DriverManager
类是 JDBC 的入口点之一,用于管理 JDBC 驱动程序的加载和数据库连接的建立。您可以使用以下方法来与数据库建立连接:
getConnection(String url, String username, String password)
:通过指定数据库的 URL、用户名和密码来建立与数据库的连接。返回一个Connection
对象,用于后续的数据库操作。
示例代码:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;public class JDBCDemo {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/mydatabase";String username = "root";String password = "password";try {Connection connection = DriverManager.getConnection(url, username, password);// 使用 connection 执行数据库操作} catch (SQLException e) {e.printStackTrace();}}
}
2. java.sql.Connection
Connection
接口表示与数据库的连接,它提供了一系列方法用于执行 SQL 查询和更新操作,以及管理事务。一旦通过 DriverManager
建立了连接,您就可以创建 Statement
、PreparedStatement
或 CallableStatement
对象来执行 SQL 语句。
示例代码:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;public class JDBCDemo {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/mydatabase";String username = "root";String password = "password";try {Connection connection = DriverManager.getConnection(url, username, password);Statement statement = connection.createStatement();// 使用 statement 执行 SQL 查询或更新操作// ...// 关闭连接和 statementstatement.close();connection.close();} catch (SQLException e) {e.printStackTrace();}}
}
3. java.sql.Statement
Statement
接口用于执行简单的 SQL 查询和更新操作。它允许您执行一次性 SQL 语句,但不支持参数化查询。要执行参数化查询,通常使用 PreparedStatement
。
示例代码:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;public class JDBCDemo {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/mydatabase";String username = "root";String password = "password";try {Connection connection = DriverManager.getConnection(url, username, password);Statement statement = connection.createStatement();// 执行查询String query = "SELECT * FROM employees";statement.executeQuery(query);// 执行更新String update = "UPDATE employees SET salary = 50000 WHERE department = 'IT'";statement.executeUpdate(update);// 关闭连接statement.close();connection.close();} catch (SQLException e) {e.printStackTrace();}}
}
4. java.sql.PreparedStatement
PreparedStatement
接口用于执行参数化的 SQL 查询和更新操作。与 Statement
不同,PreparedStatement
可以提高性能和安全性,因为它允许您预编译 SQL 语句并设置参数值,以避免 SQL 注入攻击。
示例代码:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;public class JDBCDemo {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/mydatabase";String username = "root";String password = "password";try {Connection connection = DriverManager.getConnection(url, username, password);// 预编译 SQL 查询String sql = "SELECT * FROM employees WHERE department = ?";PreparedStatement preparedStatement = connection.prepareStatement(sql);// 设置参数值preparedStatement.setString(1, "IT");// 执行查询preparedStatement.executeQuery();// 关闭连接和 preparedStatementpreparedStatement.close();connection.close();} catch (SQLException e) {e.printStackTrace();}}
}
5. java.sql.ResultSet
ResultSet
接口表示从数据库查询返回的结果集。它允许您迭代结果集并获取查询结果的数据。
示例代码:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;public class JDBCDemo {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/mydatabase";String username = "root";String password = "password";try {Connection connection = DriverManager.getConnection(url, username, password);// 预编译 SQL 查询String sql = "SELECT * FROM employees WHERE department = ?";PreparedStatement preparedStatement = connection.prepareStatement(sql);// 设置参数值preparedStatement.setString(1, "IT");// 执行查询ResultSet resultSet = preparedStatement.executeQuery();// 迭代结果集while (resultSet.next()) {int id = resultSet.getInt("id");String name = resultSet.getString("name");double salary = resultSet.getDouble("salary");// 处理查询结果System.out.println("ID: " + id + ", Name: " + name + ", Salary: " + salary);}// 关闭连接、preparedStatement 和 resultSetresultSet.close();preparedStatement.close();connection.close();} catch (SQLException e) {e.printStackTrace();}}
}
6. java.sql.CallableStatement
CallableStatement
接口用于执行存储过程或函数的调用。存储过程是一组预定义的 SQL 语句,可以在数据库中执行,并且可以包含输入参数、输出参数和返回结果。
示例代码:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.CallableStatement;
import java.sql.Types;
import java.sql.SQLException;public class JDBCDemo {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/mydatabase";String username = "root";String password = "password";try {Connection connection = DriverManager.getConnection(url, username, password);// 调用存储过程String callProcedure = "{CALL calculate_salary(?, ?)}";CallableStatement callableStatement = connection.prepareCall(callProcedure);// 设置输入参数callableStatement.setInt(1, 1001);// 注册输出参数callableStatement.registerOutParameter(2, Types.DOUBLE);// 执行存储过程callableStatement.execute();// 获取输出参数值double salary = callableStatement.getDouble(2);System.out.println("Calculated Salary: " + salary);// 关闭连接和 callableStatementcallableStatement.close();connection.close();} catch (SQLException e) {e.printStackTrace();}}
}
7. java.sql.BatchUpdateException
BatchUpdateException
是一个异常类,用于处理 JDBC 批处理操作时的异常情况。JDBC 批处理允许一次性执行多个 SQL 语句,通常用于提高数据库操作的性能。
示例代码:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.BatchUpdateException;
import java.sql.SQLException;public class JDBCDemo {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/mydatabase";String username = "root";String password = "password";try {Connection connection = DriverManager.getConnection(url, username, password);Statement statement = connection.createStatement();// 添加多个 SQL 语句到批处理statement.addBatch("INSERT INTO employees (name, department, salary) VALUES ('Alice', 'HR', 5000)");statement.addBatch("INSERT INTO employees (name, department, salary) VALUES ('Bob', 'IT', 6000)");statement.addBatch("UPDATE employees SET salary = 5500 WHERE name = 'Alice'");// 执行批处理int[] result = statement.executeBatch();// 处理执行结果for (int i = 0; i < result.length; i++) {if (result[i] == Statement.EXECUTE_FAILED) {System.err.println("SQL command failed: " + i);} else {System.out.println("SQL command successful: " + i);}}// 关闭连接和 statementstatement.close();connection.close();} catch (BatchUpdateException e) {int[] updateCounts = e.getUpdateCounts();for (int i = 0; i < updateCounts.length; i++) {if (updateCounts[i] == Statement.EXECUTE_FAILED) {System.err.println("SQL command failed: " + i);} else {System.out.println("SQL command successful: " + i);}}} catch (SQLException e) {e.printStackTrace();}}
}
8. javax.sql.DataSource
DataSource
是 Java 中用于管理数据库连接池的接口。连接池可以帮助提高数据库连接的性能和资源利用率,因为它可以重复使用连接,而不需要每次都创建新连接。
示例代码:
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;public class JDBCDemo {public static void main(String[] args) {// 使用连接池获取数据库连接DataSource dataSource = MyDataSourceFactory.getDataSource();try (Connection connection = dataSource.getConnection()) {// 执行数据库操作} catch (SQLException e) {e.printStackTrace();}}
}
在上面的示例中,MyDataSourceFactory
是一个自定义的连接池工厂类,用于创建和配置连接池。使用连接池可以减少连接的创建和销毁开销,提高应用程序的性能和响应速度。
总结
本文介绍了 JDBC(Java Database Connectivity)的核心类和接口,包括 java.sql.Connection
、java.sql.Statement
、java.sql.PreparedStatement
、java.sql.ResultSet
、java.sql.CallableStatement
、java.sql.BatchUpdateException
和 javax.sql.DataSource
。这些类和接口允许 Java 应用程序与数据库进行连接、查询和更新操作,是与数据库交互的重要工具。
JDBC 提供了多种方式来执行 SQL 查询和更新操作,包括简单的 Statement
、参数化的 PreparedStatement
、存储过程的 CallableStatement
,以及批处理操作。连接池也是 JDBC 中常用的工具,用于管理数据库连接的复用和释放。
希望本文能够帮助您更好地理解 JDBC,并在 Java 应用程序中有效地使用数据库。如果您有任何问题或需要进一步的帮助,请随时提出。
作者信息 作者 : 繁依Fanyi CSDN: https://techfanyi.blog.csdn.net 掘金:https://juejin.cn/user/4154386571867191 |