JDBC三层架构深入刨析

JDBC(Java Database Connectivity)三层架构指的是将数据库操作分成三个独立的层次:JDBC API、JDBC驱动程序和数据库本身。下面分三个部分详细解释每个层次的作用和相互之间的关系:

JDBC三层架构

JDBC API

JDBC API提供了一系列的类和接口,用于在Java程序中对数据库进行操作,通过JDBC API来实现Java程序和数据库的连接和操作。JDBC API提供了以下最核心的接口:

  • Connection:提供连接数据库的方法。
  • Statement/PreparedStatement:提供数据查询的方法。
  • ResultSet:提供数据集合的访问方法。

同时还有一些其他的接口和类提供异常处理、元数据和事务等操作。JDBC API本身并不包含任何数据库的驱动或实现,只是定义了Java程序与数据库之间的规范。

JDBC驱动程序

JDBC驱动程序是JDBC API与不同数据库之间的连接的关键桥梁。JDBC驱动程序将接收到的JDBC API调用转换成对应的数据库底层API调用,从而使Java程序可以与不同的数据库进行连接和操作。JDBC驱动程序根据驱动类型可以分为以下三种:

  • JDBC-ODBC桥:使用ODBC来连接数据库。
  • 基于本地协议的驱动程序:针对某个特定的数据库。
  • 网络协议驱动程序:通过TCP/IP协议进行通信,支持多种不同的数据库系统。

不同类型的JDBC驱动程序的具体实现方式也有所不同,但是,他们都必须实现JDBC API中定义的接口,以便Java程序能够调用和使用。

数据库本身

数据库本身就是我们需要操作和查询的具体数据存储地方,它可以是关系型数据库或非关系型数据库,根据实际情况选择相应的数据库。

示例

下面我们举两个例子,说明如何使用JDBC API进行数据库操作:

示例一

该示例用Java代码创建一个名为“test”的数据库,然后在其中插入一条数据并查询出来。

import java.sql.*;

public class JdbcDemo {
    public static void main(String[] args) {
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;

        try {
            // 注册数据库驱动程序
            Class.forName("com.mysql.jdbc.Driver");

            // 打开数据库连接
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306", "root", "password");

            // 创建数据库test
            stmt = conn.createStatement();
            stmt.executeUpdate("CREATE DATABASE test");

            // 选中数据库test
            stmt.executeUpdate("USE test");

            // 创建数据表tb_user
            stmt.executeUpdate("CREATE TABLE IF NOT EXISTS tb_user (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(20) NOT NULL, age INT NOT NULL)");

            // 插入数据
            stmt.executeUpdate("INSERT INTO tb_user(name, age) VALUES ('Tom', 18)");

            // 查询数据
            rs = stmt.executeQuery("SELECT * FROM tb_user");
            while (rs.next()) {
                System.out.println("id: " + rs.getInt("id") + " name: " + rs.getString("name") + " age: " + rs.getInt("age"));
            }
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                // 关闭连接
                if (rs != null) {
                    rs.close();
                }
                if (stmt != null) {
                    stmt.close();
                }
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        }
    }
}

示例二

该示例通过PreparedStatement实现了一条插入数据的语句。PreparedStatement是一种特殊的Statement,可以使用占位符,避免SQL注入问题。

import java.sql.*;

public class JdbcDemo {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement pstmt = null;
        ResultSet rs = null;

        try {
            // 注册数据库驱动程序
            Class.forName("com.mysql.jdbc.Driver");

            // 打开数据库连接
            conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test", "root", "password");

            // 插入数据
            pstmt = conn.prepareStatement("INSERT INTO tb_user(name, age) VALUES (?, ?)");
            pstmt.setString(1, "Mike");
            pstmt.setInt(2, 20);
            pstmt.executeUpdate();

            // 查询数据
            rs = pstmt.executeQuery("SELECT * FROM tb_user");
            while (rs.next()) {
                System.out.println("id: " + rs.getInt("id") + " name: " + rs.getString("name") + " age: " + rs.getInt("age"));
            }
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                // 关闭连接
                if (rs != null) {
                    rs.close();
                }
                if (pstmt != null) {
                    pstmt.close();
                }
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        }
    }
}

