JDBC(Java Database Connectivity)是 Java 中用于与关系型数据库进行交互的标准API。它允许 Java 应用程序连接到各种数据库管理系统(如MySQL、Oracle、SQL Server等),执行SQL查询、更新数据库记录、处理事务等。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,JDBC实现了所有这些面向标准的目标并且具有简单、严格类型定义且高性能实现的接口。JDBC给数据库的连接搭建了桥梁,然后再根据不同的数据库厂商实现JDBC接口的驱动,就可以轻松的连接各种关系型数据库了。
注:JDBC是Java操作数据库的唯一方式,所以说JDBC非常的重要,尽管我们后面会学习框架,但是这是框架的底层必定都封装了JDBC的代码。
Driver接口由数据库厂家提供,作为java开发人员,只需要使用Driver接口就可以了。在编程中要连接数据库,必须先装载特定厂商的数据库驱动程序,不同的数据库有不同的装载方法。如:
Connection与特定数据库的连接(会话),在连接上下文中执行sql语句并返回结果。DriverManager.getConnection(url, user, password)方法建立在JDBC URL中定义的数据库Connection连接上。
Connection中常用的方法:
Statement用于执行静态SQL语句并返回它所生成结果的对象。Statement类有三种:
Statement中常用的方法:
esultSet提供检索不同类型字段的方法,常用的有:
ResultSet还提供了对结果集进行滚动的方法:
JDBC 架构由两个主要组件组成:
JDBC API: 这是一组 Java 接口和类,用于编写 Java 应用程序以连接和交互与数据库的代码。主要的接口包括 Connection
、Statement
、PreparedStatement
、CallableStatement
、ResultSet
等。
JDBC 驱动程序: JDBC 驱动程序是特定数据库供应商提供的实现 JDBC 接口的类库。它负责与特定数据库管理系统通信。通常有四种类型的 JDBC 驱动程序:Type 1(JDBC-ODBC 桥接器)、Type 2(本地API驱动程序)、Type 3(网络协议驱动程序)和 Type 4(纯Java驱动程序)。
连接到数据库是使用 JDBC 的第一步。连接通常需要以下信息:
数据库URL(Uniform Resource Locator): 表示数据库的地址和连接信息。URL 格式通常为 jdbc:数据库类型://主机名:端口号/数据库名称
。
数据库用户名和密码: 用于身份验证并访问数据库。
JDBC 驱动程序: 需要加载和注册数据库特定的 JDBC 驱动程序。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCDemo {
public static void main(String[] args) {
try {
// 1. 导入数据库驱动的JAR包(此处假设已导入)
// 2. 注册数据库驱动
Class.forName("com.mysql.jdbc.Driver");
// 3. 获取数据库连接
String url = "jdbc:mysql://localhost:3306/db2";
String username = "root";
String password = "lichee";
Connection conn = DriverManager.getConnection(url, username, password);
// 4. 获取执行者对象(Statement)
Statement statement = conn.createStatement();
// 5. 执行SQL查询,并接收结果
String sql = "SELECT * FROM user";
ResultSet resultSet = statement.executeQuery(sql);
// 6. 处理查询结果
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println(id + "\t" + name);
}
// 7. 释放资源(注意:资源的释放顺序应与创建的顺序相反)
resultSet.close();
statement.close();
conn.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
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 = "username";
String password = "password";
try {
Connection connection = DriverManager.getConnection(url, username, password);
// 连接成功后,可以执行 SQL 查询和操作
} catch (SQLException e) {
e.printStackTrace();
}
}
}
一旦建立了连接,就可以使用 Statement
或 PreparedStatement
对象执行 SQL 查询。Statement
用于普通 SQL 查询,而 PreparedStatement
用于预编译的 SQL 查询,可以提高性能和安全性。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
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 = "username";
String password = "password";
try (Connection connection = DriverManager.getConnection(url, username, password);
Statement statement = connection.createStatement()) {
String sql = "SELECT * FROM users";
ResultSet resultSet = statement.executeQuery(sql);
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
// 处理查询结果
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
使用 JDBC,你可以执行 INSERT、UPDATE 和 DELETE 等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 = "username";
String password = "password";
try (Connection connection = DriverManager.getConnection(url, username, password);
Statement statement = connection.createStatement()) {
String sql = "INSERT INTO users (name, email) VALUES ('John', '[email protected]')";
int rowsInserted = statement.executeUpdate(sql);
// 处理插入操作结果
} catch (SQLException e) {
e.printStackTrace();
}
}
}
JDBC 支持事务管理,你可以通过 commit()
提交事务和 rollback()
回滚事务。通常在多个 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 = "username";
String password = "password";
try (Connection connection = DriverManager.getConnection(url, username, password);
Statement statement = connection.createStatement()) {
connection.setAutoCommit(false); // 禁用自动提交
String sql1 = "INSERT INTO users (name, email) VALUES ('John', '[email protected]')";
String sql2 = "UPDATE users SET email = '[email protected]' WHERE id = 1";
statement.executeUpdate(sql1);
statement.executeUpdate(sql2);
connection.commit(); // 提交事务
} catch (SQLException e) {
e.printStackTrace();
connection.rollback(); // 回滚事务
}
}
}
连接池是一种重要的技术,可以有效地管理和重复使用数据库连接,以提高性能和资源利用率。常见的 Java 连接池包括 HikariCP、Apache Commons DBCP、C3P0 等。通过使用连接池,可以减少连接创建和销毁的开销,并更好地管理连接。