Java 中文官方教程 2022 版(三十四)(1)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: Java 中文官方教程 2022 版(三十四)

长期持久性

原文:docs.oracle.com/javase/tutorial/javabeans/advanced/longpersistence.html

长期持久性是一种模型,可以将 bean 保存为 XML 格式。

有关 XML 格式和如何为非 bean 实现长期持久性的信息,请参阅XML 模式使用 XMLEncoder

编码器和解码器

XMLEncoder类用于编写Serializable对象的文本表示的输出文件。以下代码片段是将 Java bean 及其属性以 XML 格式写入的示例:

XMLEncoder encoder = new XMLEncoder(
           new BufferedOutputStream(
           new FileOutputStream("Beanarchive.xml")));
encoder.writeObject(object);
encoder.close(); 

XMLDecoder类读取使用 XMLEncoder 创建的 XML 文档

XMLDecoder decoder = new XMLDecoder(
    new BufferedInputStream(
    new FileInputStream("Beanarchive.xml")));
Object object = decoder.readObject();
decoder.close();

XML 中有什么?

XML bean 存档具有自己特定的语法,其中包括以下标签来表示每个 bean 元素:

  • 用于描述 XML 版本和编码类型的 XML 前言
  • 一个****标签,用于包含 bean 的所有对象元素
  • 一个****标签,用于表示从其序列化形式重建对象所需的一组方法调用
    <object class="javax.swing.JButton" method="new">
        <string>Ok</string>
    </object>
    • 或语句
    <object class="javax.swing.JButton">
        <void method="setText">
            <string>Cancel</string>
                </void>
        </object>
    • 用于定义适当的基本类型的标签:
    • ****
    • ****
    • ****
    • ****
    • ****
    • ****
    • ****
    • ****
    <int>5555</int>
    • 一个**<class>**标签,用于表示 Class 的一个实例。
    <class>java.swing.JFrame</class>
    • 一个**<array>**标签用于定义数组
    <array class="java.lang.String" length="5">
    </array>

    以下代码表示将为SimpleBean组件生成的 XML 存档:

    <?xml version="1.0" encoding="UTF-8" ?>
    <java>
      <object class="javax.swing.JFrame">
        <void method="add">
          <object class="java.awt.BorderLayout" field="CENTER"/>
          <object class="SimpleBean"/>
        </void>
        <void property="defaultCloseOperation">
          <object class="javax.swing.WindowConstants" field="DISPOSE_ON_CLOSE"/>
        </void>
        <void method="pack"/>
        <void property="visible">
          <boolean>true</boolean>
        </void>
      </object>
    </java>

    Bean 自定义

    原文:docs.oracle.com/javase/tutorial/javabeans/advanced/customization.html

    自定义提供了一种修改 Bean 外观和行为的方式,使其在应用程序构建器中满足您的特定需求。对于 Bean 开发人员,有几个级别的自定义可用,以允许其他开发人员充分利用 Bean 的潜在功能。


    以下链接对学习有关属性编辑器和自定义器很有用:


    在符合 Beans 规范的构建工具中,可以在设计时自定义 Bean 的外观和行为。有两种方式可以自定义 Bean:

    • 通过使用属性编辑器。每个 Bean 属性都有自己的属性编辑器。NetBeans GUI Builder 通常在属性窗口中显示 Bean 的属性编辑器。与特定属性类型相关联的属性编辑器编辑该属性类型。
    • 通过使用自定义器。自定义器为您提供了完全的 GUI 控制权,用于对 Bean 进行自定义。当属性编辑器不实用或不适用时,将使用自定义器。与属性关联的属性编辑器不同,自定义器与 Bean 关联。

    属性编辑器

    属性编辑器是用于自定义特定属性类型的工具。属性编辑器在属性窗口中激活。此窗口确定属性的类型,搜索相关的属性编辑器,并以相关方式显示属性的当前值。

    属性编辑器必须实现PropertyEditor接口,该接口提供了指定属性在属性表中如何显示的方法。以下图表示包含myBean1属性的属性窗口:


    您可以通过单击属性条目开始编辑这些属性。单击大多数条目将弹出单独的面板。例如,要设置foregroundbackground,请使用带有颜色选择的选择框,或按下“…”按钮以使用标准 ColorEditor 窗口。单击toolTipText属性将打开 StringEditor 窗口。

    支持类PropertyEditorSupport提供了PropertyEditor接口的默认实现。通过从PropertyEditorSupport子类化您的属性编辑器,您可以简单地重写您需要的方法。

    要在属性窗口中显示当前属性值"sample",需要重写isPaintable以返回true。然后必须重写paintValue以在属性表中的矩形中绘制当前属性值。以下是ColorEditor如何实现paintValue

    public void paintValue(java.awt.Graphics gfx, java.awt.Rectangle box) {
        Color oldColor = gfx.getColor();
        gfx.setColor(Color.black);
        gfx.drawRect(box.x, box.y, box.width-3, box.height-3);
        gfx.setColor(color);
        gfx.fillRect(box.x+1, box.y+1, box.width-4, box.height-4);
        gfx.setColor(oldColor);
    }

    要支持自定义属性编辑器,需要重写另外两个方法。重写supportsCustomEditor以返回 true,然后重写getCustomEditor以返回自定义编辑器实例。ColorEditor.getCustomEditor返回this

    此外,PropertyEditorSupport类维护一个PropertyChangeListener列表,并在绑定属性更改时向这些侦听器发送属性更改事件通知。

    如何将属性编辑器与属性关联

    属性编辑器是通过以下方式发现并与给定属性关联的:

    • 通过BeanInfo对象进行显式关联。标题的编辑器通过以下代码行设置:
    pd.setPropertyEditorClass(TitleEditor.class);
    • 通过java.beans.PropertyEditorManager.registerEditor方法进行显式注册。此方法接受两个参数:bean 类类型和要与该类型关联的编辑器类。
    • 名称搜索。如果一个类没有明确关联的属性编辑器,那么PropertyEditorManager将通过以下方式搜索该类的属性编辑器:
    • 将"Editor"附加到完全限定的类名。例如,对于my.package.ComplexNumber类,属性编辑器管理器将搜索my.package.ComplexNumberEditor类。
    • 将"Editor"附加到类名并搜索类路径。

    自定义器

    您已经了解到构建工具为您创建自己的属性编辑器提供支持。对于复杂的、工业强度的 bean,视觉构建器应满足哪些其他需求?有时,将一个单一根选择关于 bean 类型渲染的一半属性变得无关紧要是不可取的。JavaBeans 规范提供了用户定义的自定义器,通过它们您可以为 bean 属性定义比属性编辑器提供的更高级别的定制。

    当您使用一个 bean 自定义器时,您完全控制如何配置或编辑一个 bean。自定义器是专门针对 bean 定制的应用程序。有时属性不足以表示 bean 的可配置属性。自定义器用于需要复杂指令来更改 bean 的地方,以及属性编辑器过于原始无法实现 bean 定制的地方。

    所有自定义器必须:

    • 扩展java.awt.Component或其子类之一。
    • 实现java.beans.Customizer接口,这意味着实现方法来注册PropertyChangeListener对象,并在目标 bean 发生更改时向这些侦听器触发属性更改事件。
    • 实现一个默认构造函数。
    • 通过BeanInfo.getBeanDescriptor将自定义器与其目标类关联。

    教程:JDBC 数据库访问

    原文:docs.oracle.com/javase/tutorial/jdbc/index.html

    JDBC API 的设计初衷是让简单的事情保持简单。这意味着 JDBC 使得日常数据库任务变得容易。这个教程将通过示例引导您使用 JDBC 执行常见的 SQL 语句,并执行数据库应用程序常见的其他目标。

    这个教程分为以下几个课程:

    列出了 JDBC 的特性,描述了 JDBC 架构,并回顾了 SQL 命令和关系数据库概念。

    涵盖了 JDBC API。

    在第一课结束时,您将学会如何使用基本的 JDBC API 来创建表,向表中插入值,查询表,检索查询结果,并更新表。在这个过程中,您将学会如何使用简单语句和预编译语句,并看到一个存储过程的示例。您还将学会如何执行事务,以及如何捕获异常和警告。

    教程:JDBC 简介

    原文:docs.oracle.com/javase/tutorial/jdbc/overview/index.html

    JDBC API 是一个可以访问任何类型表格数据的 Java API,特别是存储在关系数据库中的数据。

    JDBC 帮助您编写管理这三种编程活动的 Java 应用程序:

    1. 连接到数据源,比如数据库
    2. 向数据库发送查询和更新语句
    3. 从数据库中检索并处理查询结果

    以下简单的代码片段给出了这三个步骤的简单示例:

    public void connectToAndQueryDatabase(String username, String password) {
        Connection con = DriverManager.getConnection(
                             "jdbc:myDriver:myDatabase",
                             username,
                             password);
        Statement stmt = con.createStatement();
        ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1");
        while (rs.next()) {
            int x = rs.getInt("a");
            String s = rs.getString("b");
            float f = rs.getFloat("c");
        }
    }

    这段简短的代码片段实例化了一个DriverManager对象,用于连接数据库驱动程序并登录数据库,实例化了一个Statement对象,将您的 SQL 语言查询传递给数据库;实例化了一个ResultSet对象,检索您的查询结果,并执行一个简单的while循环,用于检索和显示这些结果。就是这么简单。

    JDBC 产品组件

    JDBC 包括四个组件:

    1. JDBC API — JDBC™ API 提供了从 Java™编程语言对关系数据进行编程访问的方式。使用 JDBC API,应用程序可以执行 SQL 语句,检索结果,并将更改传播回底层数据源。JDBC API 还可以在分布式、异构环境中与多个数据源交互。
      JDBC API 是 Java 平台的一部分,包括Java™标准版(Java™ SE)和Java™企业版(Java™ EE)。JDBC 4.0 API 分为两个包:java.sqljavax.sql. 这两个包都包含在 Java SE 和 Java EE 平台中。
    2. JDBC 驱动管理器 — JDBC DriverManager类定义了可以将 Java 应用程序连接到 JDBC 驱动程序的对象。DriverManager一直是 JDBC 架构的支柱。它非常小而简单。
      标准扩展包javax.namingjavax.sql允许您使用注册到Java 命名和目录接口™(JNDI)命名服务的DataSource对象与数据源建立连接。您可以使用任一连接机制,但尽可能使用DataSource对象是推荐的。
    3. JDBC 测试套件 — JDBC 驱动程序测试套件帮助您确定 JDBC 驱动程序是否能运行您的程序。这些测试并不全面或详尽,但它们确实涵盖了 JDBC API 中的许多重要特性。
    4. JDBC-ODBC 桥 — Java 软件桥通过 ODBC 驱动程序提供 JDBC 访问。请注意,您需要将 ODBC 二进制代码加载到每台使用此驱动程序的客户端机器上。因此,ODBC 驱动程序最适合用于企业网络,其中客户端安装不是一个主要问题,或者用于在 Java 中编写的应用程序服务器代码的三层架构。

    这个教程使用这四个 JDBC 组件中的前两个来连接数据库,然后构建一个使用 SQL 命令与测试关系数据库通信的 Java 程序。最后两个组件用于在专业环境中测试 Web 应用程序,或与支持 ODBC 的数据库管理系统通信。

    JDBC 架构

    原文:docs.oracle.com/javase/tutorial/jdbc/overview/architecture.html

    JDBC API 支持数据库访问的两层和三层处理模型。

    图 1:用于数据访问的两层架构。


    在两层模型中,Java 小程序或应用程序直接与数据源通信。这需要一个能够与被访问的特定数据源通信的 JDBC 驱动程序。用户的命令被传递到数据库或其他数据源,并将这些语句的结果发送回用户。数据源可能位于用户通过网络连接的另一台机器上。这被称为客户端/服务器配置,用户的机器是客户端,而托管数据源的机器是服务器。网络可以是一个内部网络,例如连接公司内部员工的网络,也可以是互联网。

    在三层模型中,命令被发送到一个“中间层”服务,然后再将命令发送到数据源。数据源处理命令并将结果发送回中间层,然后再发送给用户。MIS 主管发现三层模型非常有吸引力,因为中间层使得可以控制对企业数据的访问和更新类型。另一个优点是简化了应用程序的部署。最后,在许多情况下,三层架构可以提供性能优势。

    图 2:用于数据访问的三层架构。


    直到最近,中间层通常是用诸如 C 或 C++之类的语言编写的,这些语言提供了快速的性能。然而,随着将 Java 字节码转换为高效的机器特定代码的优化编译器的引入,以及诸如 Enterprise JavaBeans™之类的技术,Java 平台正迅速成为中间层开发的标准平台。这是一个巨大的优势,使得可以利用 Java 的健壮性、多线程和安全功能。

    随着企业越来越多地使用 Java 编程语言编写服务器代码,JDBC API 在三层架构的中间层中被越来越多地使用。使 JDBC 成为服务器技术的一些特点包括其支持连接池、分布式事务和断开的行集。JDBC API 也是允许从 Java 中间层访问数据源的途径。

    关系数据库概述

    原文:docs.oracle.com/javase/tutorial/jdbc/overview/database.html

    数据库是一种以便于检索信息的方式存储信息的手段。简单来说,关系数据库是以行和列的形式呈现信息的数据库。表被称为关系,因为它是相同类型对象(行)的集合。表中的数据可以根据共同的键或概念相关联,从表中检索相关数据的能力是关系数据库这个术语的基础。数据库管理系统(DBMS)处理数据的存储、维护和检索方式。在关系数据库的情况下,关系数据库管理系统(RDBMS)执行这些任务。本书中使用的 DBMS 是一个包括 RDBMS 在内的通用术语。

    完整性规则

    关系表遵循某些完整性规则,以确保它们包含的数据保持准确并始终可访问。首先,关系表中的行应该都是不同的。如果有重复的行,解决哪一个是正确选择的问题可能会出现问题。对于大多数 DBMS,用户可以指定不允许重复行,如果这样做,DBMS 将阻止添加任何重复现有行的行。

    传统关系模型的第二个完整性规则是列值不能是重复组或数组。数据完整性的第三个方面涉及空值的概念。数据库通过使用空值来指示缺失值的情况。它不等同于空白或零。空白被认为等于另一个空白,零等于另一个零,但两个空值不被视为相等。

    当表中的每一行都不同时,可以使用一个或多个列来标识特定行。这个唯一的列或列组称为主键。任何作为主键的列都不能为 null;如果是,包含它的主键将不再是完整的标识符。这个规则称为实体完整性。

    Employees表展示了一些关系数据库概念。它有五列和六行,每行代表一个不同的雇员。

    Employees

    员工编号 出生日期 车牌号
    10001 阿克塞尔 华盛顿 43 年 8 月 28 日 5
    10083 阿维德 沙玛 54 年 11 月 24 日 null
    10120 乔纳斯 金斯伯格 69 年 1 月 1 日 null
    10005 弗洛伦斯 沃约科夫斯基 71 年 7 月 4 日 12
    10099 肖恩 华盛顿 66 年 9 月 21 日 null
    10035 伊丽莎白 山口 59 年 12 月 24 日 null

    该表的主键通常会是员工编号,因为每个员工编号都保证是不同的。(数字比字符串更有效率用于比较。)也可以使用 First_NameLast_Name,因为两者的组合在我们的示例数据库中也只标识一行。仅使用姓氏将不起作用,因为有两个姓氏为“Washington”的员工。在这种特殊情况下,名字都是不同的,因此可以想象使用该列作为主键,但最好避免使用可能出现重复的列。如果 Elizabeth Yamaguchi 在这家公司找到工作,而主键是 First_Name,则关系数据库管理系统将不允许添加她的名字(如果已经指定不允许重复)。因为表中已经有一个 Elizabeth,再添加一个将使主键无法作为标识一行的方法。请注意,虽然使用 First_NameLast_Name 是这个示例的唯一复合键,但在更大的数据库中可能不是唯一的。还要注意,Employees 表假设每个员工只能有一辆车。

    SELECT 语句

    SQL 是一种设计用于与关系数据库一起使用的语言。有一组被认为是标准的基本 SQL 命令,被所有关系数据库管理系统使用。例如,所有关系数据库管理系统都使用 SELECT 语句。

    SELECT 语句,也称为查询,用于从表中获取信息。它指定一个或多个列标题,一个或多个要选择的表,以及一些选择条件。关系数据库管理系统返回满足所述要求的列条目的行。例如,以下 SELECT 语句将获取拥有公司车辆的员工的名字和姓氏:

    SELECT First_Name, Last_Name
    FROM Employees
    WHERE Car_Number IS NOT NULL

    符合要求(Car_Number 列中不为 null 的行集)的结果集如下。对于满足要求的每一行,都会打印出名字和姓氏,因为 SELECT 语句(第一行)指定了列 First_NameLast_NameFROM 子句(第二行)给出了将从中选择列的表。

    FIRST_NAME LAST_NAME
    Axel Washington
    Florence Wojokowski

    以下代码生成一个包含整个表的结果集,因为它要求表 Employees 中的所有列没有限制(没有 WHERE 子句)。请注意,SELECT * 意味着“SELECT 所有列”。

    SELECT *
    FROM Employees

    WHERE 子句

    SELECT 语句中的 WHERE 子句提供了选择值的条件。例如,在以下代码片段中,只有在列 Last_Name 以字符串 ‘Washington’ 开头的行中才会选择值。

    SELECT First_Name, Last_Name
    FROM Employees
    WHERE Last_Name LIKE 'Washington%'
    • 1

    关键字LIKE用于比较字符串,并提供了可以使用通配符的功能。例如,在上面的代码片段中,'Washington’末尾有一个百分号(%),表示任何包含字符串’Washington’加零个或多个额外字符的值都将满足这个选择条件。因此,'Washington’或’Washingtonian’都会匹配,但’Washing’不会。LIKE子句中使用的另一个通配符是下划线(_),代表任意一个字符。例如,

    WHERE Last_Name LIKE 'Ba_man'

    会匹配’Barman’、‘Badman’、‘Balman’、‘Bagman’、'Bamman’等等。

    下面的代码片段有一个使用等号(=)比较数字的WHERE子句。它选择了被分配车辆 12 的员工的名字和姓氏。

    SELECT First_Name, Last_Name
    FROM Employees
    WHERE Car_Number = 12

    下一个代码片段选择了员工编号大于 10005 的员工的名字和姓氏:

    SELECT First_Name, Last_Name
    FROM Employees
    WHERE Employee_Number > 10005

    WHERE子句可能会变得相当复杂,包含多个条件,在一些数据库管理系统中还可能有嵌套条件。本概述不会涵盖复杂的WHERE子句,但以下代码片段有一个带有两个条件的WHERE子句;这个查询选择了员工编号小于 10100 且没有公司车的员工的名字和姓氏。

    SELECT First_Name, Last_Name
    FROM Employees
    WHERE Employee_Number < 10100 and Car_Number IS NULL

    一种特殊类型的WHERE子句涉及连接,将在下一节中解释。

    连接

    关系数据库的一个显著特点是可以通过所谓的连接从多个表中获取数据。假设在检索拥有公司车辆的员工姓名后,想要找出谁拥有哪辆车,包括车辆的品牌、型号和年份。这些信息存储在另一个表Cars中:

    Cars

    Car_Number 品牌 型号 年份
    5 本田 思域 DX 1996
    12 丰田 卡罗拉 1999

    为了将两个表关联起来,必须有一列同时出现在两个表中。这一列在一个表中必须是主键,在另一个表中被称为外键。在这种情况下,出现在两个表中的列是Car_Number,它是表Cars的主键,也是表Employees的外键。如果 1996 年本田思域被损坏并从Cars表中删除,那么Car_Number为 5 也必须从Employees表中删除,以保持所谓的参照完整性。否则,Employees表中的外键列(Car_Number)将包含一个不指向Cars表中任何内容的条目。外键必须为空或等于所引用表的现有主键值。这与主键不同,主键不可为空。在表EmployeesCar_Number列中有几个空值,因为员工可能没有公司车。

    以下代码要求输入拥有公司车辆的员工的名字和姓氏,以及这些车辆的制造商、型号和年份。请注意,FROM子句列出了EmployeesCars表,因为请求的数据包含在这两个表中。在列名之前使用表名和点号(.)表示哪个表包含该列。

    SELECT Employees.First_Name, Employees.Last_Name,
        Cars.Make, Cars.Model, Cars.Year
    FROM Employees, Cars
    WHERE Employees.Car_Number = Cars.Car_Number

    这将返回一个类似以下的结果集:

    FIRST_NAME LAST_NAME LICENSE_PLATE MILEAGE YEAR
    John Washington ABC123 5000 1996
    Florence Wojokowski DEF123 7500 1999

    常见的 SQL 命令

    SQL 命令分为不同的类别,主要包括数据操作语言(DML)命令和数据定义语言(DDL)命令。DML 命令处理数据,无论是检索数据还是修改数据以保持其最新状态。DDL 命令创建或更改表以及其他数据库对象,如视图和索引。

    以下是更常见的 DML 命令列表:

    • SELECT — 用于从数据库中查询和显示数据。SELECT语句指定要包含在结果集中的列。应用程序中使用的 SQL 命令中绝大多数是SELECT语句。
    • INSERT — 向表中添加新行。INSERT用于填充新创建的表或向已存在的表中添加新行(或多行)。
    • DELETE — 从表中删除指定的行或一组行
    • UPDATE — 改变表中某一列或一组列中的现有值

    更常见的 DDL 命令如下:

    • CREATE TABLE — 创建一个带有用户提供的列名的表。用户还需要为每个列中的数据指定一个类型。不同的关系型数据库管理系统具有不同的数据类型,因此用户可能需要使用元数据来确定特定数据库使用的数据类型。CREATE TABLE通常比数据操作命令使用频率低,因为表只创建一次,而添加或删除行或更改单个值通常更频繁发生。
    • DROP TABLE — 删除所有行并从数据库中删除表定义。根据 SQL92,过渡级别的规范,JDBC API 实现需要支持DROP TABLE命令。但是,对于DROP TABLECASCADERESTRICT选项的支持是可选的。此外,当存在引用正在被删除的表的视图或完整性约束时,DROP TABLE的行为是由实现定义的。
    • ALTER TABLE — 向表中添加或删除列。它还添加或删除表约束并更改列属性

    结果集和游标

    满足查询条件的行被称为结果集。结果集中返回的行数可以是零、一或多个。用户可以逐行访问结果集中的数据,游标提供了这样的功能。游标可以被看作是指向包含结果集行的文件的指针,并且该指针有能力跟踪当前正在访问的行。游标允许用户从顶部到底部处理结果集的每一行,因此可用于迭代处理。大多数数据库管理系统在生成结果集时会自动创建游标。

    早期的 JDBC API 版本为结果集的游标增加了新的功能,允许它向前和向后移动,还允许它移动到指定的行或相对于另一行的位置。

    更多信息请参见从结果集中检索和修改值。

    事务

    当一个用户正在访问数据库中的数据时,另一个用户可能同时访问相同的数据。例如,第一个用户正在同时更新表中的某些列,而第二个用户正在从同一表中选择列,这时第二个用户可能会得到部分旧数据和部分更新数据。因此,数据库管理系统使用事务来维护数据的一致状态(数据一致性),同时允许多个用户同时访问数据库(数据并发性)。

    事务是由一个或多个 SQL 语句组成的逻辑工作单元。事务以提交或回滚结束,具体取决于数据一致性或数据并发性是否存在问题。提交语句将使事务中 SQL 语句产生的更改永久生效,而回滚语句将撤消事务中 SQL 语句产生的所有更改。

    锁是一种机制,阻止两个事务同时操作相同的数据。例如,表锁会阻止在该表上存在未提交事务时删除该表。在某些数据库管理系统中,表锁还会锁定表中的所有行。行锁可以阻止两个事务修改同一行,或者阻止一个事务在另一个事务仍在修改该行时选择该行。

    更多信息请参见使用事务。

    存储过程

    存储过程是一组可以通过名称调用的 SQL 语句。换句话说,它是可执行的代码,一个小型程序,执行特定任务,可以像调用函数或方法一样调用。传统上,存储过程是用特定于数据库管理系统的编程语言编写的。最新一代的数据库产品允许使用 Java 编程语言和 JDBC API 编写存储过程。用 Java 编程语言编写的存储过程在不同数据库管理系统之间是字节码可移植的。一旦编写了存储过程,它就可以被使用和重复使用,因为支持存储过程的数据库管理系统会将其存储在数据库中。查看使用存储过程获取有关编写存储过程的信息。

    元数据

    数据库存储用户数据,也存储关于数据库本身的信息。大多数数据库管理系统都有一组系统表,列出数据库中的表、每个表中的列名、主键、外键、存储过程等。每个数据库管理系统都有自己的函数来获取有关表布局和数据库功能的信息。JDBC 提供了 DatabaseMetaData 接口,驱动程序编写者必须实现该接口,以便其方法返回有关驱动程序和/或为其编写驱动程序的数据库管理系统的信息。例如,大量的方法返回驱动程序是否支持特定功能。这个接口为用户和工具提供了一种标准化的获取元数据的方式。一般来说,编写工具和驱动程序的开发人员最有可能关注元数据。

    课程:JDBC 基础知识

    原文:docs.oracle.com/javase/tutorial/jdbc/basics/index.html

    在这节课中,您将学习 JDBC API 的基础知识。

    • 入门指南设置了一个基本的数据库开发环境,并展示了如何编译和运行 JDBC 教程示例。
    • 使用 JDBC 处理 SQL 语句概述了处理任何 SQL 语句所需的步骤。接下来的页面将更详细地描述这些步骤:
    • 建立连接连接到您的数据库。
    • 连接到数据源对象展示了如何使用DataSource对象连接到数据库,这是获取数据源连接的首选方式。
    • 处理 SQLException 展示了如何处理由数据库错误引起的异常。
    • 设置表格描述了 JDBC 教程示例中使用的所有数据库表格以及如何使用 JDBC API 和 SQL 脚本创建和填充表格。
    • 从结果集中检索和修改值开发了配置数据库、发送查询和从数据库检索数据的过程。
    • 使用预编译语句描述了创建数据库查询的更灵活方式。
    • 使用事务展示了如何控制数据库查询何时实际执行。
    • 使用 RowSet 对象介绍了RowSet对象;这些对象以一种比结果集更灵活且更易于使用的方式保存表格数据。接下来的页面将描述可用的不同类型的RowSet对象:
    • 使用 JdbcRowSet 对象
    • 使用 CachedRowSet 对象
    • 使用 JoinRowSet 对象
    • 使用 FilteredRowSet 对象
    • 使用 WebRowSet 对象
    • 使用高级数据类型介绍了其他数据类型;接下来的页面将更详细地描述这些数据类型:
    • 使用大对象
    • 使用 SQLXML 对象
    • 使用数组对象
    • 使用 DISTINCT 数据类型
    • 使用结构化对象
    • 使用自定义类型映射
    • 使用数据链接对象
    • 使用行 ID 对象
    • 使用存储过程展示了如何创建和使用存储过程,这是一组可以像调用 Java 方法一样具有可变输入和输出参数的 SQL 语句组。
    • 使用 GUI API 的 JDBC 演示了如何将 JDBC 与 Swing API 集成。

    入门指南

    原文:docs.oracle.com/javase/tutorial/jdbc/basics/gettingstarted.html

    本教程附带的示例代码创建了一个数据库,供一家名为 The Coffee Break 的小咖啡馆的业主使用,该咖啡馆以磅为单位出售咖啡豆,以杯为单位出售冲泡咖啡。

    以下步骤配置了一个 JDBC 开发环境,您可以在其中编译和运行教程示例:

    1. 在您的计算机上安装最新版本的 Java SE SDK
    2. 如果需要,安装您的数据库管理系统(DBMS)
    3. 从您的数据库供应商处安装一个 JDBC 驱动程序
    4. 安装 Apache Ant
    5. 安装 Apache Xalan
    6. 下载示例代码
    7. 修改build.xml文件
    8. 修改教程属性文件
    9. 编译和打包示例
    10. 创建数据库、表和填充表
    11. 运行示例

    在您的计算机上安装最新版本的 Java SE SDK

    在您的计算机上安装最新版本的 Java SE SDK。

    确保 Java SE SDK bin目录的完整路径在您的PATH环境变量中,以便您可以从任何目录运行 Java 编译器和 Java 应用程序启动器。

    如果需要,请安装您的数据库管理系统(DBMS)

    本教程已在以下数据库管理系统上进行测试:

    • Java DB
      注意:Java DB 不再包含在最新版本的 JDK 中。Java DB 是 Apache Derby 的一个重新命名。如果您想使用 Java DB,请从Apache DB 项目下载最新版本。
    • MySQL

    请注意,如果您使用其他 DBMS,可能需要修改教程示例的代码。

    从您的数据库供应商处安装一个 JDBC 驱动程序

    如果您使用 Java DB,则已经带有一个 JDBC 驱动程序。如果您使用 MySQL,请安装最新版本的 MySQL JDBC 驱动程序Connector/J

    联系您的数据库供应商,获取适用于您的 DBMS 的 JDBC 驱动程序。

    JDBC 驱动程序有许多可能的实现。这些实现按以下方式分类:

    • 类型 1:将 JDBC API 实现为另一个数据访问 API 的映射的驱动程序,例如 ODBC(开放数据库连接)。这种类型的驱动程序通常依赖于本地库,这限制了它们的可移植性。JDBC-ODBC 桥就是类型 1 驱动程序的一个例子。
      注意:JDBC-ODBC 桥应被视为一个过渡解决方案。Oracle 不支持它。只有在您的数据库管理系统没有提供仅支持 Java 的 JDBC 驱动程序时才考虑使用它。
    • Type 2: 部分用 Java 编程语言编写,部分用本机代码编写的驱动程序。这些驱动程序使用特定于它们连接的数据源的本机客户端库。由于本机代码的存在,它们的可移植性受到限制。Oracle 的 OCI(Oracle Call Interface)客户端驱动程序是 Type 2 驱动程序的一个示例。
    • Type 3: 使用纯 Java 客户端并使用数据库独立协议与中间件服务器通信的驱动程序。然后中间件服务器将客户端的请求传达给数据源。
    • Type 4: 纯 Java 驱动程序,实现特定数据源的网络协议。客户端直接连接到数据源。

    检查你的数据库管理系统中带有哪些驱动程序类型。Java DB 带有两种 Type 4 驱动程序,一个是嵌入式驱动程序,另一个是网络客户端驱动程序。MySQL Connector/J 是一种 Type 4 驱动程序。

    安装 JDBC 驱动程序通常包括将驱动程序复制到计算机上,然后将其位置添加到类路径中。此外,除了 Type 4 驱动程序之外的许多 JDBC 驱动程序需要你安装客户端 API。通常不需要其他特殊配置。

    安装 Apache Ant

    这些步骤使用 Apache Ant,一个基于 Java 的工具,来构建、编译和运行 JDBC 教程示例。前往以下链接下载 Apache Ant:

    [ant.apache.org/](https://ant.apache.org/)

    确保 Apache Ant 可执行文件在你的PATH环境变量中,这样你就可以在任何目录中运行它。

    安装 Apache Xalan

    示例RSSFeedsTable.java,在使用 SQLXML 对象中有描述,如果你的数据库管理系统是 Java DB,则需要 Apache Xalan。该示例使用 Apache Xalan-Java。前往以下链接下载:

    [xml.apache.org/xalan-j/](https://xml.apache.org/xalan-j/)

    Java 中文官方教程 2022 版(三十四)(2)https://developer.aliyun.com/article/1488028

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
29天前
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
|
3月前
|
Java 开发者 UED
【实战宝典】Java异常处理大师级教程:throws关键字,让异常声明成为你的专属标签!
【实战宝典】Java异常处理大师级教程:throws关键字,让异常声明成为你的专属标签!
57 3
|
7天前
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
|
7天前
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
|
7天前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
Kotlin教程笔记(28) -Kotlin 与 Java 混编
|
16天前
|
JSON Java Maven
实现Java Spring Boot FCM推送教程
本指南介绍了如何在Spring Boot项目中集成Firebase云消息服务(FCM),包括创建项目、添加依赖、配置服务账户密钥、编写推送服务类以及发送消息等步骤,帮助开发者快速实现推送通知功能。
42 2
|
23天前
|
Java 数据库连接 编译器
Kotlin教程笔记(29) -Kotlin 兼容 Java 遇到的最大的“坑”
Kotlin教程笔记(29) -Kotlin 兼容 Java 遇到的最大的“坑”
|
26天前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
本系列教程笔记详细讲解了Kotlin语法,适合希望深入了解Kotlin的开发者。对于需要快速学习Kotlin的小伙伴,推荐查看“简洁”系列教程。本篇笔记重点介绍了Kotlin与Java混编的技巧,包括代码转换、类调用、ProGuard问题、Android库开发建议以及相互调用时的注意事项。
22 3
|
28天前
|
Java 编译器 Android开发
Kotlin教程笔记(28) -Kotlin 与 Java 混编
Kotlin教程笔记(28) -Kotlin 与 Java 混编
21 3
|
29天前
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)