网易首页 > 网易号 > 正文 申请入驻

在 Java 中使用外部库 | Linux 中国

0
分享至

导读:外部库填补了 Java 核心库中的一些功能空白。                                   

本文字数:9914,阅读时长大约: 11分钟

https://linux.cn/article-13769-1.html
作者:Chris Hermansen
译者:unigeorge

Java 自带有一组核心库,其中包含了定义常用数据类型和相关行为的库(例如 StringDate)、与主机操作系统交互的实用程序(例如 SystemFile),以及一些用来管理安全性、处理网络通信、创建或解析 XML的有用的子系统。鉴于核心库的丰富性,程序员通常很容易在其中找到有用的组件,以减少需要编写的代码量。

即便如此,核心库仍有一些功能上的不足,因此发现这些不足的程序员们还额外创建了很多有趣的 Java 库。例如, commons.apache.org“是一个专注于可重用 Java 组件所有方面的 Apache 项目”,提供了大约 43 个开源库的集合(截至撰写本文时),涵盖了 Java 核心库之外的一系列功能 (例如 commons.apache.org 或 commons.apache.org),并增强或替换了 Java 核心库中的原有功能(例如 commons.apache.org 或 commons.apache.org)。

另一种常见的 Java 库类型是系统组件的接口(例如数据库系统接口),本文会着眼于使用此类接口连接到 opensource.com 数据库,并得到一些有趣的信息。首先,我们来回顾一下库的重要部分。

什么是库?

库(library)里自然包含的是一些有用的代码。但为了发挥用处,代码需要以特定方式进行组织,特定的方式使 Java 程序员可以访问其中组件来解决手头问题。

可以说,一个库最重要的部分是它的应用程序编程接口(API)文档。这种文档很多人都熟悉,通常是由 en.wikipedia.org 生成的。Javadoc 读取代码中的结构化注释并以 HTML 格式输出文档,通常 API 的 包(package) 在页面左上角的面板中显示,类(class) 在左下角显示,同时右侧会有库、包或类级别的详细文档(具体取决于在主面板中选择的内容)。例如, commons.apache.org 如下所示:

API documentation for Apache Commons Math

单击主面板中的包会显示该包中定义的 Java 类和接口。例如, commons.apache.org 显示了诸如 BisectionSolver 这样的类,该类用于使用二分算法查找单变量实函数的零点。单击 commons.apache.org 链接会列出 BisectionSolver 类的所有方法。

这类文档可用作参考文档,不适合作为学习如何使用库的教程。比如,如果你知道什么是单变量实函数并查看包 org.apache.commons.math4.analysis.function,就可以试着使用该包来组合函数定义,然后使用 org.apache.commons.math4.analysis.solvers 包来查找刚刚创建的函数的零点。但如果你不知道,就可能需要更多学习向的文档,也许甚至是一个实际例子,来读懂参考文档。

这种文档结构还有助于阐明 包(package)(相关 Java 类和接口定义的集合)的含义,并显示特定库中捆绑了哪些包。

这种库的代码通常是在 en.wikipedia.org 中,它基本上是由 Java 的 命令创建的 .zip 文件,其中还包含一些其他有用的信息。.jar 文件通常被创建为构建过程的端点,该构建过程编译了所定义包中的所有 .java 文件。

要访问外部库提供的功能,有两个主要步骤:

1. 确保通过类路径(或者命令行中的 -cp 参数或者 CLASSPATH 环境变量),库可用于 Java 编译步骤( en.wikipedia.org)和执行步骤( )。

2. 使用恰当的 import 语句访问程序源代码中的包和类。

其余的步骤就与使用 String 等 Java核心类相同,使用库提供的类和接口定义来编写代码。很简单对吧?不过也没那么简单。首先,你需要了解库组件的预期使用模式,然后才能编写代码。

示例:连接 PostgreSQL 数据库

在数据库系统中访问数据的典型使用步骤是:

1. 访问正在使用的特定数据库软件代码。

2. 连接到数据库服务器。

3. 构建查询字符串。

4. 执行查询字符串。

5. 针对返回的结果,做需要的处理。

6. 断开与数据库服务器的连接。

所有这些面向程序员的部分由接口包 docs.oracle.com 提供,它独立于数据库,定义了核心客户端 Java 数据库连接(JDBC)API。java.sql 包是 Java 核心库的一部分,因此无需提供 .jar 文件即可编译。但每个数据库提供者都会创建自己的 java.sql 接口实现(例如 Connection 接口),并且必须在运行步骤中提供这些实现。

