引言
在现代应用开发中,与数据库交互是不可或缺的一部分。Java提供了JDBC(Java Database Connectivity) API,允许开发者方便地连接到数据库并执行SQL操作。本文将详细介绍Java数据库编程的基础知识,包括JDBC的基本概念、数据库连接与操作、事务处理、以及使用ORM框架如Hibernate,并通过表格进行总结和示范。
JDBC基础
什么是JDBC?
JDBC是Java数据库连接的标准API,允许Java应用与数据库进行交互。JDBC API提供了与数据库连接、执行SQL查询、更新数据库和处理结果集的方法。
JDBC体系结构
组件 | 描述 |
---|---|
DriverManager | 管理一组JDBC驱动程序,实现数据库连接 |
Driver | 用于与数据库通信的JDBC驱动程序 |
Connection | 表示与特定数据库的连接,用于执行SQL语句 |
Statement | 用于执行SQL查询和更新 |
ResultSet | 表示SQL查询的结果,允许迭代和处理结果集 |
SQLException | 指示数据库访问错误的异常类 |
JDBC四大步骤
- 加载并注册数据库驱动
- 建立数据库连接
- 创建并执行SQL语句
- 处理结果与关闭资源
数据库连接与操作
连接数据库
使用DriverManager
获取数据库连接。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DatabaseConnection {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/mydatabase";
String username = "root";
String password = "password";
try (Connection connection = DriverManager.getConnection(url, username, password)) {
System.out.println("Database connected!");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
执行SQL查询
使用Statement
执行SQL查询并处理结果集。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class SelectQueryExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/mydatabase";
String username = "root";
String password = "password";
try (Connection connection = DriverManager.getConnection(url, username, password);
Statement statement = connection.createStatement()) {
String query = "SELECT * FROM users";
ResultSet resultSet = statement.executeQuery(query);
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
String email = resultSet.getString("email");
System.out.println("ID: " + id + ", Name: " + name + ", Email: " + email);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
更新数据库
使用PreparedStatement
执行SQL更新操作。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class UpdateQueryExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/mydatabase";
String username = "root";
String password = "password";
try (Connection connection = DriverManager.getConnection(url, username, password);
PreparedStatement statement = connection.prepareStatement("UPDATE users SET email = ? WHERE id = ?")) {
statement.setString(1, "newemail@example.com");
statement.setInt(2, 1);
int rowsAffected = statement.executeUpdate();
System.out.println("Rows affected: " + rowsAffected);
} catch (SQLException e) {
e.printStackTrace();
}
}
}
JDBC常用类与方法表
类/接口 | 方法 | 描述 |
---|---|---|
DriverManager | getConnection(String, String, String) | 获取数据库连接 |
Connection | createStatement() | 创建Statement 实例 |
prepareStatement(String) | 创建PreparedStatement 实例 | |
close() | 关闭数据库连接 | |
Statement | executeQuery(String) | 执行SQL查询并返回ResultSet |
executeUpdate(String) | 执行SQL更新并返回受影响行数 | |
close() | 关闭Statement | |
PreparedStatement | setString(int, String) | 设置SQL参数值 |
setInt(int, int) | 设置SQL参数值 | |
executeUpdate() | 执行SQL更新并返回受影响行数 | |
executeQuery() | 执行SQL查询并返回ResultSet | |
close() | 关闭PreparedStatement | |
ResultSet | next() | 移动到下一行数据 |
getInt(String) | 获取当前行指定列的整数值 | |
getString(String) | 获取当前行指定列的字符串值 | |
close() | 关闭ResultSet | |
SQLException | getMessage() | 获取异常消息 |
printStackTrace() | 打印异常堆栈轨迹 |
事务处理
在数据库操作中,事务用于保证一组操作要么全部成功要么全部失败,确保数据一致性。事务具有四个属性(ACID):原子性、一致性、隔离性和持久性。
使用事务
使用Connection
对象的事务控制方法实现数据库事务。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class TransactionExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/mydatabase";
String username = "root";
String password = "password";
try (Connection connection = DriverManager.getConnection(url, username, password)) {
connection.setAutoCommit(false); // 开始事务
try (PreparedStatement pst1 = connection.prepareStatement("UPDATE accounts SET balance = balance - ? WHERE id = ?");
PreparedStatement pst2 = connection.prepareStatement("UPDATE accounts SET balance = balance + ? WHERE id = ?")) {
pst1.setDouble(1, 100.0);
pst1.setInt(2, 1);
pst1.executeUpdate();
pst2.setDouble(1, 100.0);
pst2.setInt(2, 2);
pst2.executeUpdate();
connection.commit(); // 提交事务
System.out.println("Transaction committed successfully.");
} catch (SQLException e) {
connection.rollback(); // 回滚事务
System.out.println("Transaction rolled back.");
e.printStackTrace();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
事务控制方法表
方法 | 描述 | 示例 |
---|---|---|
setAutoCommit(boolean) | 设置是否自动提交事务 | connection.setAutoCommit(false); |
commit() | 提交事务 | connection.commit(); |
rollback() | 回滚事务 | connection.rollback(); |
使用ORM框架:Hibernate
Hibernate是Java的一个流行的ORM(对象关系映射)框架,通过将Java对象映射到数据库表,简化了数据库操作并提高了生产力。
Hibernate配置
Hibernate通过hibernate.cfg.xml
文件进行配置,包括数据库连接信息和映射文件。
示例:hibernate.cfg.xml
<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<!-- 数据库连接配置 -->
<property name="hibernate.connection.driver_class">com.mysql.cj.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/mydatabase</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">password</property>
<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
<!-- 映射类 -->
<mapping class="com.example.User"/>
</session-factory>
</hibernate-configuration>
Hibernate实体类
定义一个实体类,并使用Hibernate注解进行配置。
示例:User实体类
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name = "users")
public class User {
@Id
private int id;
private String name;
private String email;
// Getters and setters
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
使用Hibernate进行数据库操作
使用Hibernate的Session
和Transaction
进行CRUD(创建、读取、更新、删除)操作。
示例:Hibernate CRUD操作
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
public class HibernateCRUDExample {
public static void main(String[] args) {
// 创建SessionFactory
SessionFactory sessionFactory = new Configuration().configure().buildSessionFactory();
// 创建Session
try (Session session = sessionFactory.openSession()) {
// 创建Transaction
Transaction transaction = session.beginTransaction();
// 创建并保存一个新用户
User user = new User();
user.setId(1);
user.setName("John Doe");
user.setEmail("john.doe@example.com");
session.save(user);
System.out.println("User saved!");
// 提交事务
transaction.commit();
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭SessionFactory
sessionFactory.close();
}
}
}
Hibernate常用类与方法表
类/接口 | 方法 | 描述 |
---|---|---|
Configuration | configure() | 加载Hibernate配置文件 |
buildSessionFactory() | 创建SessionFactory 实例 | |
SessionFactory | openSession() | 打开一个新的Session实例 |
close() | 关闭SessionFactory 实例 | |
Session | beginTransaction() | 开始一个新的事务 |
save(Object) | 保存一个对象到数据库 | |
update(Object) | 更新数据库中的一个对象 | |
delete(Object) | 从数据库中删除一个对象 | |
get(Class, Serializable) | 根据标识符从数据库中获取一个对象 | |
Transaction | commit() | 提交事务 |
rollback() | 回滚事务 |
表格总结
JDBC常用类与方法表
类/接口 | 方法 | 描述 |
---|---|---|
DriverManager | getConnection(String, String, String) | 获取数据库连接 |
Connection | createStatement() | 创建Statement 实例 |
prepareStatement(String) | 创建PreparedStatement 实例 | |
close() | 关闭数据库连接 | |
Statement | executeQuery(String) | 执行SQL查询并返回ResultSet |
executeUpdate(String) | 执行SQL更新并返回受影响行数 | |
close() | 关闭Statement | |
PreparedStatement | setString(int, String) | 设置SQL参数值 |
setInt(int, int) | 设置SQL参数值 | |
executeUpdate() | 执行SQL更新并返回受影响行数 | |
executeQuery() | 执行SQL查询并返回ResultSet | |
close() | 关闭PreparedStatement | |
ResultSet | next() | 移动到下一行数据 |
getInt(String) | 获取当前行指定列的整数值 | |
getString(String) | 获取当前行指定列的字符串值 | |
close() | 关闭ResultSet | |
SQLException | getMessage() | 获取异常消息 |
printStackTrace() | 打印异常堆栈轨迹 |
事务控制方法表
方法 | 描述 | 示例 |
---|---|---|
setAutoCommit(boolean) | 设置是否自动提交事务 | connection.setAutoCommit(false); |
commit() | 提交事务 | connection.commit(); |
rollback() | 回滚事务 | connection.rollback(); |
Hibernate常用类与方法表
类/接口 | 方法 | 描述 |
---|---|---|
Configuration | configure() | 加载Hibernate配置文件 |
buildSessionFactory() | 创建SessionFactory 实例 | |
SessionFactory | openSession() | 打开一个新的Session实例 |
close() | 关闭SessionFactory 实例 | |
Session | beginTransaction() | 开始一个新的事务 |
save(Object) | 保存一个对象到数据库 | |
update(Object) | 更新数据库中的一个对象 | |
delete(Object) | 从数据库中删除一个对象 | |
get(Class, Serializable) | 根据标识符从数据库中获取一个对象 | |
Transaction | commit() | 提交事务 |
rollback() | 回滚事务 |
总结
本文详细介绍了Java数据库编程的基础知识,包括JDBC的基本概念、数据库连接与操作、事务处理、以及使用ORM框架如Hibernate。通过示例代码和表格总结,帮助读者更好地理解和应用Java中的数据库编程,提高数据操作的效率和安全性。