本文共 15116 字,大约阅读时间需要 50 分钟。
java使用外部库
Java附带了一组核心库,其中包括定义常用数据类型和相关行为的库,例如String或Date ; 与主机操作系统进行交互的实用程序,例如System或File ; 有用的子系统来管理安全性,处理网络通信以及创建或解析XML。 考虑到核心库的丰富性,通常很容易找到必要的点点滴滴,以减少程序员为解决问题而必须编写的代码量。
即使这样,人们还是发现了很多有趣的Java库,这些人发现了核心库中的空白。 例如, “是一个专注于可重用Java组件各个方面的Apache项目”,并提供了约43个开源库的集合(截至本文撰写),涵盖了Java核心之外的一系列功能(例如, 或 ),或者增强或替换Java核心中的功能(例如或 )。
Java库的另一种常见类型是系统组件(例如,数据库系统)的接口。 本文着眼于使用这样的接口连接到数据库并获得一些有趣的信息。 但是首先,我将回顾库的重要内容。
当然,一个库必须包含一些有用的代码。 但是有用的是,必须以某种方式组织代码,以便Java程序员可以访问组件来解决当前的问题。
我将大胆地宣称,库的最重要部分是其应用程序编程接口(API)文档。 这种文档为许多人所熟悉,并且通常由生成, 读取代码中的结构化注释,并生成HTML输出,该输出在页面左上角的面板中显示API的程序包。 它的类在左下角; 以及右侧的库,包或类级别的详细文档(取决于在主面板中选择的内容)。 例如, 的如下所示:
在主面板中单击一个程序包将显示该程序包中定义的Java类和接口。 例如, 显示了诸如BisectionSolver之类的类, 该类使用二分法查找单变量实函数的零。 并点击链接列表类BisectionSolver的所有方法。
org.apache.commons.math4.analysis.function ,您可以想象使用该包来构成一个函数定义,然后使用 org.apache.commons.math4.analysis.solvers包来查找刚创建的函数的零。 但是,实际上,您可能需要更多面向学习的文档才能桥接到参考文档。 也许甚至是一个例子!该文档结构还有助于阐明程序包的含义(相关Java类和接口定义的集合),并显示在特定库中捆绑了哪些程序包。
此类库的代码通常在找到,该基本上是Java jar命令创建的.zip文件,其中包含一些其他有用的信息。 .jar文件通常创建为编译过程的终结点,该编译过程将编译定义的各种程序包中的所有.java文件。
要访问外部库提供的功能,有两个主要步骤:
其余的就像使用Java核心类(例如String)进行编码-使用库提供的类和接口定义编写代码。 容易吗? 好吧,也许不是那么容易。 首先,您需要了解库组件的预期使用模式,然后才能编写代码。
在数据库系统中访问数据的典型使用模式是:
所有这些的面向程序员的部分由独立于数据库的接口包 ,该接口包定义了核心客户端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$
上面的一些注意事项:
在日常工作中,我经常需要知道已为给定的数据库服务器实例定义了哪些用户,并且使用此来获取所有用户的列表:
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实例中,可以对其进行迭代通过分析返回的结果,最后以同时关闭ResultSet和Statement实例结束(上面的注释[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/