接下来我们使用 PostgreSQL,看看这一过程是如何进行的。

访问特定数据库的代码

以下代码使用 en.wikipedia.org(Class.forName() 调用)将 PostgreSQL 驱动程序代码加载到正在执行的虚拟机中:

  1. import java.sql.*;

  2. public class Test1 {

  3. public static void main(String args[]) {

  4. // Load the driver (jar file must be on class path) [1]

  5. try {

  6. Class.forName("org.postgresql.Driver");

  7. System.out.println("driver loaded");

  8. } catch (Exception e1) {

  9. System.err.println("couldn't find driver");

  10. System.err.println(e1);

  11. System.exit(1);

  12. }

  13. // If we get here all is OK

  14. System.out.println("done.");

  15. }

  16. }

因为类加载器可能失败,失败时会抛出异常,所以将对 Class.forName() 的调用放在 try-catch 代码块中。

如果你使用 编译上面的代码,然后用 运行,会报异常:

  1. me@mymachine:~/Test$ javac Test1.java

  2. me@mymachine:~/Test$ java Test1

  3. couldn't find driver

  4. java.lang.ClassNotFoundException: org.postgresql.Driver

  5. me@mymachine:~/Test$

类加载器要求类路径中有包含 PostgreSQL JDBC 驱动程序实现的 .jar 文件:

  1. me@mymachine:~/Test$ java -cp ~/src/postgresql-42.2.5.jar:. Test1

  2. driver loaded

  3. done.

  4. me@mymachine:~/Test$

连接到数据库服务器

以下代码实现了加载 JDBC 驱动程序和创建到 PostgreSQL 数据库的连接:

  1. import java.sql.*;

  2. public class Test2 {

  3. public static void main(String args[]) {

  4. // Load the driver (jar file must be on class path) [1]

  5. try {

  6. Class.forName("org.postgresql.Driver");

  7. System.out.println("driver loaded");

  8. } catch (Exception e1) {

  9. System.err.println("couldn't find driver");

  10. System.err.println(e1);

  11. System.exit(1);

  12. }

  13. // Set up connection properties [2]

  14. java.util.Properties props = new java.util.Properties();

  15. props.setProperty("user","me");

  16. props.setProperty("password","mypassword");

  17. String database = "jdbc:postgresql://myhost.org:5432/test";

  18. // Open the connection to the database [3]

  19. try (Connection conn = DriverManager.getConnection(database, props)) {

  20. System.out.println("connection created");

  21. } catch (Exception e2) {

  22. System.err.println("sql operations failed");

  23. System.err.println(e2);

  24. System.exit(2);

  25. }

  26. System.out.println("connection closed");

  27. // If we get here all is OK

  28. System.out.println("done.");

  29. }

  30. }

编译并运行上述代码:

  1. me@mymachine:~/Test$ javac Test2.java

  2. me@mymachine:~/Test$ java -cp ~/src/postgresql-42.2.5.jar:. Test2

  3. driver loaded

  4. connection created

  5. connection closed

  6. done.

  7. me@mymachine:~/Test$

关于上述的一些注意事项:

◈ 注释 [2] 后面的代码使用系统属性来设置连接参数(在本例中参数为 PostgreSQL 用户名和密码)。代码也可以从 Java 命令行获取这些参数并将所有参数作为参数包传递,同时还有一些其他 Driver.getConnection() 选项可用于单独传递参数。

◈ JDBC 需要一个用于定义数据库的 URL,它在上述代码中被声明为 String database 并与连接参数一起传递给 Driver.getConnection() 方法。

◈ 代码使用 try-with-resources 语句,它会在 try-catch 块中的代码完成后自动关闭连接。 stackoverflow.com 上对这种方法进行了长期的讨论。

try-with-resources 语句提供对 Connection 实例的访问,并可以在其中执行 SQL 语句;所有错误都会被同一个 catch 语句捕获。

用数据库的连接处理一些有趣的事情

