第九章 Java数据库编程
第一节 Java数据库编程基础
概述
本节主要介绍Java语言中数据库编程的基础知识,重点讲解JDBC(Java DataBase Connectivity)技术的核心内容。通过学习本节内容,考生能够理解数据库与Java程序的连接原理,掌握JDBC的使用步骤和基本编程方法,为后续复杂数据库操作打下坚实基础。
学习目标:
- 理解数据库编程的意义及Java中数据库编程的基本流程
- 掌握JDBC的核心接口和类
- 能够编写简单的Java数据库连接程序,实现数据的增删改查
- 熟悉数据库操作中的常见问题及解决方法
核心概念
数据库(Database):用于存储结构化数据的系统,支持数据的存储、管理和查询。
数据库管理系统(DBMS):管理数据库的软件,如MySQL、Oracle、SQL Server等。
JDBC(Java Database Connectivity):Java语言访问数据库的标准API,提供统一的接口来操作不同类型的数据库。
驱动程序(Driver):实现JDBC接口的数据库厂商提供的连接和操作数据库的驱动。
连接对象(Connection):表示Java程序与数据库之间的连接。
语句对象(Statement、PreparedStatement):用于执行SQL语句。
结果集对象(ResultSet):用于存储查询结果。
原理分析
Java数据库编程主要依赖JDBC API,核心原理是通过JDBC驱动程序实现Java程序与数据库的通信。整个过程包括:
- 加载数据库驱动:JDBC驱动负责将Java的数据库请求转换为数据库能理解的协议。
- 建立数据库连接:通过Connection对象与数据库建立通信通道。
- 执行SQL语句:使用Statement或PreparedStatement对象执行增删改查操作。
- 处理结果集:查询操作返回ResultSet对象,通过它读取数据。
- 关闭资源:释放数据库连接及相关资源,防止内存泄漏。
这种机制保证了Java程序可以独立于具体数据库,实现跨数据库访问。
详细内容
1. JDBC简介与架构
JDBC是Java访问数据库的标准接口,定义了一组API来实现数据库连接和操作。JDBC架构包括四个主要部分:
- JDBC驱动管理器(DriverManager):负责加载驱动并建立连接。
- JDBC驱动程序(Driver):实现具体数据库操作。
- JDBC接口:连接对象(Connection)、语句对象(Statement)、结果集对象(ResultSet)等。
- 应用程序:使用JDBC接口访问数据库。
JDBC驱动分为四种类型:
- 类型1:JDBC-ODBC桥驱动
- 类型2:本地API驱动
- 类型3:网络协议驱动
- 类型4:纯Java驱动(最常用)
2. 连接数据库的步骤
编写JDBC程序访问数据库,通常遵循以下步骤:
- 加载驱动类
Class.forName("com.mysql.cj.jdbc.Driver"); - 建立数据库连接
Connection conn = DriverManager.getConnection(url, username, password); - 创建语句对象
Statement stmt = conn.createStatement(); - 执行SQL语句
- 查询:
ResultSet rs = stmt.executeQuery("SELECT * FROM users"); - 更新:
int count = stmt.executeUpdate("INSERT INTO users VALUES (...) ");
- 查询:
- 处理结果集
while(rs.next()) { String name = rs.getString("name"); int age = rs.getInt("age"); } - 关闭资源
rs.close(); stmt.close(); conn.close();
3. Statement与PreparedStatement的使用
- Statement适合执行简单的SQL语句,但存在SQL注入风险。
- PreparedStatement预编译SQL,支持参数设置,更安全且执行效率更高。
示例:
String sql = "SELECT * FROM users WHERE id = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1, 10);
ResultSet rs = ps.executeQuery();
4. 事务管理
JDBC支持事务控制,默认自动提交。通过关闭自动提交,实现事务处理:
conn.setAutoCommit(false);
try {
// 执行多个数据库操作
conn.commit();
} catch(SQLException e) {
conn.rollback();
}
事务保证数据的一致性和完整性。
5. 异常处理与资源释放
数据库操作可能抛出SQLException,必须捕获和处理。建议采用try-with-resources语句自动关闭资源,确保连接不会泄漏。
try (Connection conn = DriverManager.getConnection(...);
PreparedStatement ps = conn.prepareStatement(...);
ResultSet rs = ps.executeQuery()) {
// 处理数据
} catch (SQLException e) {
e.printStackTrace();
}
实例分析
实例一:连接MySQL数据库并查询数据
背景:从学生信息表中查询所有学生姓名和年龄。
代码分析:
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/school";
Connection conn = DriverManager.getConnection(url, "root", "password");
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT name, age FROM students");
while(rs.next()) {
System.out.println("姓名:" + rs.getString("name") + ", 年龄:" + rs.getInt("age"));
}
rs.close();
stmt.close();
conn.close();
结论:通过JDBC实现基本查询,理解连接、执行、结果处理流程。
实例二:使用PreparedStatement添加用户数据
背景:向用户表插入新用户,防止SQL注入。
代码分析:
String sql = "INSERT INTO users(username, password) VALUES (?, ?)";
try (Connection conn = DriverManager.getConnection(...);
PreparedStatement ps = conn.prepareStatement(sql)) {
ps.setString(1, "alice");
ps.setString(2, "123456");
int rows = ps.executeUpdate();
System.out.println("插入行数:" + rows);
}
结论:PreparedStatement预编译语句提高安全性和效率。
实例三:事务控制示例
背景:银行转账操作,涉及扣款和加款两步操作,需保证事务一致性。
代码分析:
conn.setAutoCommit(false);
try {
PreparedStatement ps1 = conn.prepareStatement("UPDATE account SET balance = balance - ? WHERE id = ?");
ps1.setDouble(1, 1000);
ps1.setInt(2, 1);
ps1.executeUpdate();
PreparedStatement ps2 = conn.prepareStatement("UPDATE account SET balance = balance + ? WHERE id = ?");
ps2.setDouble(1, 1000);
ps2.setInt(2, 2);
ps2.executeUpdate();
conn.commit();
} catch(SQLException e) {
conn.rollback();
e.printStackTrace();
}
结论:使用事务保证操作的原子性和数据一致性。
常见误区
- 忘记加载驱动类:导致无法连接数据库。正确做法是使用Class.forName加载驱动。
- 未关闭数据库资源:容易造成内存泄漏,使用try-with-resources防止。
- 使用Statement拼接SQL,导致SQL注入:应使用PreparedStatement。
- 忽略异常处理:SQLException必须捕获,防止程序崩溃。
- 未正确管理事务:自动提交关闭后忘记commit或rollback,会导致数据不一致。
应用场景
- 企业级应用数据处理:后台服务与数据库交互,实现用户管理、订单处理等功能。
- 数据分析与报表生成:从数据库读取数据,进行统计和分析。
- 网站动态内容管理:通过数据库维护网站内容,实现动态页面展示。
- 移动应用后台支持:手机应用通过Java服务器端操作数据库,存储用户数据。
- 教育考试系统:管理考试题库、学生成绩等数据。
知识拓展
- 连接池技术:如C3P0、DBCP,提升数据库连接效率。
- ORM框架:如Hibernate、MyBatis,简化数据库操作。
- SQL优化技巧:索引、查询优化,提升性能。
- 分布式数据库系统:理解分布式数据库与JDBC的结合。
总结回顾
本节内容系统介绍了Java数据库编程的基础知识,重点掌握了JDBC的工作原理和使用步骤。通过实例演示了如何连接数据库、执行SQL语句及处理结果集。理解并掌握了Statement与PreparedStatement的区别,事务的基本应用,以及异常处理和资源释放的重要性。掌握这些知识是Java数据库编程的基础,为后续深入学习JDBC高级用法及相关框架打下坚实基础。