网络编程与数据库连接:JDBC基础¶
概述¶
JDBC(Java Database Connectivity)是Java语言中用于与数据库进行交互的API。它提供了一种标准的方法来访问各种关系型数据库,如MySQL、Oracle、PostgreSQL等。通过JDBC,Java程序可以执行SQL语句、处理结果集、管理事务等。
在本章中,我们将介绍JDBC的基本概念、如何使用JDBC连接数据库、执行SQL语句以及处理结果集。我们还将通过几个代码示例来演示这些概念。
JDBC的基本概念¶
JDBC驱动¶
JDBC驱动是JDBC API与特定数据库之间的桥梁。不同的数据库需要不同的JDBC驱动。常见的JDBC驱动类型包括:
- JDBC-ODBC桥接驱动:通过ODBC(Open Database Connectivity)连接数据库。
- 本地API驱动:使用数据库提供的本地API进行连接。
- 网络协议驱动:通过中间件服务器连接数据库。
- 纯Java驱动:完全用Java编写的驱动,直接与数据库通信。
JDBC API¶
JDBC API主要由以下几个接口和类组成:
DriverManager
:用于管理JDBC驱动。Connection
:表示与数据库的连接。Statement
:用于执行SQL语句。PreparedStatement
:预编译的SQL语句,可以提高性能。ResultSet
:表示SQL查询的结果集。
JDBC的使用步骤¶
使用JDBC连接数据库并执行SQL语句通常包括以下步骤:
- 加载JDBC驱动:使用
Class.forName()
方法加载数据库的JDBC驱动。 - 建立连接:使用
DriverManager.getConnection()
方法建立与数据库的连接。 - 创建Statement对象:使用
Connection.createStatement()
方法创建Statement
对象。 - 执行SQL语句:使用
Statement.executeQuery()
或Statement.executeUpdate()
方法执行SQL语句。 - 处理结果集:如果执行的是查询语句,使用
ResultSet
对象处理查询结果。 - 关闭连接:使用
Connection.close()
方法关闭数据库连接。
代码示例¶
示例1:加载JDBC驱动并建立连接¶
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class JDBCExample1 {
public static void main(String[] args) {
// JDBC驱动类名
String driver = "com.mysql.cj.jdbc.Driver";
// 数据库URL
String url = "jdbc:mysql://localhost:3306/mydatabase";
// 数据库用户名
String user = "root";
// 数据库密码
String password = "password";
try {
// 加载JDBC驱动
Class.forName(driver);
// 建立数据库连接
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println("数据库连接成功!");
// 关闭连接
conn.close();
} catch (ClassNotFoundException e) {
System.out.println("找不到JDBC驱动类!");
e.printStackTrace();
} catch (SQLException e) {
System.out.println("数据库连接失败!");
e.printStackTrace();
}
}
}
解释: - 在这个示例中,我们首先加载了MySQL的JDBC驱动类com.mysql.cj.jdbc.Driver
。 - 然后使用DriverManager.getConnection()
方法建立与数据库的连接。 - 最后,我们关闭了数据库连接。
示例2:执行SQL查询并处理结果集¶
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCExample2 {
public static void main(String[] args) {
String driver = "com.mysql.cj.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/mydatabase";
String user = "root";
String password = "password";
try {
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println("数据库连接成功!");
// 创建Statement对象
Statement stmt = conn.createStatement();
// 执行SQL查询
ResultSet rs = stmt.executeQuery("SELECT * FROM employees");
// 处理结果集
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
System.out.println("ID: " + id + ", Name: " + name + ", Age: " + age);
}
// 关闭结果集和Statement对象
rs.close();
stmt.close();
// 关闭连接
conn.close();
} catch (ClassNotFoundException e) {
System.out.println("找不到JDBC驱动类!");
e.printStackTrace();
} catch (SQLException e) {
System.out.println("数据库操作失败!");
e.printStackTrace();
}
}
}
解释: - 在这个示例中,我们创建了一个Statement
对象,并使用它执行了一个SQL查询。 - 查询结果存储在ResultSet
对象中,我们通过rs.next()
方法遍历结果集,并获取每一行的数据。 - 最后,我们关闭了结果集、Statement
对象和数据库连接。
示例3:使用PreparedStatement执行SQL更新¶
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class JDBCExample3 {
public static void main(String[] args) {
String driver = "com.mysql.cj.jdbc.Driver";
String url = "jdbc:mysql://localhost:3306/mydatabase";
String user = "root";
String password = "password";
try {
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println("数据库连接成功!");
// 使用PreparedStatement执行SQL更新
String sql = "UPDATE employees SET age = ? WHERE id = ?";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setInt(1, 30); // 设置第一个参数(age)
pstmt.setInt(2, 1); // 设置第二个参数(id)
// 执行更新
int rowsUpdated = pstmt.executeUpdate();
System.out.println("更新了 " + rowsUpdated + " 行数据。");
// 关闭PreparedStatement对象
pstmt.close();
// 关闭连接
conn.close();
} catch (ClassNotFoundException e) {
System.out.println("找不到JDBC驱动类!");
e.printStackTrace();
} catch (SQLException e) {
System.out.println("数据库操作失败!");
e.printStackTrace();
}
}
}
解释: - 在这个示例中,我们使用了PreparedStatement
来执行SQL更新操作。 - PreparedStatement
允许我们使用占位符(?
)来设置参数,这样可以防止SQL注入攻击。 - 我们通过pstmt.setInt()
方法设置了两个参数,然后执行了更新操作。 - 最后,我们关闭了PreparedStatement
对象和数据库连接。
练习题¶
练习1:连接数据库并查询所有用户¶
编写一个Java程序,连接到MySQL数据库,并查询users
表中的所有用户信息。要求输出每个用户的id
、username
和email
。
练习2:插入新用户¶
编写一个Java程序,使用PreparedStatement
向users
表中插入一条新记录。要求用户输入username
和email
,并将这些信息插入到数据库中。
练习3:事务处理¶
编写一个Java程序,演示如何使用JDBC进行事务处理。要求在一个事务中执行多个SQL操作(如插入、更新、删除),并在出现错误时回滚事务。
总结¶
在本章中,我们介绍了JDBC的基本概念和使用方法。我们学习了如何加载JDBC驱动、建立数据库连接、执行SQL语句以及处理结果集。我们还通过几个代码示例演示了这些概念的实际应用。
关键点总结: - JDBC是Java与数据库交互的标准API。 - 使用JDBC连接数据库的步骤包括加载驱动、建立连接、创建Statement对象、执行SQL语句、处理结果集和关闭连接。 - PreparedStatement
可以提高SQL执行的安全性,并防止SQL注入攻击。 - 事务处理可以确保多个SQL操作的原子性,要么全部成功,要么全部失败。
通过本章的学习,你应该能够使用JDBC连接数据库并执行基本的SQL操作。希望这些内容对你理解和使用JDBC有所帮助!