以上两个示例演示了使用JDBC API进行数据库的连接、创建和操作,JDBC驱动程序将Java程序中定义的API调用转换成相应的数据库调用。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JDBC三层架构深入刨析 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 详谈Java中的二进制及基本的位运算

    详谈Java中的二进制及基本的位运算 什么是二进制 二进制是一种采用0和1两个数码表示数字的方法,被广泛应用于计算机科学领域。在Java中,可以用整型变量存储二进制数。 在Java中,整型变量默认采用十进制存储,但是可以采用其他进制的数字进行初始化。例如: int num1 = 10; // 十进制 int num2 = 0b1010; // 二进制 int…

    Java 2023年5月27日
    00
  • javascript实现留言板功能

    下面是“JavaScript实现留言板功能”的完整攻略。首先,需要进行以下几个步骤: 步骤一:创建HTML页面 首先需要创建一个基本的HTML页面结构。在该页面中需要设置一个textarea、一个提交按钮和一个显示留言的区域。代码示例如下: <!DOCTYPE html> <html lang="en"> <…

    Java 2023年6月15日
    00
  • Mybatis plus多租户方案的实战踩坑记录

    Mybatis plus多租户方案的实战踩坑记录 什么是多租户 多租户,即多租户架构,是一种软件架构模式,指的是多个客户(租户)共用相同的软件应用系统、数据库和服务器等资源,并且每个租户数据是彼此独立,系统中一个租户的数据不能被其他租户访问。 Mybatis plus多租户 Mybatis plus是Mybatis的增强版,提供了多租户的支持,可以通过配置自…

    Java 2023年6月16日
    00
  • mybatis 一对一、一对多和多对多查询实例代码

    当我们使用 MyBatis 进行数据库操作时,经常会遇到需要查询多个表的情况。MyBatis 提供了多种方式来进行多表查询,其中包括一对一、一对多和多对多查询。下面就分别介绍这三种查询方式的实现方法和示例代码。 一对一查询 一对一查询指的是查询两个表中分别有一条对应关系的数据,例如查询订单(order)和客户(customer)两张表中对应的记录。我们可以使…

    Java 2023年5月20日
    00
  • Java8加java10等于Java18的版本查看及特性详解

    Java8加Java10等于Java18的版本查看及特性详解 在本篇攻略中,我们会讲解如何通过一些简单的命令来查看Java版本,并介绍一些Java8和Java10的重要特性。同时,我们还会提到Java18这一版本是否真实存在的问题。 1. 查看Java版本 1.1 使用java -version命令 在命令行中键入java -version命令,可查看当前系…

    Java 2023年5月19日
    00
  • Spring security实现对账户进行加密

    下面我将为您介绍如何使用 Spring Security 实现对账户进行加密的完整攻略。 什么是 Spring Security? Spring Security 是一个基于 Spring 框架的安全框架,可以为 Web 应用程序和服务添加身份验证和授权支持。 密码加密的必要性 将密码进行加密可以防止密码泄露,增加安全性。在 Spring Security …

    Java 2023年5月20日
    00
  • Hibernate实现悲观锁和乐观锁代码介绍

    关于Hibernate实现悲观锁和乐观锁的代码介绍,我们可以分别针对不同的锁机制进行讲解。 一、悲观锁 悲观锁机制在操作数据的时候会先将数据锁定,避免其他线程对该数据的访问和修改。Hibernate提供了两种方式实现悲观锁:使用数据库相关功能实现和使用Hibernate API实现。 1.使用数据库相关功能实现悲观锁 需要在sql语句中使用 for upda…

    Java 2023年5月20日
    00
  • jsp Ewebeditor使用说明

    JSP EWebEditor使用说明 什么是JSP EWebEditor JSP EWebEditor是一个基于JSP技术的所见即所得编辑器。它可以帮助开发者快速地生成富文本编辑器,该编辑器可应用于web页面以及各种不同的应用程序。JSP EWebEditor相比其他编辑器,其最大的特点是易于使用和安装。 JSP EWebEditor安装方法 下载并解压 J…

    Java 2023年6月15日
    00
合作推广
合作推广
分享本页
返回顶部