从7.6版开始,JTOpen(7.6版和更高版本)包括一个简单的JDBC客户端程序jdbcClient ,以简化JDBC和SQL开发人员的工作。 jdbcClient是仅使用Java实现的命令行客户端,可以从具有Java虚拟机(JVM)的任何平台上运行。 使用jdbcClient程序,您可以轻松连接到数据库并运行SQL语句。 对于大多数Java开发人员而言,这比启动另一个程序(例如System i Navigator的Run SQL脚本)要容易。 使用此客户端,您可以快速查看运行特定SQL语句的结果,并可以尝试复杂的JDBC方法,而无需编写和编译Java程序。
要使用jdbcClient ,您只需将JDBC驱动程序的.jar文件添加到类路径中,并为要连接的数据库服务器指定JDBC URL。 连接到数据库服务器后,您可以对该服务器执行SQL命令。 jdbcClient还允许使用JDBC PreparedStatements将各种参数类型传递给数据库。 作为增强的开发人员工具, jdbcClient还允许使用反射来涉及Java和JDBC对象上的方法。
连接到数据库
jdbcClient包含在JTOpen的jt400.jar文件中,名为com.ibm.as400.access.jdbcClient.Main。 要使用客户端,请启动Main程序并将3个参数传递给该程序:JDBC URL,用户ID和密码。 JDBC URL是Java的DriverManager.getConnection方法接受的JDBC URL。 因为测试程序接受JDBC URL,所以它可以使用JTOpen JDBC驱动程序以外的其他JDBC驱动程序,只要它们包含在类路径中即可。
要在Microsoft®Windows®或Linux®平台上使用JTOpen驱动程序连接到i®的IBM®DB2® ,只需在类路径上使用jt400.jar启动jdbcClient ,然后添加JDBC URL,用户ID和密码。
java –cp jt400.jar com.ibm.as400.access.jdbcClient.Main jdbc:as400:SYSTEM USERID PASSWORD
您还可以通过从Qshell解释器(qsh)启动客户机来使用本机JDBC驱动程序连接到i2。 在这种情况下,您再次需要将jt400.jar添加到类路径,但是在这种情况下,可以从系统的出厂位置加载它。 您不需要为本地JDBC驱动程序添加.jar文件,因为它已在Java扩展类路径中找到。 使用本地JDBC驱动程序连接到本地系统时,无需在连接请求上指定用户ID和密码。 如果未指定用户ID,则本机JDBC驱动程序将使用当前用户ID进行连接。
java –cp /QIBM/ProdData/OS400/JT400/lib/jt400.jar com.ibm.as400.access.jdbcClient.Main jdbc:db2:localhost
您还可以使用来自IBMAIX®,Windows或Linux系统的IBM DB2 Connect™JDBC驱动程序连接到i for DB2。 在这种情况下,您的类路径必须包含jt400.jar以及驱动程序的JAR文件:db2jcc4.jar和db2jcc_license_cisuz.jar。 在这种情况下,JDBC URL的格式为jdbc:db2:// SYSTEM:446 / * LOCAL,其中SYSTEM是系统名称 ,446是IBM i上服务器的端口 ,而* LOCAL表示本地数据库是要使用的。
java –cp jt400.jar:db2jcc4.jar:db2jcc_license_cisuz.jar
com.ibm.as400.access.jdbcClient.Main jdbc:db2://SYSTEM:446/*LOCAL USERID PASSWORD
您也可以连接到DB2 for i以外的数据库。 在Linux上运行时,可以通过在类路径中包括mysql.jar并使用jdbc:mysql JDBC URL连接到MySQL数据库。
java –cp jt400.jar: mysql.jar com.ibm.as400.access.jdbcClient.Main
jdbc:mysql://localhost/DATABASE USERID PASSWORD
jdbcClient是有用的工具,可用于使用各种JDBC驱动程序连接到各种数据库系统。
运行简单的语句
连接后, jdbcClient将提供一个命令提示符,用于输入SQL语句和其他命令。 此提示假定所有内容都是SQL命令,但以'!'开头的jdbcClient命令除外。
这是对DB2 i服务器运行各种SQL语句以创建表,将数据插入表中,从表中检索数据以及调用存储过程的示例。
>java -cp jt400.jar com.ibm.as400.access.jdbcClient.Main jdbc:as400:SYSTEM UID PWD
>create table sample(c1 int, c2 varchar(80))
>insert into sample values(1,'abc')
>select * from sample
C1,C2
1,abc
>call sysibm.sqltables(null,null,'SAMPLE',null,null)
*** Warning ***
SQLState: 0100C
Message: [SQL0466] 1 result sets are available from procedure SQLTABLES in SYSIBM.
Vendor: 466
TABLE_CAT,TABLE_SCHEM,TABLE_NAME,TABLE_TYPE,REMARKS
SYSTEM,UID,SAMPLE,TABLE,null
从上面可以看出, jdbcClient的查询输出非常简单,仅使用逗号分隔输出列。 输出的第一行包含列名,其余的行包含输出数据。 jdbcClient还显示遇到的警告,如上面的SQL0466警告所示。
可以在call
语句后使用—INPARM
将参数传递给存储过程调用。 这是使用此语法调用过程的示例。
>call sysibm.sqltables(null,null,?,null,null) -- INPARM SAMPLE
*** Warning ***
SQLState: 0100C
Message: [SQL0466] 1 result sets are available from procedure SQLTABLES in SYSIBM.
Vendor: 466
TABLE_CAT,TABLE_SCHEM,TABLE_NAME,TABLE_TYPE,REMARKS
SYSTEM,UID,SAMPLE,TABLE,null
jdbcClient识别到存储过程返回了一个结果集,并显示了该结果集的内容。
使用准备好的语句
使用jdbcClient客户端命令,您还可以运行Java应用程序中常用的准备好的语句。 准备好的语句通常与参数标记一起使用,参数标记允许每次运行语句时更改参数。 使用准备好的语句通常包括三个部分:准备语句,设置参数和运行语句。
!PREPARE
命令用于准备语句。 !SETPARM
命令用于设置参数。 !EXECUTEUPDATE
或!EXECUTEQUERY
命令用于运行准备好的语句。 这是一个使用准备好的语句将数据插入表中的示例。
>!PREPARE insert into sample values(?,?)
>!SETPARM 1,10
>!SETPARM 2,insert1
>!EXECUTEUPDATE
>!SETPARM 1,10
>!SETPARM 2,insert2
>!EXECUTEUPDATE
>select * from sample where c1=10
C1,C2
10,insert1
10,insert2
在此示例中,将两行添加到表中,然后运行查询以说明实际上已插入数据。
对于!SETPARM
命令,支持多种数据类型。 下表显示了各种类型。
表1.!SETPARM命令支持的数据类型
句法 | 描述 |
---|---|
UX'....' | Unicode字符串(十六进制) |
X'....' | 字节数组(十六进制) |
FILEBLOB = <文件名> | 从命名文件中检索到的二进制大对象(BLOB) |
FILECLOB = <文件名> | 从命名文件中检索的字符大对象(CLOB) |
SAVEDPARM = <编号> | 来自上一个CALL语句的参数 |
SQLARRAY [TYPE:e1:e2:...] | JAVA.SQL.ARRAY类型:支持的类型有: String:BigDecimal:Time:Blob:Clob:int:short: long:float:double:byteArray |
这是使用某些各种类型的示例。
>!PREPARE select cast(? AS VARGRAPHIC(40) CCSID 1200) from sysibm.sysdummy1
>!SETPARM 1,UX'0233'
>!EXECUTEQUERY
00001
U'0233'
>!PREPARE select cast(? AS VARBINARY(10)) from sysibm.sysdummy1
>!SETPARM 1,X'aa'
>!EXECUTEQUERY
00001
aa
>!PREPARE select cast(? AS BLOB),cast(? AS CLOB) from sysibm.sysdummy1
>!PREPARE select cast(? AS BLOB),cast(? AS CLOB) from sysibm.sysdummy1
>!SETPARM 1,FILEBLOB=file.txt
>!SETPARM 2,FILECLOB=file.txt
>!EXECUTEQUERY
00001,00002
5468697320697320612066696c650a, This is a file
如上所示,使用U '符号显示了不可打印的Unicode字符。 任何二进制数据均显示为十六进制值。
使用反射
jdbcClient的一个吸引JDBC开发人员的独特功能是能够使用反射调用Java方法。 通过使用反射,对Java方法的调用不需要来自已编译的代码,而是可以动态解决的。 jdbcClient有三个使用反射的主要命令。 !CALLMETHOD
命令用于调用静态方法或实例方法。 !SETVAR
命令用于通过方法调用的结果设置变量。 jdbcClient维护引用Java对象的变量列表。 !SETNEWVAR
命令用于调用构造函数以创建新对象。 以下是如何使用这些调用的示例。
>!CALLMETHOD java.lang.System.getProperty(java.version)
Call returned 1.6.0
>!CALLMETHOD CON.getCatalog()
Call returned MYSYSTEM
>!SETVAR DMD=CON.getMetaData()
DMD=MYSYSTEM
>!SETVAR DRS=DMD.getTables(null,null,SAMPLE,null)
DRS=CRSR0008
>!CALLMETHOD com.ibm.as400.access.jdbcClient.Main.dispResultSet(DRS)
TABLE_CAT,TABLE_SCHEM,TABLE_NAME,TABLE_TYPE,REMARKS,TYPE_CAT,TYPE_SCHEM,TYPE_NAME,
SELF_REFERENCING_COL_NAME,REF_GENERATION
MYSYSTEM,EBERHARD,SAMPLE,TABLE,null,null,null,null,null,null Call returned null
>!SETNEWVAR MYINT=java.lang.Integer(10)
MYINT=10
在第一次调用中,将调用System.getProperty
静态方法来获取java.version
属性。 在第二个调用中,将调用现有CON对象上的getCatalog()
方法。 !SETVAR
命令用于从CON
对象获取DatabaseMetaData
对象,然后使用对getTables()
的调用获取ResultSet
。 要显示结果集,请使用jdbcClient.Main
类的静态方法dispResultSet
。 最后一个调用显示了java.lang.Integer
对象的创建。
为了帮助使用分配给变量的对象, jdbcClient提供了!SHOWVARMETHODS
命令。 不带任何参数调用时,此命令将显示已定义的变量。 这是使用此命令的示例。
>!SHOWVARMETHODS
Could not find variable
Valid variables are the following
DMD
STMT
MAIN
DRS
CON
与变量结合使用时, !SHOWVARMETHODS
命令显示可以在对象上调用的方法。 例如,这是可以在CON
JDBC连接对象上调用的方法的示例。
>!SHOWVARMETHODS CON
boolean equals(java.lang.Object)
int hashCode()
java.lang.String toString()
void clearWarnings()
void close()
void commit()
java.sql.Statement createStatement()
java.sql.Statement createStatement(int,int)
java.sql.Statement createStatement(int,int,int)
boolean getAutoCommit()
反射的使用不仅限于JDBC对象。 您可以使用jdbcClient尝试各种Java对象。 首次使用Java类时,这对于无需编写和编译Java程序即可试验Java类的行为很有用。
附加功能
jdbcClient具有多种其他功能。 要查看可以做什么,只需使用jdbcClient !HELP
命令。 这些功能包括在单独的线程中运行命令的能力,将命令重复指定次数的能力,查看输入命令历史记录的命令以及控制输出数据格式的命令。
Summary
如您所见,JTOpen命令行jdbcClient允许连接到JDBC驱动程序支持的任何数据库。 更重要的是, jdbcClient提供了一种通过JDBC运行SQL语句的简便方法。 它还为各种数据类型的准备好的语句和参数提供支持。 最后,它通过反射公开Java对象,从而允许动态调用Java方法。 jdbcClient提供了一种快速简便的方法来使用JDBC驱动程序及其连接的数据库,从而成为Java JDBC开发人员不可替代的工具。
资源资源
翻译自: https://www.ibm.com/developerworks/ibmi/library/i-jtopen-jdbc-client/index.html