1. 什么是JDBC?
JDBC(Java Database Connectivity)是一个Java API,用于连接和执行SQL语句与关系型数据库进行交互。JDBC提供了一组接口和类,使Java程序能够与各种数据库通信,如MySQL、Oracle、PostgreSQL等。
2. JDBC的主要组件
JDBC主要由以下几个组件组成:
DriverManager
:负责加载数据库驱动,并建立与数据库的连接。Connection
:表示与数据库的连接。Statement
:用于执行SQL语句。PreparedStatement
:用于执行预编译的SQL语句。ResultSet
:表示查询结果集。3. 连接数据库
在连接数据库之前,需要确保已经安装了相应的数据库驱动并将其添加到项目中。以下是一个简单示例,演示如何使用JDBC连接到MySQL数据库:
java
Copy
import java.sql.Connection; import java.sql.DriverManager; public class JdbcConnectExample { public static void main(String[] args) { try { // 加载数据库驱动 Class.forName("com.mysql.cj.jdbc.Driver"); // 连接到数据库 String url = "jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true"; String username = "root"; String password = "mypassword"; Connection connection = DriverManager.getConnection(url, username, password); System.out.println("Connected to database!"); // 关闭连接 connection.close(); } catch (Exception e) { e.printStackTrace(); } } }
4. 执行SQL查询
要使用JDBC执行SQL查询,可以创建一个Statement
对象,然后调用其executeQuery()
方法。以下是一个简单示例,演示如何查询数据库中的数据:
java
Copy
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class JdbcQueryExample { public static void main(String[] args) { try { // 加载数据库驱动并连接到数据库 Class.forName("com.mysql.cj.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true"; String username = "root"; String password = "mypassword"; Connection connection = DriverManager.getConnection(url, username, password); // 创建Statement对象并执行SQL查询 Statement statement = connection.createStatement(); String sql = "SELECT id, name FROM users"; ResultSet resultSet = statement.executeQuery(sql); // 处理结果集 while (resultSet.next()) { int id = resultSet.getInt("id"); String name = resultSet.getString("name"); System.out.println("ID: " + id + ", Name: " + name); } // 关闭资源 resultSet.close(); statement.close(); connection.close(); } catch (Exception e) { e.printStackTrace(); } } }
5. 执行SQL更新
要使用JDBC执行SQL更新(如插入、更新或删除),可以创建一个Statement
对象,然后调用其executeUpdate()
方法。以下是一个简单示例,演示如何向数据库中插入数据:
java
Copy
import java.sql.Connection; import java.sql.DriverManager; import java.sql.Statement; public class JdbcUpdateExample { public static void main(String[] args) { try { // 加载数据库驱动并连接到数据库 Class.forName("com.mysql.cj.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true"; String username = "root"; String password = "mypassword"; Connection connection = DriverManager.getConnection(url, username, password); // 创建Statement对象并执行SQL更新 Statement statement = connection.createStatement(); String sql = "INSERT INTO users (name, age) VALUES ('John Doe', 30)"; int rowsAffected = statement.executeUpdate(sql); System.out.println("Rows affected: " + rowsAffected); // 关闭资源 statement.close(); connection.close(); } catch (Exception e) { e.printStackTrace(); } } } **6. 使用PreparedStatement** `PreparedStatement`是一个预编译的`Statement`对象,可以提高SQL语句的执行效率。它还可以防止SQL注入攻击。以下是一个简单示例,演示如何使用`PreparedStatement`插入数据: ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; public class JdbcPreparedStatementExample { public static void main(String[] args) { try { // 加载数据库驱动并连接到数据库 Class.forName("com.mysql.cj.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true"; String username = "root"; String password = "mypassword"; Connection connection = DriverManager.getConnection(url, username, password); // 创建PreparedStatement对象并执行SQL更新 String sql = "INSERT INTO users (name, age) VALUES (?, ?)"; PreparedStatement preparedStatement = connection.prepareStatement(sql); preparedStatement.setString(1, "Jane Doe"); preparedStatement.setInt(2, 28); int rowsAffected = preparedStatement.executeUpdate(); System.out.println("Rows affected: " + rowsAffected); // 关闭资源 preparedStatement.close(); connection.close(); } catch (Exception e) { e.printStackTrace(); } } }
7. 事务处理
事务是一组逻辑操作单元,执行这些操作要么全部成功,要么全部失败。在JDBC中,可以使用Connection
对象的commit()
和rollback()
方法进行事务处理。以下是一个简单示例,演示如何使用事务处理:
java
Copy
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; public class JdbcTransactionExample { public static void main(String[] args) { Connection connection = null; PreparedStatement preparedStatement = null; try { // 加载数据库驱动并连接到数据库 Class.forName("com.mysql.cj.jdbc.Driver"); String url = "jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true"; String username = "root"; String password = "mypassword"; connection = DriverManager.getConnection(url, username, password); // 关闭自动提交(开启事务) connection.setAutoCommit(false); // 执行SQL更新 String sql = "UPDATE users SET age = age + 1 WHERE id = ?"; preparedStatement = connection.prepareStatement(sql); preparedStatement.setInt(1, 1); preparedStatement.executeUpdate(); // 提交事务 connection.commit(); System.out.println("Transaction committed."); } catch (Exception e) { // 回滚事务 try { if (connection != null) { connection.rollback(); System.out.println("Transaction rolled back."); } } catch (Exception ex) { ex.printStackTrace(); } e.printStackTrace(); } finally { // 关闭资源 try { if (preparedStatement != null) { preparedStatement.close(); } if (connection != null) { connection.close(); } } catch (Exception e) { e.printStackTrace(); } } } }
8. 关闭资源
在JDBC中,需要确保及时关闭资源,如Connection
、Statement
和ResultSet
等。可以使用close()
方法或者Java 7中引入的try-with-resources
语句进行资源关闭。以下是一个简单示例,演示如何使用try-with-resources
关闭资源:
java
Copy
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class JdbcCloseResourceExample { public static void main(String[] args) { try { // 加载数据库驱动 Class.forName("com.mysql.cj.jdbc.Driver"); // 连接到数据库 String url = "jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=utf-8&useSSL=false&allowPublicKeyRetrieval=true"; String username = "root"; String password = "mypassword"; try (Connection connection = DriverManager.getConnection(url, username, password); Statement statement = connection.createStatement()) { // 执行SQL查询并处理结果集