Java 中文官方教程 2022 版(三十四)(1)https://developer.aliyun.com/article/1488026
下载示例代码
示例代码JDBCTutorial.zip
包括以下文件:
properties
javadb-build-properties.xml
javadb-sample-properties.xml
mysql-build-properties.xml
mysql-sample-properties.xml
sql
javadb
create-procedures.sql
create-tables.sql
drop-tables.sql
populate-tables.sql
mysql
create-procedures.sql
create-tables.sql
drop-tables.sql
populate-tables.sql
src/com/oracle/tutorial/jdbc
CachedRowSetSample.java
CityFilter.java
ClobSample.java
CoffeesFrame.java
CoffeesTable.java
CoffeesTableModel.java
DatalinkSample.java
ExampleRowSetListener.java
FilteredRowSetSample.java
JdbcRowSetSample.java
JDBCTutorialUtilities.java
JoinSample.java
ProductInformationTable.java
RSSFeedsTable.java
StateFilter.java
StoredProcedureJavaDBSample.java
StoredProcedureMySQLSample.java
SuppliersTable.java
WebRowSetSample.java
txt
colombian-description.txt
xml
rss-coffee-industry-news.xml
rss-the-coffee-break-blog.xml
build.xml
创建一个目录来包含示例的所有文件。这些步骤将此目录称为 **
。将 JDBCTutorial.zip
的内容解压缩到 **
中。
修改 build.xml 文件
build.xml
文件是 Apache Ant 用于编译和执行 JDBC 示例的构建文件。文件 properties/javadb-build-properties.xml
和 properties/mysql-build-properties.xml
包含 Java DB 和 MySQL 需要的额外 Apache Ant 属性。文件 properties/javadb-sample-properties.xml
和 properties/mysql-sample-properties.xml
包含示例所需的属性。
修改这些 XML 文件如下:
修改 build.xml
在 build.xml
文件中,修改属性 ANTPROPERTIES
,指向 properties/javadb-build-properties.xml
或 properties/mysql-build-properties.xml
,取决于您的 DBMS。例如,如果您正在使用 Java DB,则您的 build.xml
文件将包含以下内容:
<property name="ANTPROPERTIES" value="properties/javadb-build-properties.xml"/> <import file="${ANTPROPERTIES}"/>
同样,如果您正在使用 MySQL,您的 build.xml
文件将包含以下内容:
<property name="ANTPROPERTIES" value="properties/mysql-build-properties.xml"/> <import file="${ANTPROPERTIES}"/>
修改特定于数据库的属性文件
在 properties/javadb-build-properties.xml
或 properties/mysql-build-properties.xml
文件(取决于您的 DBMS),根据以下表格中的描述修改以下属性:
属性 | 描述 |
JAVAC |
您的 Java 编译器 javac 的完整路径名。 |
JAVA |
您的 Java 运行时可执行文件 java 的完整路径名。 |
PROPERTIESFILE |
属性文件的名称,可以是 properties/javadb-sample-properties.xml 或 properties/mysql-sample-properties.xml 。 |
MYSQLDRIVER |
你的 MySQL 驱动程序的完整路径名。对于 Connector/J,通常是 *<Connector/J 安装目录>*/mysql-connector-java-*版本号*.jar 。 |
JAVADBDRIVER |
您的 Java DB 驱动程序的完整路径名。通常是 *<Java DB 安装目录>*/lib/derby.jar 。 |
XALANDIRECTORY |
包含 Apache Xalan 的目录的完整路径名。 |
CLASSPATH |
JDBC 教程使用的类路径。您无需更改此值。 |
XALAN |
文件 xalan.jar 的完整路径名。 |
DB.VENDOR |
一个值,可以是 derby 或 mysql ,取决于您是使用 Java DB 还是 MySQL。教程使用此值来构建连接到 DBMS 和识别特定于 DBMS 的代码和 SQL 语句所需的 URL。 |
DB.DRIVER |
JDBC 驱动程序的完全限定类名。对于 Java DB,这是 org.apache.derby.jdbc.EmbeddedDriver 。对于 MySQL,这是 com.mysql.cj.jdbc.Driver 。 |
DB.HOST |
托管您的 DBMS 的计算机的主机名。 |
DB.PORT |
托管您的 DBMS 的计算机的端口号。 |
DB.SID |
教程创建和使用的数据库名称。 |
DB.URL.NEWDATABASE |
创建新数据库时用于连接到您的 DBMS 的连接 URL。您无需更改此值。 |
DB.URL |
用于连接到您的 DBMS 的连接 URL。您无需更改此值。 |
DB.USER |
具有在 DBMS 中创建数据库权限的用户的名称。 |
DB.PASSWORD |
指定在DB.USER 中的用户的密码。 |
DB.DELIMITER |
用于分隔 SQL 语句的字符。不要更改此值。它应该是分号字符(; )。 |
修改教程属性文件
教程示例使用properties/javadb-sample-properties.xml
文件或properties/mysql-sample-properties.xml
文件中的值(取决于您的 DBMS)来连接到 DBMS 并初始化数据库和表,如下表所述:
属性 | 描述 |
dbms |
取值为derby 或mysql ,取决于您是使用 Java DB 还是 MySQL。本教程使用此值来构建连接到 DBMS 所需的 URL,并识别 DBMS 特定的代码和 SQL 语句。 |
jar_file |
包含本教程所有类文件的 JAR 文件的完整路径名。 |
driver |
JDBC 驱动程序的完全限定类名。对于 Java DB,这是org.apache.derby.jdbc.EmbeddedDriver 。对于 MySQL,这是com.mysql.cj.jdbc.Driver 。 |
database_name |
教程创建和使用的数据库名称。 |
user_name |
具有在 DBMS 中创建数据库权限的用户的名称。 |
password |
指定在user_name 中的用户的密码。 |
server_name |
托管您的 DBMS 的计算机的主机名。 |
port_number |
托管您的 DBMS 的计算机的端口号。 |
注意:为了简化演示 JDBC API,JDBC 教程示例代码不执行部署系统通常使用的密码管理技术。在生产环境中,您可以遵循 Oracle 数据库密码管理指南并禁用任何示例帐户。请参阅Oracle 数据库安全指南中的应用程序设计中的密码保护部分,了解密码管理指南和其他安全建议。
编译并打包示例
在命令提示符下,将当前目录更改为**
。从该目录运行以下命令编译示例并将其打包到一个 jar 文件中:
ant jar
创建数据库、表格,并填充表格
如果您使用的是 MySQL,则运行以下命令来创建数据库:
ant create-mysql-database
注意:build.xml
文件中不存在用于为 Java DB 创建数据库的相应 Ant 目标。用于建立数据库连接的 Java DB 数据库 URL 包括创建数据库的选项(如果尚不存在)。有关更多信息,请参阅建立连接。
如果您正在使用 Java DB 或 MySQL,则可以从同一目录运行以下命令来删除现有的示例数据库表,重新创建表并填充它们。对于 Java DB,此命令还会在数据库不存在时创建数据库:
ant setup
注意:在运行示例中的 Java 类之前,您应该每次运行ant setup
命令。这些示例中的许多示例都期望示例数据库表的内容中有特定的数据。
运行示例
build.xml
文件中的每个目标对应于 JDBC 示例中的一个 Java 类或 SQL 脚本。以下表列出了build.xml
文件中的目标,每个目标执行的类或脚本,以及每个目标需要的其他类或文件:
Ant 目标 | 类或 SQL 脚本 | 其他必需类或文件 |
javadb-create-procedure |
javadb/create-procedures.sql ;查看build.xml 文件以查看运行的其他 SQL 语句 |
无其他必需文件 |
mysql-create-procedure |
mysql/create-procedures.sql |
无其他必需文件 |
run |
JDBCTutorialUtilities |
无其他必需类 |
runct |
CoffeesTable |
JDBCTutorialUtilities |
runst |
SuppliersTable |
JDBCTutorialUtilities |
runjrs |
JdbcRowSetSample |
JDBCTutorialUtilities |
runcrs |
CachedRowSetSample ,ExampleRowSetListener |
JDBCTutorialUtilities |
runjoin |
JoinSample |
JDBCTutorialUtilities |
runfrs |
FilteredRowSetSample |
JDBCTutorialUtilities ,CityFilter ,StateFilter |
runwrs |
WebRowSetSample |
JDBCTutorialUtilities |
runclob |
ClobSample |
JDBCTutorialUtilities ,txt/colombian-description.txt |
runrss |
RSSFeedsTable |
JDBCTutorialUtilities ,xml 目录中包含的 XML 文件 |
rundl |
DatalinkSample |
JDBCTutorialUtilities |
runspjavadb |
StoredProcedureJavaDBSample |
JDBCTutorialUtilities ,SuppliersTable ,CoffeesTable |
runspmysql |
StoredProcedureMySQLSample |
JDBCTutorialUtilities ,SuppliersTable ,CoffeesTable |
runframe |
CoffeesFrame |
JDBCTutorialUtilities ,CoffeesTableModel |
例如,要运行CoffeesTable
类,请将当前目录更改为**
,然后从该目录运行以下命令:
ant runct
使用 JDBC 处理 SQL 语句
原文:
docs.oracle.com/javase/tutorial/jdbc/basics/processingsqlstatements.html
一般来说,要使用 JDBC 处理任何 SQL 语句,您需要按照以下步骤进行:
- 建立连接。
- 创建语句。
- 执行查询。
- 处理
ResultSet
对象。 - 关闭连接。
本页使用教程示例中的方法CoffeesTable.viewTable
来演示这些步骤。此方法输出表COFFEES
的内容。此方法将在本教程的后续部分中更详细地讨论:
public static void viewTable(Connection con) throws SQLException { String query = "select COF_NAME, SUP_ID, PRICE, SALES, TOTAL from COFFEES"; try (Statement stmt = con.createStatement()) { ResultSet rs = stmt.executeQuery(query); while (rs.next()) { String coffeeName = rs.getString("COF_NAME"); int supplierID = rs.getInt("SUP_ID"); float price = rs.getFloat("PRICE"); int sales = rs.getInt("SALES"); int total = rs.getInt("TOTAL"); System.out.println(coffeeName + ", " + supplierID + ", " + price + ", " + sales + ", " + total); } } catch (SQLException e) { JDBCTutorialUtilities.printSQLException(e); } }
建立连接
首先,与要使用的数据源建立连接。数据源可以是 DBMS、传统文件系统或具有相应 JDBC 驱动程序的其他数据源。此连接由Connection
对象表示。有关更多信息,请参见建立连接。
创建语句
Statement
是表示 SQL 语句的接口。您执行Statement
对象,它们生成ResultSet
对象,这是表示数据库结果集的数据表。您需要一个Connection
对象来创建Statement
对象。
例如,CoffeesTable.viewTable
使用以下代码创建了一个Statement
对象:
stmt = con.createStatement();
有三种不同类型的语句:
Statement
:用于执行没有参数的简单 SQL 语句。PreparedStatement
:(扩展Statement
。)用于预编译可能包含输入参数的 SQL 语句。有关更多信息,请参见使用预编译语句。CallableStatement:
(扩展PreparedStatement
。)用于执行可能包含输入和输出参数的存储过程。有关更多信息,请参见存储过程。
执行查询
要执行查询,请调用Statement
中的execute
方法,如下所示:
execute
:如果查询返回的第一个对象是ResultSet
对象,则返回true
。如果查询可能返回一个或多个ResultSet
对象,请使用此方法。通过反复调用Statement.getResultSet
检索查询返回的ResultSet
对象。executeQuery
:返回一个ResultSet
对象。executeUpdate
:返回一个整数,表示受 SQL 语句影响的行数。如果您使用INSERT
、DELETE
或UPDATE
SQL 语句,请使用此方法。
例如,CoffeesTable.viewTable
使用以下代码执行了一个Statement
对象:
ResultSet rs = stmt.executeQuery(query);
有关更多信息,请参见从结果集中检索和修改值。
处理 ResultSet 对象
通过游标访问ResultSet
对象中的数据。请注意,此游标不是数据库游标。这个游标是指向ResultSet
对象中一行数据的指针。最初,游标位于第一行之前。您调用ResultSet
对象中定义的各种方法来移动游标。
例如,CoffeesTable.viewTable
重复调用ResultSet.next
方法来将游标向前移动一行。每次调用next
时,该方法会输出游标当前位置的行中的数据:
ResultSet rs = stmt.executeQuery(query); while (rs.next()) { String coffeeName = rs.getString("COF_NAME"); int supplierID = rs.getInt("SUP_ID"); float price = rs.getFloat("PRICE"); int sales = rs.getInt("SALES"); int total = rs.getInt("TOTAL"); System.out.println(coffeeName + ", " + supplierID + ", " + price + ", " + sales + ", " + total); } // ...
查看从结果集中检索和修改值获取更多信息。
关闭连接
当您使用完Connection
、Statement
或ResultSet
对象后,请调用其close
方法立即释放它正在使用的资源。
或者,可以使用try
-with-resources 语句自动关闭Connection
、Statement
和ResultSet
对象,无论是否抛出SQLException
。(当 JDBC 在与数据源交互时遇到错误时,会抛出SQLException
。查看处理 SQL 异常获取更多信息。)自动资源语句由一个try
语句和一个或多个声明的资源组成。例如,CoffeesTable.viewTable
方法会自动关闭其Statement
对象,如下所示:
public static void viewTable(Connection con) throws SQLException { String query = "select COF_NAME, SUP_ID, PRICE, SALES, TOTAL from COFFEES"; try (Statement stmt = con.createStatement()) { ResultSet rs = stmt.executeQuery(query); while (rs.next()) { String coffeeName = rs.getString("COF_NAME"); int supplierID = rs.getInt("SUP_ID"); float price = rs.getFloat("PRICE"); int sales = rs.getInt("SALES"); int total = rs.getInt("TOTAL"); System.out.println(coffeeName + ", " + supplierID + ", " + price + ", " + sales + ", " + total); } } catch (SQLException e) { JDBCTutorialUtilities.printSQLException(e); } }
以下语句是一个try
-with-resources 语句,声明了一个资源stmt
,当try
块终止时将自动关闭该资源:
try (Statement stmt = con.createStatement()) { // ... }
查看 try-with-resources 语句在 Essential Classes 教程中获取更多信息。
建立连接
原文:
docs.oracle.com/javase/tutorial/jdbc/basics/connecting.html
首先,您需要与要使用的数据源建立连接。数据源可以是 DBMS、传统文件系统或其他具有相应 JDBC 驱动程序的数据源。通常,JDBC 应用程序使用以下两个类之一连接到目标数据源:
DriverManager
:此完全实现的类将应用程序连接到由数据库 URL 指定的数据源。当此类首次尝试建立连接时,它会自动加载类路径中找到的任何 JDBC 4.0 驱动程序。请注意,您的应用程序必须在版本 4.0 之前手动加载任何 JDBC 驱动程序。DataSource
:此接口优先于DriverManager
,因为它允许底层数据源的详细信息对您的应用程序透明。设置DataSource
对象的属性,使其表示特定的数据源。有关更多信息,请参阅使用 DataSource 对象进行连接。有关使用DataSource
类开发应用程序的更多信息,请参阅最新版本的*Java EE 教程*。
注意:本教程中的示例使用DriverManager
类而不是DataSource
类,因为它更容易使用,而且示例不需要DataSource
类的功能。
本页涵盖以下主题:
- 使用 DriverManager 类
- 指定数据库连接 URL
使用 DriverManager 类
使用DriverManager
类连接到您的 DBMS 涉及调用方法DriverManager.getConnection
。以下方法,JDBCTutorialUtilities.getConnection
,建立数据库连接:
public Connection getConnection() throws SQLException { Connection conn = null; Properties connectionProps = new Properties(); connectionProps.put("user", this.userName); connectionProps.put("password", this.password); if (this.dbms.equals("mysql")) { conn = DriverManager.getConnection( "jdbc:" + this.dbms + "://" + this.serverName + ":" + this.portNumber + "/", connectionProps); } else if (this.dbms.equals("derby")) { conn = DriverManager.getConnection( "jdbc:" + this.dbms + ":" + this.dbName + ";create=true", connectionProps); } System.out.println("Connected to database"); return conn; }
方法DriverManager.getConnection
建立数据库连接。此方法需要数据库 URL,具体取决于您的 DBMS。以下是一些数据库 URL 的示例:
- MySQL:
jdbc:mysql://localhost:3306/
,其中localhost
是托管数据库的服务器名称,3306
是端口号 - Java DB:
jdbc:derby:*testdb*;create=true
,其中*testdb*
是要连接的数据库的名称,create=true
指示 DBMS 创建数据库。
注意:此 URL 与 Java DB 嵌入式驱动程序建立数据库连接。Java DB 还包括使用不同 URL 的网络客户端驱动程序。
此方法使用Properties
对象指定访问 DBMS 所需的用户名和密码。
注意:
- 通常,在数据库 URL 中,你还会指定要连接的现有数据库的名称。例如,URL
jdbc:mysql://localhost:3306/mysql
代表了名为mysql
的 MySQL 数据库的数据库 URL。本教程中的示例使用不指定特定数据库的 URL,因为示例会创建一个新数据库。 - 在以前的 JDBC 版本中,要获取连接,你首先需要通过调用方法
Class.forName
来初始化你的 JDBC 驱动程序。这些方法需要一个类型为java.sql.Driver
的对象。每个 JDBC 驱动程序都包含一个或多个实现接口java.sql.Driver
的类。Java DB 的驱动程序是org.apache.derby.jdbc.EmbeddedDriver
和org.apache.derby.jdbc.ClientDriver
,而 MySQL Connector/J 的驱动程序是com.mysql.cj.jdbc.Driver
。查看你的 DBMS 驱动程序的文档以获取实现接口java.sql.Driver
的类名。
任何在你的类路径中找到的 JDBC 4.0 驱动程序都会自动加载。(但是,在 JDBC 4.0 之前,你必须手动加载任何驱动程序,使用方法Class.forName
。)
该方法返回一个 Connection
对象,表示与 DBMS 或特定数据库的连接。通过这个对象查询数据库。
指定数据库连接 URL
数据库连接 URL 是你的 DBMS JDBC 驱动程序用来连接数据库的字符串。它可以包含诸如在哪里搜索数据库、要连接的数据库名称和配置属性等信息。数据库连接 URL 的确切语法由你的 DBMS 指定。
Java DB 数据库连接 URL
以下是 Java DB 的数据库连接 URL 语法:
jdbc:derby:[*subsubprotocol*:][*databaseName*][;*attribute*=*value*]*
*subsubprotocol*
指定 Java DB 应在何处搜索数据库,可以是目录、内存、类路径或 JAR 文件。通常会省略。*databaseName*
是要连接的数据库的名称。*attribute*=*value*
表示一个可选的、以分号分隔的属性列表。这些属性使你能够指示 Java DB 执行各种任务,包括以下内容:
- 创建连接 URL 中指定的数据库。
- 加密连接 URL 中指定的数据库。
- 指定存储日志和跟踪信息的目录。
- 指定用户名和密码以连接到数据库。
查看Java DB 技术文档中的Java DB 开发人员指南和Java DB 参考手册以获取更多信息。
MySQL Connector/J 数据库 URL
以下是 MySQL Connector/J 的数据库连接 URL 语法:
jdbc:mysql://[*host*][,*failoverhost*...] [:*port*]/[*database*] [?*propertyName1*][=*propertyValue1*] [&*propertyName2*][=*propertyValue2*]...
*host*:*port*
是托管数据库的计算机的主机名和端口号。如果未指定,默认值为*host*
和*port*
分别为 127.0.0.1 和 3306。*database*
是要连接的数据库的名称。如果未指定,将连接到没有默认数据库的连接。*failover*
是一个备用数据库的名称(MySQL Connector/J 支持故障转移)。*propertyName*=*propertyValue*
表示一个可选的、以&符号分隔的属性列表。这些属性使您能够指示 MySQL Connector/J 执行各种任务。
查看MySQL 参考手册 获取更多信息。
Java 中文官方教程 2022 版(三十四)(3)https://developer.aliyun.com/article/1488032