跳转至

网络编程与数据库连接:JDBC基础

概述

JDBC(Java Database Connectivity)是Java语言中用于与数据库进行交互的API。它提供了一种标准的方法来访问各种关系型数据库,如MySQL、Oracle、PostgreSQL等。通过JDBC,Java程序可以执行SQL语句、处理结果集、管理事务等。

在本章中,我们将介绍JDBC的基本概念、如何使用JDBC连接数据库、执行SQL语句以及处理结果集。我们还将通过几个代码示例来演示这些概念。

JDBC的基本概念

JDBC驱动

JDBC驱动是JDBC API与特定数据库之间的桥梁。不同的数据库需要不同的JDBC驱动。常见的JDBC驱动类型包括:

  1. JDBC-ODBC桥接驱动:通过ODBC(Open Database Connectivity)连接数据库。
  2. 本地API驱动:使用数据库提供的本地API进行连接。
  3. 网络协议驱动:通过中间件服务器连接数据库。
  4. 纯Java驱动:完全用Java编写的驱动,直接与数据库通信。

JDBC API

JDBC API主要由以下几个接口和类组成:

  • DriverManager:用于管理JDBC驱动。
  • Connection:表示与数据库的连接。
  • Statement:用于执行SQL语句。
  • PreparedStatement:预编译的SQL语句,可以提高性能。
  • ResultSet:表示SQL查询的结果集。

JDBC的使用步骤

使用JDBC连接数据库并执行SQL语句通常包括以下步骤:

  1. 加载JDBC驱动:使用Class.forName()方法加载数据库的JDBC驱动。
  2. 建立连接:使用DriverManager.getConnection()方法建立与数据库的连接。
  3. 创建Statement对象:使用Connection.createStatement()方法创建Statement对象。
  4. 执行SQL语句:使用Statement.executeQuery()Statement.executeUpdate()方法执行SQL语句。
  5. 处理结果集:如果执行的是查询语句,使用ResultSet对象处理查询结果。
  6. 关闭连接:使用Connection.close()方法关闭数据库连接。

代码示例

示例1:加载JDBC驱动并建立连接

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class JDBCExample1 {
    public static void main(String[] args) {
        // JDBC驱动类名
        String driver = "com.mysql.cj.jdbc.Driver";
        // 数据库URL
        String url = "jdbc:mysql://localhost:3306/mydatabase";
        // 数据库用户名
        String user = "root";
        // 数据库密码
        String password = "password";

        try {
            // 加载JDBC驱动
            Class.forName(driver);
            // 建立数据库连接
            Connection conn = DriverManager.getConnection(url, user, password);
            System.out.println("数据库连接成功!");
            // 关闭连接
            conn.close();
        } catch (ClassNotFoundException e) {
            System.out.println("找不到JDBC驱动类!");
            e.printStackTrace();
        } catch (SQLException e) {
            System.out.println("数据库连接失败!");
            e.printStackTrace();
        }
    }
}

解释: - 在这个示例中,我们首先加载了MySQL的JDBC驱动类com.mysql.cj.jdbc.Driver。 - 然后使用DriverManager.getConnection()方法建立与数据库的连接。 - 最后,我们关闭了数据库连接。

示例2:执行SQL查询并处理结果集

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCExample2 {
    public static void main(String[] args) {
        String driver = "com.mysql.cj.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/mydatabase";
        String user = "root";
        String password = "password";

        try {
            Class.forName(driver);
            Connection conn = DriverManager.getConnection(url, user, password);
            System.out.println("数据库连接成功!");

            // 创建Statement对象
            Statement stmt = conn.createStatement();
            // 执行SQL查询
            ResultSet rs = stmt.executeQuery("SELECT * FROM employees");

            // 处理结果集
            while (rs.next()) {
                int id = rs.getInt("id");
                String name = rs.getString("name");
                int age = rs.getInt("age");
                System.out.println("ID: " + id + ", Name: " + name + ", Age: " + age);
            }

            // 关闭结果集和Statement对象
            rs.close();
            stmt.close();
            // 关闭连接
            conn.close();
        } catch (ClassNotFoundException e) {
            System.out.println("找不到JDBC驱动类!");
            e.printStackTrace();
        } catch (SQLException e) {
            System.out.println("数据库操作失败!");
            e.printStackTrace();
        }
    }
}

解释: - 在这个示例中,我们创建了一个Statement对象,并使用它执行了一个SQL查询。 - 查询结果存储在ResultSet对象中,我们通过rs.next()方法遍历结果集,并获取每一行的数据。 - 最后,我们关闭了结果集、Statement对象和数据库连接。

示例3:使用PreparedStatement执行SQL更新

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class JDBCExample3 {
    public static void main(String[] args) {
        String driver = "com.mysql.cj.jdbc.Driver";
        String url = "jdbc:mysql://localhost:3306/mydatabase";
        String user = "root";
        String password = "password";

        try {
            Class.forName(driver);
            Connection conn = DriverManager.getConnection(url, user, password);
            System.out.println("数据库连接成功!");

            // 使用PreparedStatement执行SQL更新
            String sql = "UPDATE employees SET age = ? WHERE id = ?";
            PreparedStatement pstmt = conn.prepareStatement(sql);
            pstmt.setInt(1, 30);  // 设置第一个参数(age)
            pstmt.setInt(2, 1);   // 设置第二个参数(id)

            // 执行更新
            int rowsUpdated = pstmt.executeUpdate();
            System.out.println("更新了 " + rowsUpdated + " 行数据。");

            // 关闭PreparedStatement对象
            pstmt.close();
            // 关闭连接
            conn.close();
        } catch (ClassNotFoundException e) {
            System.out.println("找不到JDBC驱动类!");
            e.printStackTrace();
        } catch (SQLException e) {
            System.out.println("数据库操作失败!");
            e.printStackTrace();
        }
    }
}

解释: - 在这个示例中,我们使用了PreparedStatement来执行SQL更新操作。 - PreparedStatement允许我们使用占位符(?)来设置参数,这样可以防止SQL注入攻击。 - 我们通过pstmt.setInt()方法设置了两个参数,然后执行了更新操作。 - 最后,我们关闭了PreparedStatement对象和数据库连接。

练习题

练习1:连接数据库并查询所有用户

编写一个Java程序,连接到MySQL数据库,并查询users表中的所有用户信息。要求输出每个用户的idusernameemail

练习2:插入新用户

编写一个Java程序,使用PreparedStatementusers表中插入一条新记录。要求用户输入usernameemail,并将这些信息插入到数据库中。

练习3:事务处理

编写一个Java程序,演示如何使用JDBC进行事务处理。要求在一个事务中执行多个SQL操作(如插入、更新、删除),并在出现错误时回滚事务。

总结

在本章中,我们介绍了JDBC的基本概念和使用方法。我们学习了如何加载JDBC驱动、建立数据库连接、执行SQL语句以及处理结果集。我们还通过几个代码示例演示了这些概念的实际应用。

关键点总结: - JDBC是Java与数据库交互的标准API。 - 使用JDBC连接数据库的步骤包括加载驱动、建立连接、创建Statement对象、执行SQL语句、处理结果集和关闭连接。 - PreparedStatement可以提高SQL执行的安全性,并防止SQL注入攻击。 - 事务处理可以确保多个SQL操作的原子性,要么全部成功,要么全部失败。

通过本章的学习,你应该能够使用JDBC连接数据库并执行基本的SQL操作。希望这些内容对你理解和使用JDBC有所帮助!