首页...Java数据库编程基础与实践
Java语言程序设计第九章 Java数据库编程/第二节

Java数据库编程基础与实践

2026-03-24

概述

Java数据库编程是指利用Java语言通过特定的API与数据库系统进行交互,实现数据的存储、查询、更新和管理的过程。本节将围绕Java数据库编程的基础知识、核心技术、工作原理及应用展开,帮助考生系统掌握使用Java进行数据库开发的技能。通过深入学习JDBC的结构、连接数据库的方法、执行SQL语句及处理结果集等内容,提升对Java数据库编程的理解和操作能力。

学习目标:

  • 理解Java数据库编程的基本概念和原理
  • 掌握JDBC的核心API及其使用方法
  • 熟练实现数据库连接、SQL语句执行及结果处理
  • 通过典型实例掌握Java数据库编程的实战技巧
  • 识别常见误区,避免编程错误
  • 掌握Java数据库编程的实际应用场景

核心概念

1. 数据库(Database)

数据库是按照数据结构来组织、存储和管理数据的仓库,支持数据的高效存取和管理。常见数据库包括关系型数据库(如MySQL、Oracle、SQL Server)和非关系型数据库(如MongoDB)。

2. JDBC(Java Database Connectivity)

JDBC是Java语言提供的一套API,用于连接和操作数据库。通过JDBC,Java程序能发送SQL语句到数据库,并处理返回的结果。

3. 数据库连接(Connection)

表示Java应用程序与数据库之间的会话,负责管理与数据库的通信。

4. SQL语句(Structured Query Language)

结构化查询语言,是关系型数据库中用于定义、查询、操作数据的标准语言。

5. 语句对象(Statement、PreparedStatement、CallableStatement)

JDBC中用来执行SQL语句的接口。Statement用于执行静态SQL,PreparedStatement支持预编译SQL语句以提高效率,CallableStatement用于调用存储过程。

6. 结果集(ResultSet)

用于存储SQL查询操作后返回的数据集合,允许程序逐行读取数据。

原理分析

Java数据库编程的核心是JDBC,它提供了一套标准接口连接各种数据库。JDBC的工作原理可以分为以下步骤:

  1. 加载数据库驱动程序:JDBC通过驱动程序(Driver)实现与数据库的通信,加载驱动是连接数据库的第一步。

  2. 建立数据库连接:通过DriverManager获取Connection对象,完成Java程序与数据库的网络连接。

  3. 创建语句对象:利用Connection创建Statement或PreparedStatement对象,用于执行SQL语句。

  4. 执行SQL语句:调用executeQuery或executeUpdate方法执行查询或更新操作。

  5. 处理结果集:如果是查询操作,获取ResultSet对象,遍历并处理数据。

  6. 关闭资源:释放ResultSet、Statement和Connection,避免资源泄露。

整个流程体现了JDBC的设计思想——数据库无关性,Java程序只需调用统一接口,底层驱动负责与特定数据库通信。

详细内容

1. JDBC环境配置

Java数据库编程前需配置JDBC环境:

  • 导入JDBC驱动包:根据使用的数据库类型,下载对应的JDBC驱动(如MySQL的mysql-connector-java.jar),并加入项目classpath。
  • 加载驱动类:使用Class.forName("com.mysql.cj.jdbc.Driver")动态加载驱动。
  • 配置数据库连接字符串:格式一般为jdbc:数据库类型://主机:端口/数据库名?参数。

示例:

String url = "jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC";
String user = "root";
String password = "password";
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection(url, user, password);

注意:JDBC 4.0以后,部分驱动支持自动加载驱动类,可省略Class.forName步骤。

2. 建立数据库连接

建立连接是程序操作数据库的基础。DriverManager管理一组数据库驱动,调用getConnection方法即可获得Connection对象。

关键点:

  • 连接字符串必须正确,包含数据库地址、端口、数据库名称及必要参数。
  • 用户名和密码必须具备数据库访问权限。
  • 连接失败时应捕获SQLException,输出错误信息,便于调试。

