从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
命令,支持多种数据类型。 下表显示了各种类型。
句法 | 描述 |
---|---|
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
命令。 这些功能包括在单独的线程中运行命令的能力,将命令重复指定次数的能力,查看输入命令历史记录的命令以及控制输出数据格式的命令。
如您所见,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