模式切换
数据库操作
数据库操作是开发中非常重要的内容之一,特别是在涉及到大量数据存储和查询的应用程序时。Java 提供了强大的 JDBC(Java Database Connectivity)技术,使得 Java 应用能够与数据库进行连接和交互。下面,我将详细介绍数据库的基础知识、JDBC 的使用以及常见数据库操作。
数据库基础知识
什么是数据库
数据库是一个有组织的数据集合,它用于存储和管理数据。数据库可以高效地存储、查询和管理大量的数据。最常见的数据库系统是关系型数据库(如 MySQL、PostgreSQL)和非关系型数据库(如 MongoDB)。
数据库的种类及功能
- 关系型数据库:
- 特点:数据以表格的形式存储,表与表之间可以通过主键和外键建立关联。
- 常见数据库:MySQL、PostgreSQL、Oracle、SQL Server。
- 功能:
- 支持复杂查询。
- 数据一致性强,支持事务。
- 数据存储结构清晰。
- 非关系型数据库(NoSQL):
- 特点:数据不以表格的形式存储,通常是文档、键值对、图数据等。
- 常见数据库:MongoDB、Redis、Cassandra。
- 功能:
- 支持灵活的 schema 设计。
- 通常用于高并发、大数据量的场景。
- 可以水平扩展,处理分布式数据。
SQL 语言
SQL(Structured Query Language)是用于管理关系型数据库的标准语言。SQL 语言可以用于以下操作:
- 数据查询:通过
SELECT
查询数据。 - 数据修改:通过
INSERT
、UPDATE
、DELETE
修改数据。 - 数据库管理:创建、删除数据库和表格。
SQL 示例:
sql
-- 查询所有用户
SELECT * FROM users;
-- 插入新用户
INSERT INTO users (name, age) VALUES ('Tom', 30);
-- 更新用户信息
UPDATE users SET age = 31 WHERE name = 'Tom';
-- 删除用户
DELETE FROM users WHERE name = 'Tom';
JDBC 概述
JDBC(Java Database Connectivity)是 Java 提供的一套 API,允许 Java 程序与关系型数据库进行通信。JDBC 通过一系列接口和类,提供了连接、查询、更新数据库的功能。
JDBC-ODBC 桥接器
早期,JDBC 使用 JDBC-ODBC 桥接器来连接数据库。这个桥接器将 JDBC 请求转发给 ODBC(开放数据库连接)驱动程序,然后 ODBC 驱动程序与数据库通信。随着技术的发展,JDBC 现在大多使用数据库厂商提供的原生 JDBC 驱动程序。
JDBC 技术
JDBC 技术通过提供一组标准接口,允许 Java 应用程序执行数据库操作。JDBC 操作的步骤通常是:
- 加载数据库驱动。
- 创建数据库连接。
- 执行 SQL 语句。
- 处理结果集。
- 关闭连接。
JDBC 驱动程序的类型
JDBC 驱动程序有四种类型:
- JDBC-ODBC 桥接驱动(类型 1):将 JDBC 调用转换为 ODBC 调用。
- 本地 API 驱动(类型 2):使用数据库厂商提供的本地库(如 C 语言库)来与数据库通信。
- 网络协议驱动(类型 3):通过中间层与数据库通信,支持多种数据库。
- 纯 Java 驱动(类型 4):通过 Java 程序直接与数据库通信,不依赖本地库,是最常用的类型。
JDBC 中常用的类和接口
Connection 接口
Connection
是 JDBC 中的一个重要接口,表示与数据库的连接。通过它可以创建 Statement
或 PreparedStatement
,并执行 SQL 语句。
常用方法:
createStatement()
:创建一个Statement
对象。prepareStatement()
:创建一个PreparedStatement
对象。close()
:关闭数据库连接。
java
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "user", "password");
Statement 接口
Statement
用于执行 SQL 语句,并获取执行结果。Statement
通常用于执行简单的 SQL 查询。
常用方法:
executeQuery()
:执行查询语句,返回结果集。executeUpdate()
:执行更新操作(如插入、更新、删除)。
java
Statement stmt = connection.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM users");
PreparedStatement 接口
PreparedStatement
是 Statement
的一个子接口,支持预编译的 SQL 语句,适合处理动态参数,避免 SQL 注入攻击。
常用方法:
setXXX()
:设置 SQL 查询中的参数(如setString()
、setInt()
)。executeQuery()
:执行查询语句,返回结果集。executeUpdate()
:执行更新操作。
java
String sql = "SELECT * FROM users WHERE age > ?";
PreparedStatement pstmt = connection.prepareStatement(sql);
pstmt.setInt(1, 30); // 设置参数
ResultSet rs = pstmt.executeQuery();
DriverManager 类
DriverManager
是用来管理数据库驱动程序的类,它根据数据库的 URL 加载对应的驱动,并建立数据库连接。
java
DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "password");
ResultSet 接口
ResultSet
用于存储和操作查询的结果集。它允许通过游标遍历结果,并获取结果数据。
常用方法:
next()
:移动游标到下一行。getString()
、getInt()
等方法:获取某列的数据。
java
while (rs.next()) {
String name = rs.getString("name");
int age = rs.getInt("age");
}
数据库操作
连接数据库
连接数据库需要提供数据库 URL、用户名和密码。DriverManager.getConnection()
方法可以用来创建数据库连接。
java
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "password");
向数据库发送 SQL 语句
可以使用 Statement
或 PreparedStatement
对象来发送 SQL 语句。
java
Statement stmt = conn.createStatement();
stmt.executeUpdate("INSERT INTO users (name, age) VALUES ('Tom', 30)");
处理查询结果集
ResultSet
对象用于存储查询结果,可以通过 getString()
、getInt()
等方法获取查询字段。
java
ResultSet rs = stmt.executeQuery("SELECT * FROM users");
while (rs.next()) {
String name = rs.getString("name");
int age = rs.getInt("age");
System.out.println(name + " " + age);
}
顺序查询
顺序查询是指通过 ResultSet.next()
遍历查询结果。
java
ResultSet rs = stmt.executeQuery("SELECT * FROM users");
while (rs.next()) {
System.out.println(rs.getString("name"));
}
模糊查询
模糊查询通常使用 LIKE
关键字。例如,查询名字包含 "Tom" 的用户:
java
PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM users WHERE name LIKE ?");
pstmt.setString(1, "%Tom%");
ResultSet rs = pstmt.executeQuery();
预处理语句
PreparedStatement
可以防止 SQL 注入,并且支持预编译 SQL 语句,效率较高。
java
PreparedStatement pstmt = conn.prepareStatement("UPDATE users SET age = ? WHERE name = ?");
pstmt.setInt(1, 35);
pstmt.setString(2, "Tom");
pstmt.executeUpdate();
添加、修改、删除记录
使用 INSERT
、UPDATE
、DELETE
来向数据库添加、修改或删除记录:
java
// 插入记录
stmt.executeUpdate("INSERT INTO users (name, age) VALUES ('Alice', 25)");
// 更新记录
stmt.executeUpdate("UPDATE users SET age = 28 WHERE name = 'Alice'");
// 删除记录
stmt.executeUpdate("DELETE FROM users WHERE name = 'Alice'");