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日

相关文章

  • Spring单元测试控制Bean注入的方式

    下面我们就详细讲解一下Spring单元测试控制Bean注入的方式的完整攻略吧。 什么是Spring单元测试 Spring单元测试是指在Spring环境下执行单元测试。它可以模拟一个Web容器环境,通过IoC和AOP的支持,创建出被测试类的实例,来执行相应的测试操作。 Spring单元测试控制Bean注入的方式 在Spring单元测试中,我们有三种方式可以控制…

    Java 2023年5月19日
    00
  • JAVA 获取系统当前时间实例代码

    获取系统当前时间是日常开发中经常遇到的需求, JAVA 提供了多种方式来获取系统当前时间,以下是获取系统当前时间实例代码的完整攻略: 获取系统当前时间的常见方式 使用 java.util.Date 类和 java.text.SimpleDateFormat 类,将当前时间转换为指定格式的字符串。 import java.util.Date; import j…

    Java 2023年5月20日
    00
  • Sprint Boot @DeleteMapping使用方法详解

    @DeleteMapping是Spring Boot中的一个注解,它用于将HTTP DELETE请求映射到控制器方法上。在使用Spring Boot开发Web应用程序时,@DeleteMapping是非常重要的。本文将详细介绍@DeleteMapping的作用和使用方法,并提供两个示例说明。 @DeleteMapping的作用 @DeleteMapping的…

    Java 2023年5月5日
    00
  • Java实现的具有GUI的校园导航系统的完整代码

    让我来详细讲解一下“Java实现的具有GUI的校园导航系统的完整代码”的完整攻略。 一、项目概览 该项目主要是利用Java语言实现校园导航系统,具有GUI界面,能够定位、查询、显示校园内的地点信息等功能。该项目可以说是一个比较复杂的Java应用程序,其主要技术点如下: Java基础语言知识,包括类、对象、接口、异常等; Java GUI,主要使用Swing组…

    Java 2023年5月24日
    00
  • java实现字符串的全排列

    Java实现字符串的全排列 在Java中实现字符串的全排列需要使用递归算法。以下是具体的实现过程: 算法思路 将字符串转换为字符数组。 对字符数组进行排序,确保全排列按照字典序输出。 从第一个字符开始,依次和后面的字符交换位置。 对第一步和第三步进行递归操作,直到选定的第一个字符后面没有其他可选字符为止。 交换字符数组中已经选定的字符和下一位字符的位置,回溯…

    Java 2023年5月26日
    00
  • MyBatis实践之DAO与Mapper

    MyBatis实践之DAO与Mapper攻略 MyBatis是一个流行的ORM框架。它使用XML文件或注释映射Java对象到数据库,并提供了一组强大的特性来处理数据库操作。本文将详细讲解MyBatis中的DAO和Mapper,并提供两个示例以演示它们的使用。 DAO DAO(Data Access Object)是一种数据访问设计模式,它将数据访问从业务逻辑…

    Java 2023年5月20日
    00
  • JVM 是如何工作的?

    以下是关于JVM工作原理的完整使用攻略: JVM是什么? JVM(Java Virtual Machine)是Java虚机的缩写,是Java程序运行的环境。JVM是一种虚机,它可以在不同的操作系统上运行Java程序,提供了程序的跨平性。 JVM的工作原理 JVM的工作原理可以分为以下几个步骤: 加载:JVM将Java的.class加载到内存中。 验证:JVM…

    Java 2023年5月12日
    00
  • 常见的java面试题

    常见的Java面试题攻略 一. Java基础 1. 什么是Java? Java是一门基于类的、面向对象的编程语言,由Sun Microsystems公司于1995年发布。Java跨平台、安全性高、易于学习等特点使它成为一门广泛使用的编程语言。 2. int和Integer有何区别? int是Java的原始数据类型,它的值由32位的二进制数字表示。而Integ…

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