Java JDBC(Java Database Connectivity)是用于在Java应用程序中与数据库进行交互的API。它提供了一种标准方法来访问各种类型的数据库,如MySQL、PostgreSQL、Oracle等。通过JDBC,开发人员可以执行SQL查询、更新和管理数据库,以实现数据持久化和检索。
JDBC编程基础
1. 加载数据库驱动程序
在使用JDBC之前,首先需要加载适当的数据库驱动程序。不同的数据库厂商提供了不同的驱动程序,例如com.mysql.cj.jdbc.Driver用于MySQL数据库。加载驱动程序的步骤如下:
```java try { Class.forName("com.mysql.cj.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } ```
2. 建立数据库连接
一旦加载了数据库驱动程序,就可以通过DriverManager建立数据库连接。连接字符串url包含了主机名、端口号和数据库名称,username和password则是用于认证的凭证。
```java String url = "jdbc:mysql://localhost:3306/mydatabase"; String username = "root"; String password = "password"; Connection connection = null; try { connection = DriverManager.getConnection(url, username, password); } catch (SQLException e) { e.printStackTrace(); } ```
3. 创建和执行SQL语句
通过Connection对象,可以创建Statement或PreparedStatement对象,然后执行SQL语句。Statement主要用于执行静态SQL语句,而PreparedStatement则用于执行带参数的动态SQL语句。
```java // 使用Statement执行静态SQL查询 Statement statement = null; ResultSet resultSet = null; try { statement = connection.createStatement(); resultSet = statement.executeQuery("SELECT * FROM users"); while (resultSet.next()) { String name = resultSet.getString("name"); int age = resultSet.getInt("age"); System.out.println("Name: " + name + ", Age: " + age); } } catch (SQLException e) { e.printStackTrace(); } finally { try { if (resultSet != null) resultSet.close(); if (statement != null) statement.close(); } catch (SQLException e) { e.printStackTrace(); } } // 使用PreparedStatement执行带参数的SQL插入操作 String insertSQL = "INSERT INTO users (name, age) VALUES (?, ?)"; PreparedStatement preparedStatement = null; try { preparedStatement = connection.prepareStatement(insertSQL); preparedStatement.setString(1, "Alice"); preparedStatement.setInt(2, 25); preparedStatement.executeUpdate(); } catch (SQLException e) { e.printStackTrace(); } finally { try { if (preparedStatement != null) preparedStatement.close(); } catch (SQLException e) { e.printStackTrace(); } } ```
4. 处理结果集
执行查询后,可以通过ResultSet对象处理查询结果。ResultSet对象表示数据库结果集,包含了通过查询返回的数据。可以使用ResultSet的各种get方法来获取列值。
```java while (resultSet.next()) { String name = resultSet.getString("name"); int age = resultSet.getInt("age"); System.out.println("Name: " + name + ", Age: " + age); } ```
5. 事务管理
在实际应用中,经常需要使用事务来确保数据的一致性。JDBC支持手动事务管理,可以通过Connection对象的`setAutoCommit(false)`方法关闭自动提交模式,然后通过`commit()`和`rollback()`方法来控制事务。
```java try { connection.setAutoCommit(false); String updateSQL1 = "UPDATE accounts SET balance = balance - ? WHERE id = ?"; PreparedStatement pstmt1 = connection.prepareStatement(updateSQL1); pstmt1.setDouble(1, 100); pstmt1.setInt(2, 1); pstmt1.executeUpdate(); String updateSQL2 = "UPDATE accounts SET balance = balance + ? WHERE id = ?"; PreparedStatement pstmt2 = connection.prepareStatement(updateSQL2); pstmt2.setDouble(1, 100); pstmt2.setInt(2, 2); pstmt2.executeUpdate(); connection.commit(); } catch (SQLException e) { try { connection.rollback(); } catch (SQLException ex) { ex.printStackTrace(); } e.printStackTrace(); } finally { try { connection.setAutoCommit(true); } catch (SQLException e) { e.printStackTrace(); } } ```
6. 关闭连接
最后,记得关闭连接,释放资源。未关闭的连接可能会导致资源泄漏,从而影响系统性能。
```java try { if (resultSet != null) resultSet.close(); if (statement != null) statement.close(); if (connection != null) connection.close(); } catch (SQLException e) { e.printStackTrace(); } ```
完整示例代码
以下是一个完整的Java JDBC示例,展示了如何连接到数据库、执行查询、更新记录,并处理结果集。
```java import java.sql.*; public class JdbcExample { public static void main(String[] args) { Connection connection = null; Statement statement = null; ResultSet resultSet = null; PreparedStatement preparedStatement = null; try { Class.forName("com.mysql.cj.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/mydatabase"; String username = "root"; String password = "password"; connection = DriverManager.getConnection(url, username, password); statement = connection.createStatement(); resultSet = statement.executeQuery("SELECT * FROM users"); while (resultSet.next()) { String name = resultSet.getString("name"); int age = resultSet.getInt("age"); System.out.println("Name: " + name + ", Age: " + age); } String insertSQL = "INSERT INTO users (name, age) VALUES (?, ?)"; preparedStatement = connection.prepareStatement(insertSQL); preparedStatement.setString(1, "Bob"); preparedStatement.setInt(2, 30); preparedStatement.executeUpdate(); } catch (Exception e) { e.printStackTrace(); } finally { try { if (resultSet != null) resultSet.close(); if (statement != null) statement.close(); if (preparedStatement != null) preparedStatement.close(); if (connection != null) connection.close(); } catch (SQLException e) { e.printStackTrace(); } } } } ```
以上代码展示了从数据库连接到执行查询、插入数据,再到关闭连接的完整流程。在实际项目中,还需要考虑更多的异常处理、日志记录、性能优化等方面。JDBC作为Java与数据库交互的基础技术,是每个Java开发人员必须掌握的重要技能。