常用代码模板:

Connection conn = null;
try {
    conn = DriverManager.getConnection(url, user, password);
    // 业务代码
} catch (SQLException e) {
    e.printStackTrace();
} finally {
    if (conn != null) {
        try { conn.close(); } catch (SQLException e) { e.printStackTrace(); }
    }
}

3. 执行SQL语句

3.1 Statement对象

Statement用于执行简单的SQL语句,适合执行静态SQL,不带参数。

Statement stmt = conn.createStatement();
String sql = "SELECT * FROM student";
ResultSet rs = stmt.executeQuery(sql);

3.2 PreparedStatement对象

PreparedStatement预编译SQL语句,支持参数绑定,提高安全性和性能,防止SQL注入。

String sql = "INSERT INTO student(name, age) VALUES (?, ?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "张三");
pstmt.setInt(2, 20);
pstmt.executeUpdate();

3.3 CallableStatement对象

用于调用数据库存储过程,适用于复杂业务逻辑。

4. 处理结果集

查询操作返回ResultSet对象,通过其提供的方法遍历数据。

常用方法:

  • next(): 指针移动到下一条数据,返回是否有效
  • getInt、getString、getDate等:获取指定字段数据
while (rs.next()) {
    int id = rs.getInt("id");
    String name = rs.getString("name");
    System.out.println(id + ": " + name);
}

5. 事务管理

数据库事务确保一组操作的原子性。JDBC默认自动提交,每条SQL独立提交。可通过Connection设置手动提交,实现事务控制。

示例:

conn.setAutoCommit(false);
try {
    // 执行多条SQL
    conn.commit();
} catch (SQLException e) {
    conn.rollback();
}

6. 资源释放

数据库连接和语句对象消耗资源,必须及时关闭。推荐使用try-with-resources语句自动关闭。

try (Connection conn = DriverManager.getConnection(...);
     PreparedStatement pstmt = conn.prepareStatement(...);
     ResultSet rs = pstmt.executeQuery()) {
    // 处理数据
} catch (SQLException e) {
    e.printStackTrace();
}

实例分析

实例一:查询学生表所有数据

背景:需要从student表中查询所有学生信息,打印到控制台。

public class QueryStudent {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC";
        String user = "root";
        String password = "password";

        try (Connection conn = DriverManager.getConnection(url, user, password);
             Statement stmt = conn.createStatement();
             ResultSet rs = stmt.executeQuery("SELECT id, name, age FROM student")) {

            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                int age = rs.getInt("age");
                System.out.printf("ID: %d, Name: %s, Age: %d\n", id, name, age);
            }

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

分析

  • 使用Statement执行静态SQL
  • 通过ResultSet遍历结果
  • 采用try-with-resources确保资源关闭

结论:代码简洁,适合查询简单数据。

实例二:使用PreparedStatement插入数据

背景:向student表插入新学生信息,确保数据安全。

public class InsertStudent {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC";
        String user = "root";
        String password = "password";

        String sql = "INSERT INTO student(name, age) VALUES (?, ?)";

