博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java使用外部库_在Java中使用外部库
阅读量:2524 次
发布时间:2019-05-11

本文共 15116 字,大约阅读时间需要 50 分钟。

java使用外部库

Java附带了一组核心库,其中包括定义常用数据类型和相关行为的库,例如StringDate ; 与主机操作系统进行交互的实用程序,例如SystemFile ; 有用的子系统来管理安全性,处理网络通信以及创建或解析XML。 考虑到核心库的丰富性,通常很容易找到必要的点点滴滴,以减少程序员为解决问题而必须编写的代码量。

即使这样,人们还是发现了很多有趣的Java库,这些人发现了核心库中的空白。 例如, “是一个专注于可重用Java组件各个方面的Apache项目”,并提供了约43个开源库的集合(截至本文撰写),涵盖了Java核心之外的一系列功能(例如, 或 ),或者增强或替换Java核心中的功能(例如或 )。

Java库的另一种常见类型是系统组件(例如,数据库系统)的接口。 本文着眼于使用这样的接口连接到数据库并获得一些有趣的信息。 但是首先,我将回顾库的重要内容。

什么是图书馆?

当然,一个库必须包含一些有用的代码。 但是有用的是,必须以某种方式组织代码,以便Java程序员可以访问组件来解决当前的问题。

我将大胆地宣称,库的最重要部分是其应用程序编程接口(API)文档。 这种文档为许多人所熟悉,并且通常由生成, 读取代码中的结构化注释,并生成HTML输出,该输出在页面左上角的面板中显示API的程序包。 它的类在左下角; 以及右侧的库,包或类级别的详细文档(取决于在主面板中选择的内容)。 例如, 的如下所示:

API documentation for Apache Commons Math

在主面板中单击一个程序包将显示该程序包中定义的Java类和接口。 例如, 显示了诸如BisectionSolver之类的类, 该类使用二分法查找单变量实函数的零。 并点击链接列表类BisectionSolver的所有方法。

org.apache.commons.math4.analysis.function ,您可以想象使用该包来构成一个函数定义,然后使用
org.apache.commons.math4.analysis.solvers包来查找刚创建的函数的零。 但是,实际上,您可能需要更多面向学习的文档才能桥接到参考文档。 也许甚至是一个例子!

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

此类库的代码通常在找到,该基本上是Java jar命令创建的.zip文件,其中包含一些其他有用的信息。 .jar文件通常创建为编译过程的终结点,该编译过程将编译定义的各种程序包中的所有.java文件。

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

  1. 确保通过类路径(命令行上的-cp参数或CLASSPATH环境变量)可用于Java编译步骤和执行步骤java的库。
  2. 使用适当的import语句访问程序源代码中的包和类。

其余的就像使用Java核心类(例如String)进行编码-使用库提供的类和接口定义编写代码。 容易吗? 好吧,也许不是那么容易。 首先,您需要了解库组件的预期使用模式,然后才能编写代码。

示例:连接到PostgreSQL数据库

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

  1. 可以访问特定于所用数据库软件的代码。
  2. 连接到数据库服务器。
  3. 建立查询字串。
  4. 执行查询字符串。
  5. 对返回的结果进行处理。
  6. 与数据库服务器断开连接。

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

让我们看看如何使用PostgreSQL。

访问数据库特定的代码

以下代码使用 ( Class.forName()调用)将PostgreSQL驱动程序代码引入正在执行的虚拟机中:

import      
java.sql.*
;
public
class Test1
{
   
public
static
void main
( args
[
]
)
{
       
// Load the driver (jar file must be on class path) [1]
       
try
{
           
Class .
forName
(
"org.postgresql.Driver"
)
;
            .
out .
println
(
"driver loaded"
)
;
       
}
catch
( e1
)
{
            .
err .
println
(
"couldn't find driver"
)
;
            .
err .
println
( e1
)
;
            .
exit
(
1
)
;
       
}
       
// If we get here all is OK
        .
out .
println
(
"done."
)
;
   
}
}

由于类加载器可能失败,因此失败时可能引发异常,因此请在try-catch块中包含对Class.forName()的调用。