日常工作中,我经常需要知道为给定的数据库服务器实例定义了哪些用户,这里我使用这个 www.postgresql.org 来获取所有用户的列表:

  1. import java.sql.*;

  2. public class Test3 {

  3. public static void main(String args[]) {

  4. // Load the driver (jar file must be on class path) [1]

  5. try {

  6. Class.forName("org.postgresql.Driver");

  7. System.out.println("driver loaded");

  8. } catch (Exception e1) {

  9. System.err.println("couldn't find driver");

  10. System.err.println(e1);

  11. System.exit(1);

  12. }

  13. // Set up connection properties [2]

  14. java.util.Properties props = new java.util.Properties();

  15. props.setProperty("user","me");

  16. props.setProperty("password","mypassword");

  17. String database = "jdbc:postgresql://myhost.org:5432/test";

  18. // Open the connection to the database [3]

  19. try (Connection conn = DriverManager.getConnection(database, props)) {

  20. System.out.println("connection created");

  21. // Create the SQL command string [4]

  22. String qs = "SELECT " +

  23. " u.usename AS \"User name\", " +

  24. " u.usesysid AS \"User ID\", " +

  25. " CASE " +

  26. " WHEN u.usesuper AND u.usecreatedb THEN " +

  27. " CAST('superuser, create database' AS pg_catalog.text) " +

  28. " WHEN u.usesuper THEN " +

  29. " CAST('superuser' AS pg_catalog.text) " +

  30. " WHEN u.usecreatedb THEN " +

  31. " CAST('create database' AS pg_catalog.text) " +

  32. " ELSE " +

  33. " CAST('' AS pg_catalog.text) " +

  34. " END AS \"Attributes\" " +

  35. "FROM pg_catalog.pg_user u " +

  36. "ORDER BY 1";

  37. // Use the connection to create a statement, execute it,

  38. // analyze the results and close the result set [5]

  39. Statement stat = conn.createStatement();

  40. ResultSet rs = stat.executeQuery(qs);

  41. System.out.println("User name;User ID;Attributes");

  42. while (rs.next()) {

  43. System.out.println(rs.getString("User name") + ";" +

  44. rs.getLong("User ID") + ";" +

  45. rs.getString("Attributes"));

  46. }

  47. rs.close();

  48. stat.close();

  49. } catch (Exception e2) {

  50. System.err.println("connecting failed");

  51. System.err.println(e2);

  52. System.exit(1);

  53. }

  54. System.out.println("connection closed");

  55. // If we get here all is OK

  56. System.out.println("done.");

  57. }

  58. }

在上述代码中,一旦有了 Connection 实例,它就会定义一个查询字符串(上面的注释 [4]),创建一个 Statement 实例并用其来执行查询字符串,然后将其结果放入一个 ResultSet 实例。程序可以遍历该 ResultSet 实例来分析返回的结果,并以关闭 ResultSetStatement 实例结束(上面的注释 [5])。

编译和执行程序会产生以下输出:

  1. me@mymachine:~/Test$ javac Test3.java

  2. me@mymachine:~/Test$ java -cp ~/src/postgresql-42.2.5.jar:. Test3

  3. driver loaded

  4. connection created

  5. User name;User ID;Attributes

  6. fwa;16395;superuser

  7. vax;197772;

  8. mbe;290995;

  9. aca;169248;

  10. connection closed

  11. done.

  12. me@mymachine:~/Test$

这是在一个简单的 Java 应用程序中使用 PostgreSQL JDBC 库的(非常简单的)示例。要注意的是,由于 java.sql 库的设计方式,它不需要在代码中使用像 import org.postgresql.jdbc.*; 这样的 Java 导入语句,而是使用 Java 类加载器在运行时引入 PostgreSQL 代码的方式,也正因此无需在代码编译时指定类路径。

via:

作者: 选题: 译者: 校对:

本文由 原创编译, 荣誉推出

欢迎遵照 CC-BY-NC-SA 协议规定转载,

如需转载,请在文章下留言 “ 转载:公众号名称”,

我们将为您添加白名单,授权“ 转载文章时可以修改”。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
梅西:如果有2次进世界杯决赛却没夺冠,那是巨大打击!

梅西:如果有2次进世界杯决赛却没夺冠,那是巨大打击!

历史第一人梅西
2024-06-13 20:54:33
苏轼65岁大彻大悟,在常州写下绝笔诗,短短四句感动世人一千年

苏轼65岁大彻大悟,在常州写下绝笔诗,短短四句感动世人一千年

牛锅巴小钒
2024-05-17 08:53:27
四川一男子大专毕业6年,因送外卖跑快递仅存1500块,被母亲驱赶

四川一男子大专毕业6年,因送外卖跑快递仅存1500块,被母亲驱赶

少点意思
2024-06-13 18:36:45
河南持续干旱,女子请假回老家帮爷爷抽井水浇地:他守着土地也守着他的家

河南持续干旱,女子请假回老家帮爷爷抽井水浇地:他守着土地也守着他的家

潇湘晨报
2024-06-13 18:41:07
6000万镑!曼联买不起这天才,19场英超造16球,有望加盟切尔西