        try (Connection conn = DriverManager.getConnection(url, user, password);
             PreparedStatement pstmt = conn.prepareStatement(sql)) {

            pstmt.setString(1, "李四");
            pstmt.setInt(2, 22);
            int count = pstmt.executeUpdate();
            System.out.println("插入了" + count + "条记录。");

        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

分析

  • 使用PreparedStatement防止SQL注入
  • 参数化SQL语句,提高性能

结论:适合动态传入参数的SQL操作。

实例三:事务控制示例

背景:需要同时更新两个表中的数据,保证操作的原子性。

public class TransactionDemo {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC";
        String user = "root";
        String password = "password";

        String sql1 = "UPDATE account SET balance = balance - 100 WHERE user_id = 1";
        String sql2 = "UPDATE account SET balance = balance + 100 WHERE user_id = 2";

        try (Connection conn = DriverManager.getConnection(url, user, password);
             Statement stmt = conn.createStatement()) {

            conn.setAutoCommit(false); // 关闭自动提交

            stmt.executeUpdate(sql1);
            stmt.executeUpdate(sql2);

            conn.commit(); // 提交事务
            System.out.println("转账成功。");

        } catch (SQLException e) {
            e.printStackTrace();
            try {
                if (conn != null) {
                    conn.rollback();
                    System.out.println("事务回滚。");
                }
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        }
    }
}

分析

  • 关闭自动提交,手动控制事务
  • 执行多条SQL保证操作的完整性
  • 出错时回滚数据,保证数据一致性

结论:事务机制是保障数据库操作安全的关键。

常见误区

  1. 忽略关闭数据库资源

    • 错误:不关闭Connection、Statement、ResultSet导致资源泄露
    • 正确:使用try-with-resources或finally块关闭所有数据库资源
  2. 使用Statement拼接SQL引发SQL注入

    • 错误:直接拼接字符串,易受恶意输入攻击
    • 正确:使用PreparedStatement参数化SQL语句
  3. 未处理SQLException异常

    • 错误:异常不捕获或不处理,程序崩溃
    • 正确:捕获SQLException,打印日志并合理处理
  4. 数据库连接未配置正确

    • 错误:连接字符串格式错误、驱动未加载导致连接失败
    • 正确:确认驱动版本,格式规范,参数完整
  5. 未开启事务或错误使用事务

    • 错误:复杂操作未使用事务,导致数据不一致
    • 正确:关闭自动提交,合理使用commit和rollback

应用场景

  • 企业信息系统:通过Java访问数据库,实现员工管理、客户管理、库存管理等业务。
  • 电子商务平台:存储商品信息、订单数据,支持在线查询和交易。
  • 金融系统:银行账户操作、交易流水记录等,依赖事务保证数据安全。
  • 数据分析平台:批量查询和统计数据库数据,为决策提供支持。
  • 教育管理系统:学生成绩、课程安排等数据的管理和查询。

知识拓展

  • JPA(Java Persistence API):基于JDBC的高级ORM框架,简化数据库操作。
  • 连接池技术:如C3P0、HikariCP,提高数据库连接效率。
  • NoSQL数据库访问:MongoDB、Redis的Java客户端使用方法。
  • 数据库性能优化:索引设计、SQL调优、缓存技术。
  • 分布式数据库访问:分库分表、读写分离技术研究。

总结回顾

本节详细介绍了Java数据库编程的核心内容:

  • 理解数据库及JDBC的基本概念和作用
  • 掌握如何配置环境并建立数据库连接
  • 熟练使用Statement、PreparedStatement执行SQL语句
  • 掌握ResultSet结果集的遍历和数据提取
  • 理解并应用事务管理保证数据一致性
  • 通过实例加深对Java数据库编程的理解和掌握
  • 注意常见误区,避免编程错误
  • 认识Java数据库编程在各行业中的应用价值

通过系统学习,考生能够具备独立完成Java数据库开发的能力,为全国计算机等级考试二级Java语言程序设计的数据库编程部分打下坚实基础。

关键知识点

  • JDBC的概念与作用
  • 数据库连接的建立与关闭
  • Statement与PreparedStatement的区别及使用
  • ResultSet数据的读取方法
  • SQL执行方式及事务管理
  • 资源释放的重要性
  • 预防SQL注入的正确做法
  • 事务的开启、提交与回滚
  • 常见数据库操作实例
  • Java数据库编程的应用场景

重点知识点

1

JDBC的基本概念与结构

2

数据库连接的建立与管理

3

Statement与PreparedStatement的区别及应用

4

ResultSet的使用及数据遍历

5

事务管理及其实现方式

6

资源关闭的重要性和方法

7

防止SQL注入的有效措施

8

典型Java数据库编程实例

9

常见编程误区及解决策略

10

Java数据库编程的实际应用场景