如果使用javac编译上述代码并使用Java运行它:

me@mymachine      
: ~
/ Test$ javac Test1.
java
me@mymachine
: ~
/ Test$ java Test1
couldn
't find driver java.lang.ClassNotFoundException: org.postgresql.Driver me@mymachine:~/Test$

类加载器需要将包含PostgreSQL JDBC驱动程序实现的.jar文件放在类路径上:

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

连接到数据库服务器

以下代码加载JDBC驱动程序并创建与PostgreSQL数据库的连接:

import      
java.sql.*
;
public
class Test2
{
       
public
static
void main
( args
[
]
)
{
               
// Load the driver (jar file must be on class path) [1]
               
try
{
                       
Class .
forName
(
"org.postgresql.Driver"
)
;
                        .
out .
println
(
"driver loaded"
)
;
               
}
catch
( e1
)
{
                        .
err .
println
(
"couldn't find driver"
)
;
                        .
err .
println
( e1
)
;
                        .
exit
(
1
)
;
               
}
               
// Set up connection properties [2]
                java.
util . props
=
new java.
util .
(
)
;
                props.
setProperty
(
"user" ,
"me"
)
;
                props.
setProperty
(
"password" ,
"mypassword"
)
;
                database
=
"jdbc:postgresql://myhost.org:5432/test"
;
               
// Open the connection to the database [3]
               
try
( conn
= .
getConnection
( database, props
)
)
{
                        .
out .
println
(
"connection created"
)
;
               
}
catch
( e2
)
{
                        .
err .
println
(
"sql operations failed"
)
;
                        .
err .
println
( e2
)
;
                        .
exit
(
2
)
;
               
}
                .
out .
println
(
"connection closed"
)
;
               
// If we get here all is OK
                .
out .
println
(
"done."
)
;
       
}
}

编译并运行它:

me@mymachine      
: ~
/ Test$ javac Test2.
java
me@mymachine
: ~
/ Test$ java
- cp ~
/ src
/ postgresql
- 42.2.5.
jar
: .
Test2
driver loaded
connection created
connection closed
done.
me @mymachine
: ~
/ Test$

上面的一些注意事项:

  • 注释[2]之后的代码使用系统属性来设置连接参数,在本例中为PostgreSQL用户名和密码。 这样就可以从Java命令行中获取这些参数,并将所有参数作为参数捆绑传递。 还有其他Driver.getConnection()选项可用于分别传递参数。
  • JDBC需要用于定义数据库的URL,该URL在上面被声明为String数据库 ,并与连接参数一起传递到Driver.getConnection()方法中。
  • 该代码使用try-with-resources,它会在try-catch块中的代码完成后自动关闭连接。 关于的这种方法有很长的讨论。
  • try-with-resources提供对Connection实例的访问,并可以在其中执行SQL语句。 任何错误都将被同一catch语句捕获

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

在日常工作中,我经常需要知道已为给定的数据库服务器实例定义了哪些用户,并且使用此来获取所有用户的列表:

import      
java.sql.*
;
public
class Test3
{
       
public
static
void main
( args
[
]
)
{
               
// Load the driver (jar file must be on class path) [1]
               
try
{
                       
Class .
forName
(
"org.postgresql.Driver"
)
;
                        .
out .
println
(
"driver loaded"
)
;
               
}
catch
( e1
)
{
                        .
err .
println
(
"couldn't find driver"
)
;
                        .
err .
println
( e1
)
;
                        .
exit
(
1
)
;
               
}
               
// Set up connection properties [2]
                java.
util . props
=
new java.
util .
(
)
;
                props.
setProperty
(
"user" ,
"me"
)
;
                props.
setProperty
(
"password" ,
"mypassword"
)
;
                database
=
"jdbc:postgresql://myhost.org:5432/test"
;
               
// Open the connection to the database [3]
               
try
( conn
= .
getConnection
( database, props
)
)
{
                        .
out .
println
(
"connection created"
)
;
                       
// Create the SQL command string [4]
                        qs
=
"SELECT "
+
                               
"       u.usename AS \" User name \" , "
+
                               
"       u.usesysid AS \" User ID \" , "
+
                               
"       CASE "
+
                               
"       WHEN u.usesuper AND u.usecreatedb THEN "
+
                               
"               CAST('superuser, create database' AS pg_catalog.text) "
+
                       
"       WHEN u.usesuper THEN "
+
                               
"               CAST('superuser' AS pg_catalog.text) "
+
                               
"       WHEN u.usecreatedb THEN "
+
                               
"               CAST('create database' AS pg_catalog.text) "
+
                               
"       ELSE "
+
                               
"               CAST('' AS pg_catalog.text) "
+
                               
"       END AS \" Attributes \" "
+
                               
"FROM pg_catalog.pg_user u "
+
                               
"ORDER BY 1"
;
                       
// Use the connection to create a statement, execute it,
                       
// analyze the results and close the result set [5]
                        stat
= conn.
createStatement
(
)
;
                        rs
= stat.
executeQuery
( qs
)
;
                        .
out .
println
(
"User name;User ID;Attributes"
)
;
                       
while
( rs.
next
(
)
)
{
                                .
out .
println
( rs.
getString
(
"User name"
)
+
";"
+
                                                rs.
getLong
(
"User ID"
)
+
";"
+
                                                rs.
getString
(
"Attributes"
)
)
;
                       
}
                        rs.
close
(
)
;
                        stat.
close
(
)
;
               
               
}
catch
( e2
)
{
                        .
err .
println
(
"connecting failed"
)
;
                        .
err .
println
( e2
)
;
                        .
exit
(
1
)
;
               
}
                .
out .
println
(
"connection closed"
)
;
               
// If we get here all is OK
                .
out .
println
(
"done."
)
;
       
}
}

在上面的示例中,一旦拥有Connection实例,它就定义了一个查询字符串(上面的注释[4]),创建了一个Statement实例,并使用它执行查询字符串,然后将其结果放入ResultSet实例中,可以对其进行迭代通过分析返回的结果,最后以同时关闭ResultSetStatement实例结束(上面的注释[5])。

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

me@mymachine      
: ~
/ Test$ javac Test3.
java
me@mymachine
: ~
/ Test$ java
- cp ~
/ src
/ postgresql
- 42.2.5.
jar
: .
Test3
driver loaded
connection created
User name
; User ID
;
fwa
;
16395
; superuser
vax
;
197772
;
mbe
;
290995
;
aca
;
169248
;
connection closed
done.
me @mymachine
: ~
/ Test$

这是在简单的Java应用程序中使用PostgreSQL JDBC库的一个(非常简单的)示例。 值得强调的是,它不需要使用诸如import org.postgresql.jdbc。*之类的Java import语句 由于设计java.sql库的方式而在代码中出现错误。 因此,无需在编译时指定类路径。 相反,它使用Java类加载器在运行时引入PostgreSQL代码。

翻译自:

java使用外部库

转载地址:http://raczd.baihongyu.com/

你可能感兴趣的文章
Java Bigdecimal使用
查看>>
SQL注入之绕过WAF和Filter
查看>>
jquery validate使用方法
查看>>
DataNode 工作机制
查看>>
windows系统下安装MySQL
查看>>
错误提示总结
查看>>
实验二+070+胡阳洋
查看>>
Linux IPC实践(3) --具名FIFO
查看>>
Qt之模拟时钟
查看>>
第一次接触安卓--记于2015.8.21
查看>>
(转)在分层架构下寻找java web漏洞
查看>>
mac下多线程实现处理
查看>>
C++ ifstream ofstream
查看>>
跟初学者学习IbatisNet第四篇
查看>>
seL4环境配置
查看>>
Git报错:insufficient permission for adding an object to repository database .git/objects
查看>>
ajax跨域,携带cookie
查看>>
BZOJ 1600: [Usaco2008 Oct]建造栅栏( dp )
查看>>
洛谷 CF937A Olympiad
查看>>
Codeforces Round #445 C. Petya and Catacombs【思维/题意】
查看>>