6000万镑!曼联买不起这天才,19场英超造16球,有望加盟切尔西

体育知多少
2024-06-14 09:16:27
郝蕾表演课300一节,吴谨言进组前学习三个月,网友:价格真亲民

郝蕾表演课300一节,吴谨言进组前学习三个月,网友:价格真亲民

大眼瞄世界
2024-06-13 23:56:57
将帅失和?基德怒喷东契奇,不防守还想拿总冠军?

将帅失和?基德怒喷东契奇,不防守还想拿总冠军?

阿牛体育说
2024-06-14 02:49:57
太阳报:滕哈格在续约前提出满足三个要求,包括不让桑乔回归

太阳报:滕哈格在续约前提出满足三个要求,包括不让桑乔回归

懂球帝
2024-06-13 12:49:07
解放军 3 艘 055 万吨大驱同时现身南海,史无前例  战之震慑性强

解放军 3 艘 055 万吨大驱同时现身南海,史无前例 战之震慑性强

头条爆料007
2024-06-13 16:36:45
怪不得周迅自信的魔改《如懿传》,看看全剧组的人是怎么捧杀她的

怪不得周迅自信的魔改《如懿传》,看看全剧组的人是怎么捧杀她的

娱记掌门
2024-06-13 13:29:42
我突然理解,为啥上海女孩子真不会精致土

我突然理解,为啥上海女孩子真不会精致土

小虎新车推荐员
2024-06-13 17:30:33
发力!除了奥斯卡:国足还有2名新归化可在18强赛使用!

发力!除了奥斯卡:国足还有2名新归化可在18强赛使用!

林子说事
2024-06-14 08:49:56
徐峥《逆行人生》来袭,我想说:拿下30亿票房不是没可能

徐峥《逆行人生》来袭,我想说:拿下30亿票房不是没可能

八卦南风
2024-06-12 14:41:21
巴克利:东契奇的防守可不是独行侠0-3落后的原因

巴克利:东契奇的防守可不是独行侠0-3落后的原因

直播吧
2024-06-13 21:00:10
近期牛肉价格为何持续下跌?

近期牛肉价格为何持续下跌?

半月谈APP
2024-06-13 09:30:36
记者:伊万科维奇不熟悉中国足球,菱形站位高估中国球员的能力

记者:伊万科维奇不熟悉中国足球,菱形站位高估中国球员的能力

直播吧
2024-06-14 08:12:05
国民才女武亦姝清华毕业,爸爸简历被扒,网友们都炸了!

国民才女武亦姝清华毕业,爸爸简历被扒,网友们都炸了!

财经要参
2024-06-12 08:23:08
马云采访中一度哽咽,几次抬头止住眼泪说:都难,现在大家都难

马云采访中一度哽咽,几次抬头止住眼泪说:都难,现在大家都难

元气科技馆
2024-05-20 17:52:48
女模特私密视频意外泄露遭疯狂传播,本人崩溃痛哭,恳求不要观看

女模特私密视频意外泄露遭疯狂传播,本人崩溃痛哭,恳求不要观看

吃鱼思故渊
2024-05-17 22:00:37
只要钱到位,啥姿势都会。网络“女主播”的遮羞布也被撕开了

只要钱到位,啥姿势都会。网络“女主播”的遮羞布也被撕开了

娱记掌门
2024-06-13 08:10:25
2024-06-14 10:08:49
Linux
Linux
Linux 中国开源社区
8016文章数 73123关注度
往期回顾 全部

科技要闻

马斯克重获信任 豪言特斯拉市值超10个苹果

头条要闻

牛弹琴:西方领导人失意 今年或是自己最后一次G7峰会

头条要闻

牛弹琴:西方领导人失意 今年或是自己最后一次G7峰会

体育要闻

乔丹最想单挑的男人走了

娱乐要闻

森林北报案,称和汪峰的感情遭受压力

财经要闻

私募大佬孙强:中国为什么缺少耐心资本

汽车要闻

升级8155芯片 新款卡罗拉锐放售12.98-18.48万

态度原创

亲子
本地
艺术
手机
公开课

亲子要闻

宝宝晚上哭闹要吃东西,妈妈拿出馒头,宝宝立刻破涕为笑

本地新闻

粽情一夏|海河龙舟赛,竟然成了外国人的大party!

艺术要闻

穿越时空的艺术:《马可·波罗》AI沉浸影片探索人类文明

手机要闻

京东方宣布独供荣耀首款小折叠手机Magic V Flip内外屏

公开课

近视只是视力差?小心并发症

无障碍浏览 进入关怀版