首页 > 数据库 > 数据库开发技术 > 介绍一个小巧的开源数据库工具henplus
以前自己也写过一些小工具。比如xsql cmd client, JMyETL. 后来由于时间关系, 基本上没有持续维护。本文介绍一款用java实现的henplus数据库客户端工具,使用jdbc连接数据库,对于常规的sql命令操作以及库表数据的导入导出操作来说,非常方便。
下载及编译,请自行google。 不过,具体到某一个平台,最好自己手动整理一下build出来的结果。
我最后整理出来的henplus.bat内容如下:
@echo off:: henplus.bat - Windows script to launch SQL shellecho "%~dp0*"java -cp "%~dp0*" henplus.HenPlus %*:: End henplus.bat
将它放到一个单独的目录:henplus下,这个目录同时放入其它要用到的jar文件,至少包含下边几个文件:
09/11/2019 11:12 AM 41,123 commons-cli-1.2.jar09/11/2019 11:12 AM 249,503 henplus.jar05/01/2009 10:46 PM 7,739 libreadline-java-0.8.0.jar
本文就以HANA的连接为例,简单介绍一下,上边的四个文件就可以运行那个客户端工具了。但是没有任何jdbc驱动。也就连不了任何数据库。
1. 放入具体的jdbc 驱动: HANA的是:
07/03/2016 04:49 PM 815,821 com.sap.db.jdbc-1.00.61.380109.jar2. 进到henplus目录,注册驱动:
C:\SAPDevelop\work\learnings\henplus>henplus.bat"C:\SAPDevelop\work\learnings\henplus\*"no readline found (no JavaReadline in java.library.path). Using simple stdin.using GNU readline (Brian Fox, Chet Ramey), Java wrapper by Bernhard Bablokcreating henplus config dirhenplus config at C:\Users\i062873\.henplus----------------------------------------------------------------------------HenPlus II 0.9.8 "Yay Labor Day"Copyright(C) 1997..2009 Henner Zeller <H.Zeller@acm.org>HenPlus is provided AS IS and comes with ABSOLUTELY NO WARRANTYThis is free software, and you are welcome to redistribute it under theconditions of the GNU Public License <http://www.gnu.org/licenses/gpl2.txt>----------------------------------------------------------------------------Hen*Plus> list-driversloaded drivers are marked with '*' (otherwise not found in CLASSPATH)------------+---------------------------------+---------+---------------------------------------+[1m for [m |[1m driver class [m |[1m Version[m |[1m sample url [m |------------+---------------------------------+---------+---------------------------------------+Adabas | de.sag.jdbc.adabasd.ADriver | [1;30m[NULL] [m | jdbc:adabasd://localhost:7200/work |DB2 | COM.ibm.db2.jdbc.net.DB2Driver | [1;30m[NULL] [m | jdbc:db2://localhost:6789/foobar |MySQL | org.gjt.mm.mysql.Driver | [1;30m[NULL] [m | jdbc:mysql://localhost/foobar |Oracle | oracle.jdbc.driver.OracleDriver | [1;30m[NULL] [m | jdbc:oracle:thin:@localhost:1521:ORCL |Postgres | org.postgresql.Driver | [1;30m[NULL] [m | jdbc:postgresql://localhost/foobar |SAP-DB | com.sap.dbtech.jdbc.DriverSapDB | [1;30m[NULL] [m | jdbc:sapdb://localhost/foobar |------------+---------------------------------+---------+---------------------------------------+Hen*Plus> register hana com.sap.db.jdbc.DriverHen*Plus> list-driversloaded drivers are marked with '*' (otherwise not found in CLASSPATH)------------+---------------------------------+---------+---------------------------------------+[1m for [m |[1m driver class [m |[1m Version[m |[1m sample url [m |------------+---------------------------------+---------+---------------------------------------+Adabas | de.sag.jdbc.adabasd.ADriver | [1;30m[NULL] [m | jdbc:adabasd://localhost:7200/work |DB2 | COM.ibm.db2.jdbc.net.DB2Driver | [1;30m[NULL] [m | jdbc:db2://localhost:6789/foobar |MySQL | org.gjt.mm.mysql.Driver | [1;30m[NULL] [m | jdbc:mysql://localhost/foobar |Oracle | oracle.jdbc.driver.OracleDriver | [1;30m[NULL] [m | jdbc:oracle:thin:@localhost:1521:ORCL |Postgres | org.postgresql.Driver | [1;30m[NULL] [m | jdbc:postgresql://localhost/foobar |SAP-DB | com.sap.dbtech.jdbc.DriverSapDB | [1;30m[NULL] [m | jdbc:sapdb://localhost/foobar |* hana | com.sap.db.jdbc.Driver | 1.0 | [1;30m[NULL] [m |------------+---------------------------------+---------+---------------------------------------+Hen*Plus>注册成功。这之后就可以连接相应的数据库了。
3. 连接目标数据源,执行相应的数据库操作,简单至极,请看下边的操作
Hen*Plus> helphelp | ? : provides help for commandsabout | version | license : about HenPlusexit | quit : exits HenPlusecho | prompt : echo argumentlist-plugins | plug-in | plug-out : handle Pluginslist-drivers | register | unregister : handle JDBC driverslist-aliases | alias | unalias : handle Aliaseslist-key-bindings | bind-key-cmd : handle function key bindingsload | start | @ | @@ : load file and execute commandsconnect | disconnect | rename-session | switch | sessions: manage sessionsstatus : show status of this connectiontables | views | procedures | rehash : list available user objectsdescribe | idescribe : describe a database objecttree-view <tablename> : tree representation of connected tablesimport | import-check | import-print : import delimited data into tabledump-out | dump-in | verify-dump | dump-conditional | dump-select: handle table dumpssystem | ! : execute system commandsspool <filename>|off : log output to a fileset-var | unset-var | unset-all : set/unset variablesset-property | reset-property : set global HenPlus propertiesset-session-property | reset-session-property: set SQL-connection specific propertiessystem-info : print out some system information like memory usage.Full documentation at http://henplus.sf.net/config read from [C:\Users\******\.henplus]Hen*Plus> connect jdbc:sap://zeus.hana.canary.eu-central-1.whitney.dbaas.ondemand.com:22116?encrypt=true&validateCertificate=false¤tschema=37660BF7A8944CC692E41368012F0270HenPlus II connectingurl 'jdbc:sap://*****.eu-central-1.whitney.dbaas.ondemand.com:22116?encrypt=true&validateCertificate=false¤tschema=37660BF7A8944CC692E41368012F0270'driver version 1.0[10]: authentication failed============ authorization required ===Username: 37660BF7A89**********V3VRN6M6TBONV_RTPassword: Xk3CKpjX86L***************QnaFEAIpcrT_YX01m0zTAtotYPassword: ***********HDB - 2.00.40.00.1545918182read committed *37660BF7A8944C****0_6SASTBJK1JT9V3VRN6M6TBONV_RT@abcdef****.dbaas.ondemand.com> tables----------------------------------+---------------------------------+------------+---------+←[1m TABLE_SCHEM ←[m |←[1m TABLE_NAME ←[m |←[1mTABLE_TYPE←[m |←[1m REMARKS←[m |----------------------------------+---------------------------------+------------+---------+37660BF7A8944CC692E41368012F0270 | ANALYTICS_AGGREGATION_DATA | TABLE | ←[1;30m[NULL] ←[m |37660BF7A8944CC692E41368012F0270 | ANALYTICS_SHARDING_DBMAPPING | TABLE | ←[1;30m[NULL] ←[m |37660BF7A8944CC692E41368012F0270 | ANALYTICS_SHARDING_JOB_STATUS | TABLE | ←[1;30m[NULL] ←[m |37660BF7A8944CC692E41368012F0270 | ANALYTICS_SHARDING_PROVSIONING | TABLE | ←[1;30m[NULL] ←[m |37660BF7A8944CC692E41368012F0270 | ANALYTICS_SHARDING_TABLE_STATUS | TABLE | ←[1;30m[NULL] ←[m |37660BF7A8944CC692E41368012F0270 | CLIENT_FEEDBACK | TABLE | ←[1;30m[NULL] ←[m |37660BF7A8944CC692E41368012F0270 | CLIENT_USAGE | TABLE | ←[1;30m[NULL] ←[m |37660BF7A8944CC692E41368012F0270 | CLIENT_USERS | TABLE | ←[1;30m[NULL] ←[m |37660BF7A8944CC692E41368012F0270 | DIMENSION_MAPPING | TABLE | ←[1;30m[NULL] ←[m |37660BF7A8944CC692E41368012F0270 | METRIC_METADATA | TABLE | ←[1;30m[NULL] ←[m |37660BF7A8944CC692E41368012F0270 | METRIC_METADATA_EXT | TABLE | ←[1;30m[NULL] ←[m |37660BF7A8944CC692E41368012F0270 | SMP_STATISTICS | TABLE | ←[1;30m[NULL] ←[m |SYS | CS_BOE_PORTAL_SEARCH | TABLE | ←[1;30m[NULL] ←[m |_SYS_BI | BIMC_ALL_SOURCES | TABLE | ←[1;30m[NULL] ←[m |----------------------------------+---------------------------------+------------+---------+14 Tables found.导出某表的前100行数据:ntral-1.whitney.dbaas.ondemand.com> dump-select top100statistics.dump.gz SMP_STATISTICS SELECT TOP 100 * FROM SMP_STATISTICS;cannot handle type '0' for field 'CORRELATION_ID'; trying String..dump SMP_STATISTICS:(100 rows)dumping 'SMP_STATISTICS' took 103 msec total; 1.030 msec / row这时你打开文件top100statistics.dump,会发现它是一种json格式的文件,可读性非常好。////////////////////////////////(tabledump 'SMP_STATISTICS'(file-encoding 'UTF-8')(dump-version 1 1)(henplus-version '0.9.8')(time '2019-09-13 00:13:47.961')(database-info 'HDB - 2.00.40.00.1545918182')(estimated-rows '-1')(meta ('METRIC_NAME', 'METRIC_TIMESTAMP', 'VALUE' , 'ORGANIZATION_ID', 'SPACE_ID', 'APP_ID', 'SERVICE_NAME', 'CUSTOM1', 'CUSTOM2', 'CUSTOM3', 'CUSTOM4', 'CORRELATION_ID', 'SUBSCRIBER_ZONE_ID', 'IN_SHARDING')('STRING' , 'TIMESTAMP' , 'NUMERIC', 'STRING' , 'STRING' , 'STRING', 'STRING' , 'STRING' , 'STRING' , 'STRING' , 'STRING' , 'STRING' , 'STRING' , 'STRING' ))(data ('proxy_request_payload_size','2019-04-16 03:28:08.541',0,'d9d8680d-95c8-406e-8e6d-fa16de8faa39','0d492cc4-db5a-496e-b4d1-49240b052e4b','testoffline1','service-proxy',NULL,NULL,NULL,NULL,'ecde012d-98c9-442c-58fc-4385b3b36683','4a79476a-b15d-4305-8cde-9378a46b5b69',NULL)('proxy_request_payload_size','2019-04-16...........(rows 100))
从上边的help可以看到,它除了SQL中的D*L命令,还支持dump多表,单表,条件,以及SELECT等导出导入。
4. 再来一两个示例:
Hen*Plus> connect jdbc:sap://mo-2544e1cd3.mo.sap.corp:30015/?currentschema=mygomobile&databaseName=mygomobileHenPlus II connectingurl 'jdbc:sap://mo-2544e1cd3.mo.sap.corp:30015/?currentschema=mygomobile&databaseName=mygomobile'driver version 1.0[10]: authentication failed============ authorization required ===Username: gomobilePassword:Password: HDB - 2.00.37.00.1552531011read committed *gomobile@sap:mo-2544e1cd3.mo.sap.corp> describe t123describing table: 'T123' (corrected name)Table: T123---+--------+-------------+------+---------+-----------------------------+----+?[1m #?[m |?[1m column?[m |?[1m type ?[m |?[1m null?[m |?[1m default?[m |?[1mpk ?[m |?[1m fk?[m |---+--------+-------------+------+---------+-----------------------------+----+1 | ID | INTEGER(10) | NO | ?[1;30m[NULL] ?[m | _SYS_TREE_CS_#157698_#0_#P0 ||2 | COL2 | VARCHAR(32) | YES | ?[1;30m[NULL] ?[m | ||---+--------+-------------+------+---------+-----------------------------+----+1.940 secgomobile@sap:mo-2544e1cd3.mo.sap.corp> create table ABC(id int primary key, col2 varchar(32), col3 clob, col4 datetime);affected 0 rows (21 msec)gomobile@sap:mo-2544e1cd3.mo.sap.corp> insert into ABC values(1, 'abc', 'abcdef', '2019-09-13 07:02:05');affected 1 rows (126 msec)gomobile@sap:mo-2544e1cd3.mo.sap.corp> insert into ABC values(5, 'abc5', 'abcdef', '2019-09-13 07:02:06');affected 1 rows (15 msec)gomobile@sap:mo-2544e1cd3.mo.sap.corp> insert into ABC values(3, 'abc3', 'ab3cdef', '2019-09-13 08:02:06');affected 1 rows (17 msec)gomobile@sap:mo-2544e1cd3.mo.sap.corp> select count(*) from ABC;----------+←[1m COUNT(*)←[m |----------+3 |----------+1 row in result (first row: 17 msec; total: 25 msec)//导出表ABC试一下:gomobile@sap:mo-2544e1cd3.mo.sap.corp> dump-out ABC.dump.gz ABC;dump ABC:.................................................................(3 rows)dumping 'ABC' took 400 msec total; 133.333 msec / row//清空表ABC, 再导入:gomobile@sap:mo-2544e1cd3.mo.sap.corp> truncate table ABC;affected 0 rows (351 msec)gomobile@sap:mo-2544e1cd3.mo.sap.corp> select count(*) from ABC;----------+←[1m COUNT(*)←[m |----------+0 |----------+1 row in result (first row: 65 msec; total: 67 msec)gomobile@sap:mo-2544e1cd3.mo.sap.corp> dump-in ABC.dump.gzimporting table dump created with HenPlus 0.9.8for table : ABCfrom database : HDB - 2.00.37.00.1552531011at : 2019-09-13 01:04:07.807dump format version : 1.................................................................ok.(3 rows total / 0 with errors; 167 msec total; 55.666 msec / row)gomobile@sap:mo-2544e1cd3.mo.sap.corp> SELECT * FROM ABC;----+------+---------+-------------------------------+←[1m ID←[m |←[1m COL2←[m |←[1m COL3 ←[m |←[1m COL4 ←[m |----+------+---------+-------------------------------+1 | abc | abcdef | 2019-09-13 07:02:05.000000000 |5 | abc5 | abcdef | 2019-09-13 07:02:06.000000000 |3 | abc3 | ab3cdef | 2019-09-13 08:02:06.000000000 |----+------+---------+-------------------------------+3 rows in result (first row: 16 msec; total: 34 msec)gomobile@sap:mo-2544e1cd3.mo.sap.corp>我们发现数据最后完美导入。
简单用法应该是足够了。
原文作者:数据库杂记;如有侵权,请联系管理员删除。