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

简介: Java 中文官方教程 2022 版(三十四)

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

检索警告

SQLWarning 对象是处理数据库访问警告的 SQLException 子类。警告不会像异常那样停止应用程序的执行;它们只是提醒用户某些事情未按计划发生。例如,警告可能会告诉您尝试撤销的权限未被撤销。或者警告可能会告诉您在请求的断开连接期间发生了错误。

可以在 Connection 对象、Statement 对象(包括 PreparedStatementCallableStatement 对象)或 ResultSet 对象上报告警告。这些类中的每一个都有一个 getWarnings 方法,您必须调用它以查看调用对象上报的第一个警告。如果 getWarnings 返回一个警告,您可以调用它的 getNextWarning 方法来获取任何额外的警告。执行语句会自动清除先前语句的警告,因此它们不会累积。然而,这意味着如果您想要检索在语句上报告的警告,您必须在执行另一个语句之前这样做。

JDBCTutorialUtilities.java 中的以下方法演示了如何获取关于 StatementResultSet 对象上报的任何警告的完整信息:

public static void getWarningsFromResultSet(ResultSet rs)
    throws SQLException {
    JDBCTutorialUtilities.printWarnings(rs.getWarnings());
}
public static void getWarningsFromStatement(Statement stmt)
    throws SQLException {
    JDBCTutorialUtilities.printWarnings(stmt.getWarnings());
}
public static void printWarnings(SQLWarning warning)
    throws SQLException {
    if (warning != null) {
        System.out.println("\n---Warning---\n");
    while (warning != null) {
        System.out.println("Message: " + warning.getMessage());
        System.out.println("SQLState: " + warning.getSQLState());
        System.out.print("Vendor error code: ");
        System.out.println(warning.getErrorCode());
        System.out.println("");
        warning = warning.getNextWarning();
    }
}

最常见的警告是 DataTruncation 警告,是 SQLWarning 的子类。所有 DataTruncation 对象的 SQLState 都是 01004,表示读取或写入数据时出现问题。DataTruncation 方法让您找出数据在哪一列或参数被截断,截断是在读取还是写入操作中发生的,应该传输多少字节,实际传输了多少字节。

分类的 SQLExceptions

您的 JDBC 驱动程序可能会抛出与常见 SQLState 或与特定 SQLState 类值不相关的常见错误状态对应的 SQLException 子类。这使您能够编写更具可移植性的错误处理代码。这些异常是以下类的子类之一:

  • SQLNonTransientException
  • SQLTransientException
  • SQLRecoverableException

查看 java.sql 包的最新 Javadoc 或您的 JDBC 驱动程序的文档,以获取有关这些子类的更多信息。

其他 SQLException 的子类

以下 SQLException 的子类也可能被抛出:

  • BatchUpdateException 在批量更新操作期间发生错误时抛出。除了SQLException提供的信息外,BatchUpdateException还提供了在错误发生之前执行的所有语句的更新计数。
  • SQLClientInfoException 在连接上无法设置一个或多个客户端信息属性时抛出。除了SQLException提供的信息外,SQLClientInfoException还提供了未设置的客户端信息属性列表。

设置表

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

本页描述了 JDBC 教程中使用的所有表以及如何创建它们:

  • 咖啡表
  • 供应商表
  • 咖啡库存表
  • 商品库存表
  • 咖啡店表
  • 数据存储库表
  • 创建表
  • 填充表

咖啡表

COFFEES表存储了在 The Coffee Break 可供销售的咖啡信息:

COF_NAME SUP_ID PRICE SALES TOTAL
哥伦比亚 101 7.99 0 0
法式烘焙 49 8.99 0 0
浓缩咖啡 150 9.99 0 0
哥伦比亚无咖啡因 101 8.99 0 0
法式烘焙无咖啡因 49 9.99 0 0

以下描述了COFFEES表中的每列:

  • COF_NAME: 存储咖啡名称。具有 SQL 类型为 VARCHAR,最大长度为 32 个字符。由于每种咖啡的名称都不同,因此名称唯一标识特定的咖啡,并作为主键。
  • SUP_ID: 存储标识咖啡供应商的数字。具有 SQL 类型为 INTEGER。它被定义为引用SUPPLIERS表中SUP_ID列的外键。因此,DBMS 将强制执行此列中的每个值与SUPPLIERS表中相应列中的值之一匹配。
  • PRICE: 存储每磅咖啡的成本。具有 SQL 类型为 FLOAT,因为它需要存储带有小数点的值。(请注意,货币值通常存储在 SQL 类型 DECIMALNUMERIC 中,但由于不同的 DBMS 之间存在差异,并且为了避免与 JDBC 的早期版本不兼容,本教程使用更标准的类型 FLOAT。)
  • SALES: 存储本周销售的咖啡磅数。具有 SQL 类型为 INTEGER
  • TOTAL: 存储迄今为止销售的咖啡磅数。具有 SQL 类型为 INTEGER

供应商表

SUPPLIERS表存储了每个供应商的信息:

SUP_ID SUP_NAME STREET CITY STATE ZIP
101 Acme, Inc. 99 Market Street Groundsville CA 95199
49 优质咖啡 1 Party Place Mendocino CA 95460
150 高地咖啡 100 Coffee Lane Meadows CA 93966

以下描述了SUPPLIERS表中的每列:

  • SUP_ID: 存储标识咖啡供应商的数字。具有 SQL 类型为 INTEGER。这是此表中的主键。
  • SUP_NAME: 存储咖啡供应商的名称。
  • STREETCITYSTATEZIP:这些列存储咖啡供应商的地址。

咖啡库存表

COF_INVENTORY表存储了每个仓库中咖啡的数量信息:

WAREHOUSE_ID COF_NAME SUP_ID QUAN DATE_VAL
1234 House_Blend 49 0 2006_04_01
1234 House_Blend_Decaf 49 0 2006_04_01
1234 哥伦比亚 101 0 2006_04_01
1234 法式烘焙 49 0 2006_04_01
1234 浓缩咖啡 150 0 2006_04_01
1234 Colombian_Decaf 101 0 2006_04_01

以下描述了COF_INVENTORY表中每一列的含义:

  • WAREHOUSE_ID: 存储标识仓库的数字。
  • COF_NAME: 存储特定类型咖啡的名称。
  • SUP_ID: 存储标识供应商的数字。
  • QUAN: 存储表示商品数量的数字。
  • DATE: 存储时间戳数值,表示行最后更新时间。

MERCH_INVENTORY

MERCH_INVENTORY表存储有关库存中非咖啡商品数量的信息:

ITEM_ID ITEM_NAME SUP_ID QUAN DATE
00001234 大杯 00456 28 2006_04_01
00001235 小杯 00456 36 2006_04_01
00001236 碟子 00456 64 2006_04_01
00001287 咖啡壶 00456 12 2006_04_01
00006931 咖啡壶 00927 3 2006_04_01
00006935 隔热垫 00927 88 2006_04_01
00006977 餐巾纸 00927 108 2006_04_01
00006979 毛巾 00927 24 2006_04_01
00004488 咖啡机 08732 5 2006_04_01
00004490 咖啡研磨机 08732 9 2006_04_01
00004495 咖啡机 08732 4 2006_04_01
00006914 食谱书 00927 12 2006_04_01

以下描述了MERCH_INVENTORY表中每一列的含义:

  • ITEM_ID: 存储标识物品的数字。
  • ITEM_NAME: 存储物品的名称。
  • SUP_ID: 存储标识供应商的数字。
  • QUAN: 存储表示该物品可用数量的数字。
  • DATE: 存储时间戳数值,表示行最后更新时间。

COFFEE_HOUSES

COFFEE_HOUSES表存储咖啡店的位置信息:

STORE_ID CITY COFFEE MERCH TOTAL
10023 门多西诺 3450 2005 5455
33002 西雅图 4699 3109 7808
10040 旧金山 5386 2841 8227
32001 波特兰 3147 3579 6726
10042 旧金山 2863 1874 4710
10024 萨克拉门托 1987 2341 4328
10039 卡梅尔 2691 1121 3812
10041 洛杉矶 1533 1007 2540
33005 奥林匹亚 2733 1550 4283
33010 西雅图 3210 2177 5387
10035 旧金山 1922 1056 2978
10037 洛杉矶 2143 1876 4019
10034 圣何塞 1234 1032 2266
32004 Eugene 1356 1112 2468

以下描述了COFFEE_HOUSES表中每一列的含义:

  • STORE_ID: 存储标识咖啡店的数字。它表示咖啡店所在州,以 10 开头的值表示加利福尼亚州,以 32 开头的值表示俄勒冈州,以 33 开头的值表示华盛顿州。
  • CITY: 存储咖啡馆所在城市的名称。
  • COFFEE: 存储表示售出咖啡量的数字。
  • MERCH: 存储表示售出商品量的数字。
  • TOTAL: 存储表示售出咖啡和商品总量的数字。

DATA_REPOSITORY 表

表 DATA_REPOSITORY 存储引用文档和其他与 The Coffee Break 有关的数据的 URL。脚本 populate_tables.sql 不向此表添加任何数据。以下描述了此表中每列的内容:

  • DOCUMENT_NAME: 存储标识 URL 的字符串。
  • URL: 存储一个 URL。

创建表

您可以使用 Apache Ant 或 JDBC API 创建表。

使用 Apache Ant 创建表

要创建教程示例代码中使用的表,请在目录 ** 中运行以下命令:

ant setup

此命令运行多个 Ant 目标,包括以下内容,build-tables(来自 build.xml 文件):

<target name="build-tables"
  description="Create database tables">
  <sql
    driver="${DB.DRIVER}"
    url="${DB.URL}"
    userid="${DB.USER}"
    password="${DB.PASSWORD}"
    classpathref="CLASSPATH"
    delimiter="${DB.DELIMITER}"
    autocommit="false" onerror="abort">
    <transaction src=
  "./sql/${DB.VENDOR}/create-tables.sql"/>
  </sql>
</target>

示例为以下 sql Ant 任务参数指定值:

Parameter 描述
driver 您的 JDBC 驱动程序的完全限定类名。此示例中,Java DB 使用 org.apache.derby.jdbc.EmbeddedDriver,MySQL Connector/J 使用 com.mysql.cj.jdbc.Driver
url 数据库连接 URL,您的 DBMS JDBC 驱动程序用于连接到数据库的 URL。
userid 您的 DBMS 中有效用户的名称。
password userid 中指定用户的密码
classpathref 包含 driver 中指定的类的 JAR 文件的完整路径名
delimiter 分隔 SQL 语句的字符串或字符。此示例使用分号 (;)。
autocommit 布尔值;如果设置为 false,则所有 SQL 语句将作为一个事务执行。
onerror 当语句失败时执行的操作;可能的值为 continuestopabort。值 abort 指定如果发生错误,则事务将被中止。

示例将这些参数的值存储在单独的文件中。构建文件 build.xml 使用 import 任务检索这些值:

<import file="${ANTPROPERTIES}"/>

transaction 元素指定一个包含要执行的 SQL 语句的文件。文件 create-tables.sql 包含创建本页描述的所有表的 SQL 语句。例如,此文件的以下摘录创建表 SUPPLIERSCOFFEES

create table SUPPLIERS
    (SUP_ID integer NOT NULL,
    SUP_NAME varchar(40) NOT NULL,
    STREET varchar(40) NOT NULL,
    CITY varchar(20) NOT NULL,
    STATE char(2) NOT NULL,
    ZIP char(5),
    PRIMARY KEY (SUP_ID));
create table COFFEES
    (COF_NAME varchar(32) NOT NULL,
    SUP_ID int NOT NULL,
    PRICE numeric(10,2) NOT NULL,
    SALES integer NOT NULL,
    TOTAL integer NOT NULL,
    PRIMARY KEY (COF_NAME),
    FOREIGN KEY (SUP_ID)
        REFERENCES SUPPLIERS (SUP_ID));

注意:文件 build.xml 包含另一个名为 drop-tables 的目标,用于删除教程中使用的表。setup 目标在运行 build-tables 目标之前运行 drop-tables

使用 JDBC API 创建表

以下方法,SuppliersTable.createTable,创建 SUPPLIERS 表:

public void createTable() throws SQLException {
    String createString =
      "create table SUPPLIERS " + "(SUP_ID integer NOT NULL, " +
      "SUP_NAME varchar(40) NOT NULL, " + "STREET varchar(40) NOT NULL, " +
      "CITY varchar(20) NOT NULL, " + "STATE char(2) NOT NULL, " +
      "ZIP char(5), " + "PRIMARY KEY (SUP_ID))";
    try (Statement stmt = con.createStatement()) {
      stmt.executeUpdate(createString);
    } catch (SQLException e) {
      JDBCTutorialUtilities.printSQLException(e);
    }
  }

以下方法,CoffeesTable.createTable,创建 COFFEES 表:

public void createTable() throws SQLException {
    String createString =
      "create table COFFEES " + "(COF_NAME varchar(32) NOT NULL, " +
      "SUP_ID int NOT NULL, " + "PRICE numeric(10,2) NOT NULL, " +
      "SALES integer NOT NULL, " + "TOTAL integer NOT NULL, " +
      "PRIMARY KEY (COF_NAME), " +
      "FOREIGN KEY (SUP_ID) REFERENCES SUPPLIERS (SUP_ID))";
    try (Statement stmt = con.createStatement()) {
      stmt.executeUpdate(createString);
    } catch (SQLException e) {
      JDBCTutorialUtilities.printSQLException(e);
    }
  }

在这两种方法中,con是一个Connection对象,dbName是你正在创建表的数据库的名称。

要执行 SQL 查询,比如由String createString指定的查询,使用一个Statement对象。要创建一个Statement对象,从现有的Connection对象调用方法Connection.createStatement。要执行 SQL 查询,调用方法Statement.executeUpdate

所有的Statement对象在创建它们的连接关闭时都会被关闭。然而,明确关闭Statement对象是良好的编程实践,一旦你完成了它们的使用就立即关闭。这样可以立即释放语句正在使用的任何外部资源。通过调用方法Statement.close来关闭一个语句。将这个语句放在finally中以确保即使正常程序流被中断,比如抛出异常(比如SQLException),它也会关闭。

注意:在COFFEES之前必须先创建SUPPLIERS表,因为COFFEES包含一个外键SUP_ID,它引用SUPPLIERS

填充表

同样,你可以使用 Apache Ant 或 JDBC API 向表中插入数据。

使用 Apache Ant 填充表

除了创建本教程使用的表之外,命令ant setup还会填充这些表。这个命令运行 Ant 目标populate-tables,该目标运行 SQL 脚本populate-tables.sql

下面是从populate-tables.sql中填充SUPPLIERSCOFFEES表的摘录:

insert into SUPPLIERS values(
    49, 'Superior Coffee', '1 Party Place',
    'Mendocino', 'CA', '95460');
insert into SUPPLIERS values(
    101, 'Acme, Inc.', '99 Market Street',
    'Groundsville', 'CA', '95199');
insert into SUPPLIERS values(
    150, 'The High Ground',
    '100 Coffee Lane', 'Meadows', 'CA', '93966');
insert into COFFEES values(
    'Colombian', 00101, 7.99, 0, 0);
insert into COFFEES values(
    'French_Roast', 00049, 8.99, 0, 0);
insert into COFFEES values(
    'Espresso', 00150, 9.99, 0, 0);
insert into COFFEES values(
    'Colombian_Decaf', 00101, 8.99, 0, 0);
insert into COFFEES values(
    'French_Roast_Decaf', 00049, 9.99, 0, 0);

使用 JDBC API 填充表

下面的方法,SuppliersTable.populateTable,将数据插入表中:

public void populateTable() throws SQLException {
    try (Statement stmt = con.createStatement()) {
      stmt.executeUpdate("insert into SUPPLIERS " +
                         "values(49, 'Superior Coffee', '1 Party Place', " +
                         "'Mendocino', 'CA', '95460')");
      stmt.executeUpdate("insert into SUPPLIERS " +
                         "values(101, 'Acme, Inc.', '99 Market Street', " +
                         "'Groundsville', 'CA', '95199')");
      stmt.executeUpdate("insert into SUPPLIERS " +
                         "values(150, 'The High Ground', '100 Coffee Lane', " +
                         "'Meadows', 'CA', '93966')");
    } catch (SQLException e) {
      JDBCTutorialUtilities.printSQLException(e);
    }
  }

下面的方法,CoffeesTable.populateTable,将数据插入表中:

public void populateTable() throws SQLException {
    try (Statement stmt = con.createStatement()) {
      stmt.executeUpdate("insert into COFFEES " +
                         "values('Colombian', 00101, 7.99, 0, 0)");
      stmt.executeUpdate("insert into COFFEES " +
                         "values('French_Roast', 00049, 8.99, 0, 0)");
      stmt.executeUpdate("insert into COFFEES " +
                         "values('Espresso', 00150, 9.99, 0, 0)");
      stmt.executeUpdate("insert into COFFEES " +
                         "values('Colombian_Decaf', 00101, 8.99, 0, 0)");
      stmt.executeUpdate("insert into COFFEES " +
                         "values('French_Roast_Decaf', 00049, 9.99, 0, 0)");
    } catch (SQLException e) {
      JDBCTutorialUtilities.printSQLException(e);
    }
  }


相关文章
|
7月前
|
JavaScript NoSQL Java
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
360 96
接替此文【下篇-服务端+后台管理】优雅草蜻蜓z系统JAVA版暗影版为例-【蜻蜓z系列通用】-2025年全新项目整合搭建方式-这是独立吃透代码以后首次改变-独立PC版本vue版搭建教程-优雅草卓伊凡
|
3月前
|
Oracle Java 关系型数据库
java 编程基础入门级超级完整版教程详解
这份文档是针对Java编程入门学习者的超级完整版教程,涵盖了从环境搭建到实际项目应用的全方位内容。首先介绍了Java的基本概念与开发环境配置方法,随后深入讲解了基础语法、控制流程、面向对象编程的核心思想,并配以具体代码示例。接着探讨了常用类库与API的应用,如字符串操作、集合框架及文件处理等。最后通过一个学生成绩管理系统的实例,帮助读者将理论知识应用于实践。此外,还提供了进阶学习建议,引导学员逐步掌握更复杂的Java技术。适合初学者系统性学习Java编程。资源地址:[点击访问](https://pan.quark.cn/s/14fcf913bae6)。
305 2
|
8月前
|
消息中间件 Java 数据库
自研Java框架 Sunrays-Framework使用教程「博客之星」
### Sunrays-Framework:助力高效开发的Java微服务框架 **Sunrays-Framework** 是一款基于 Spring Boot 构建的高效微服务开发框架,深度融合了 Spring Cloud 生态中的核心技术组件。它旨在简化数据访问、缓存管理、消息队列、文件存储等常见开发任务,帮助开发者快速构建高质量的企业级应用。 #### 核心功能 - **MyBatis-Plus**:简化数据访问层开发,提供强大的 CRUD 操作和分页功能。 - **Redis**:实现高性能缓存和分布式锁,提升系统响应速度。 - **RabbitMQ**:可靠的消息队列支持,适用于异步
自研Java框架 Sunrays-Framework使用教程「博客之星」
|
9月前
|
移动开发 前端开发 Java
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
JavaFX是Java的下一代图形用户界面工具包。JavaFX是一组图形和媒体API,我们可以用它们来创建和部署富客户端应用程序。 JavaFX允许开发人员快速构建丰富的跨平台应用程序,允许开发人员在单个编程接口中组合图形,动画和UI控件。本文详细介绍了JavaFx的常见用法,相信读完本教程你一定有所收获!
8405 5
Java最新图形化界面开发技术——JavaFx教程(含UI控件用法介绍、属性绑定、事件监听、FXML)
|
8月前
|
Java 数据库连接 数据处理
探究Java异常处理【保姆级教程】
Java 异常处理是确保程序稳健运行的关键机制。它通过捕获和处理运行时错误,避免程序崩溃。Java 的异常体系以 `Throwable` 为基础,分为 `Error` 和 `Exception`。前者表示严重错误,后者可细分为受检和非受检异常。常见的异常处理方式包括 `try-catch-finally`、`throws` 和 `throw` 关键字。此外,还可以自定义异常类以满足特定需求。最佳实践包括捕获具体异常、合理使用 `finally` 块和谨慎抛出异常。掌握这些技巧能显著提升程序的健壮性和可靠性。
133 4
|
8月前
|
存储 移动开发 算法
【潜意识Java】Java基础教程:从零开始的学习之旅
本文介绍了 Java 编程语言的基础知识,涵盖从简介、程序结构到面向对象编程的核心概念。首先,Java 是一种高级、跨平台的面向对象语言,支持“一次编写,到处运行”。接着,文章详细讲解了 Java 程序的基本结构,包括包声明、导入语句、类声明和 main 方法。随后,深入探讨了基础语法,如数据类型、变量、控制结构、方法和数组。此外,还介绍了面向对象编程的关键概念,例如类与对象、继承和多态。最后,针对常见的编程错误提供了调试技巧,并总结了学习 Java 的重要性和方法。适合初学者逐步掌握 Java 编程。
145 1
|
9月前
|
NoSQL Java 关系型数据库
Liunx部署java项目Tomcat、Redis、Mysql教程
本文详细介绍了如何在 Linux 服务器上安装和配置 Tomcat、MySQL 和 Redis,并部署 Java 项目。通过这些步骤,您可以搭建一个高效稳定的 Java 应用运行环境。希望本文能为您在实际操作中提供有价值的参考。
556 26
|
8月前
|
前端开发 Java 开发工具
Git使用教程-将idea本地Java等文件配置到gitte上【保姆级教程】
本内容详细介绍了使用Git进行版本控制的全过程,涵盖从本地仓库创建到远程仓库配置,以及最终推送代码至远程仓库的步骤。
415 0
|
9月前
|
安全 Java 编译器
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
Kotlin教程笔记(27) -Kotlin 与 Java 共存(二)
|
9月前
|
Java 开发工具 Android开发
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)
Kotlin教程笔记(26) -Kotlin 与 Java 共存(一)

热门文章

最新文章