HSQLDB是一个轻量级的纯Java开发的开放源代码的关系数据库系统,其体积小,占用空间小,使用简单,支持内存运行方式等特点
Hsqldb有四种运行模式
1、内存(Memory-Only)模式,这种很少用,还不如直接List<Map<?,?>>呢
DriverManager.getConnection("jdbc:hsqldb:mem:dbname","username","password");
2、进行(In-Process)模式,通俗的来说就是类似sqlite的文件形式的数据库,可以试一下在Android上应该也没多大的问题
DriverManager.getConnection("jdbc:hsqldb:file:/E:/hsqldb/data/dbname","username","password"); DriverManager.getConnection("file:/opt/db/dbname","username","password"); DriverManager.getConnection("jdbc:hsqldb:file:dbname","username","password");
3、服务器模式,当然这种在Android上也没啥问题,等有时间,哥来测试一下
DriverManager.getConnection("jdbc:hsqldb:hsql://localhost:port/dbname","username","password");
4、Web服务器模式
DriverManager.getConnection("jdbc:hsqldb:hsql://localhost:port/dbname","username","password");
下载地址:http://sourceforge.net/projects/hsqldb/files/
目前最新版本是 hsqldb-2.3.2.zip
解压后产生很多文件,其中最重要的文件不是bin或者build下的bat或者其他处理程序,而是 lib目录下的2个jar包,其中 hsqldb.jar是hsqldb的核心文件
注:当然,还有一个文件比较重要,那就是src目录下的源码
在bin目录下有如下批处理文件,点击runServer则指向data目录的test数据库,runManagerSwing则打开图形化界面,因此,这些批处理文件可以随便点着
玩玩儿,有兴趣的话可以使用文本编辑器打开查看里面的脚本,很简单的
一.构建我们自己的服务模式数据库
这里主要有2条比较常用的命令,作用类似,目的是实现创建数据库(注意:如果数据库存在,则不从新创建)并启动数据库服务器,
首先得进入lib目录
java -classpath hsqldb.jar org.hsqldb.server.Server -database.0 ../db/mydb -dbname.0 xdb
第二条,可以指定端口
java -classpath ./hsqldb.jar org.hsqldb.server.Server -port 9001 -database.0 ../db/mydb -dbname.0 mydb
为了随时能够启动服务器,我们可以通过bat文件实现,在db目录中构建我们的runServer.bat文件
cd .\ @java -classpath ../lib/hsqldb.jar org.hsqldb.server.Server -database.0 ./mydb -dbname.0 mydb
注意,对于web数据库服务器来说,命令可能稍有不同
java -classpath ../lib/hsqldb.jar org.hsqldb.WebServer –database.0 testdb –dbname.0 testdbname
运行如上命令,会在相应的目录下产生对应的文件,如
二.在Eclipse中进行开发,我们只需要把hsqldb.jar导入项目即可
举个栗子,本程序改造了一下别人的例子,修补了原有程序的很多bug
package com.ts.hsqldb.utils; import java.io.IOException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; import java.util.logging.Level; import java.util.logging.Logger; import org.hsqldb.server.Server; public class HSQLUtil { public static final int PORT = 9001; public static final String DB_NAME = "mydb"; // 数据库文件名,同时也是本类中的数据库名 public static final String DB_PATH = "./db/"; public static final String USER_NAME = "SA"; public static final String PASSWORD = ""; public static final int SERVER_MODE = 0; public static final int STAND_ALONE_MODE = 1; // In-Process public static int mode = SERVER_MODE; // 记录当前用什么模式,开发时用Server,发布时用standalone /** * 启动数据库服务 */ public static boolean startHSQL() { if (mode == SERVER_MODE) { if (!HSQLUtil.isConnected()) { Server server = new Server();// 它可是hsqldb.jar里面的类啊。 server.setDatabaseName(0, DB_NAME); server.setDatabasePath(0, DB_PATH + DB_NAME); server.setPort(PORT); server.setSilent(true); server.setNoSystemExit(true); server.start(); // 实质和命令类似,也是创建数据库并启动服务,如果数据库存在,则直接启动即可 System.out.println("hsqldb started..."); try { Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } } } else if (mode == STAND_ALONE_MODE) { // standalone模式,打开连接就同时启动数据库,所以这里可以什么都不做 } return true; } /** * 关闭数据库服务 */ public static boolean stopHSQL() { try { Statement statement = getConnection().createStatement(); getConnection().close(); return true; } catch (SQLException ex) { Logger.getLogger(HSQLUtil.class.getName()).log(Level.SEVERE, null, ex); return false; } } /** * 获取连接 */ public static Connection getConnection() { Connection conn = null; try { Class.forName("org.hsqldb.jdbcDriver"); if (mode == SERVER_MODE) { conn = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost:" + PORT + "/" + DB_NAME,USER_NAME, PASSWORD); } else if (mode == STAND_ALONE_MODE) { conn = DriverManager.getConnection("jdbc:hsqldb:file:" + DB_PATH + DB_NAME, USER_NAME, PASSWORD); } } catch (ClassNotFoundException ex) { Logger.getLogger(HSQLUtil.class.getName()).log(Level.SEVERE, null, ex); } catch (SQLException ex) { Logger.getLogger(HSQLUtil.class.getName()).log(Level.SEVERE, null, ex); } return conn; } /** * 判断服务器是否已开启 * * @return */ public static boolean isConnected() { Connection hsqlConn = HSQLUtil.getConnection(); boolean isOpened = false; if (hsqlConn == null) { return false; } try { isOpened = !hsqlConn.isClosed(); } catch (SQLException e) { e.printStackTrace(); } finally { try { hsqlConn.close(); } catch (SQLException e) { } } return isOpened; } }
再来个测试用例
package com.ts.hsqldb.test; import java.sql.SQLException; import java.sql.Statement; import java.util.UUID; import java.util.logging.Level; import java.util.logging.Logger; import com.ts.hsqldb.utils.HSQLUtil; public class HsqlDBTestCase { public static void main(String[] args) { HSQLUtil.mode = HSQLUtil.SERVER_MODE; HSQLUtil.startHSQL(); try { System.out.println("start to connect hsqldb and excute statements\n"); Statement statement = HSQLUtil.getConnection().createStatement(); statement.executeUpdate("create table if not exists customer(id integer primary key,name varchar(32) not null, password varchar(64) not null,UNIQUE(name))"); for (int i = 10; i < 20; i++) { String password = UUID.randomUUID().toString(); String name = password.split("\\-")[0]; String sql = "insert into customer values(" + i + ",'" + name+ "','" + password + "')"; int count = statement.executeUpdate(sql); System.err.println("excute [ " + sql + " ] "+ (count > 0 ? "Ok" : "Bad")); } statement.close(); } catch (SQLException ex) { Logger.getLogger(HsqlDBTestCase.class.getName()).log(Level.SEVERE, null, ex); } HSQLUtil.stopHSQL(); System.out.println("\ndisconnect to hsqldb"); } }
三.运行效果还不错,现在来启动图形化界面试试
基本上可以双击 hsqldb.jar就能启动,如果点击不行的话,请使用如下命令
java -classpath hsqldb.jar org.hsqldb.util.DatabaseManager
登录界面如下,选择相应的模式即可进入
登录成功显示如下,关于hsqldb图形化的界面相信大家一看就会使用(貌似也可以连接mysql,orcale,postgresql等数据库),这里我主要说2个部分,快速生成查询语句和性能测试
1.右键快速生成查询语句,注意,这里的语句并不严格,所以容错能力非常好,下文即将说道
2.性能测试
会生成响应的 性能测试脚本
-->>>TEST<<<-- ; --#1000; DROP TABLE Test IF EXISTS; CREATE TABLE Test( Id INTEGER PRIMARY KEY, FirstName VARCHAR(20), Name VARCHAR(50), ZIP INTEGER) ; INSERT INTO Test VALUES(#,'Julia','Peterson-Clancy',#) ; UPDATE Test SET Name='Hans' WHERE Id=# ; SELECT * FROM Test WHERE Id=# ; DELETE FROM Test WHERE Id=# ; DROP TABLE Test IF EXISTS;
-->>>TEST<<<-- ;表示此脚本是测试脚本
--#1000;表示该段脚本运行1000次,测试每局运行的速度
执行截图如下
四.sql语句的编写,基本和mysql没啥区别,等有区别,直接上网即可,如下是我的实践脚本
DROP TABLE IF EXISTS BOOK; CREATE TABLE IF NOT EXISTS book ( id integer identity PRIMARY KEY, name varchar(40) not null, description varchar(256), url varchar(80), UNIQUE (name) ); INSERT INTO book (id, name, description, url) VALUES (3 , 'hsqldb for j2ee', 'hsqldb web', 'http://www.sohsql.org') INSERT INTO book(id,name,description,url) values (2,'hsqlDB Developer','how to use hsqldb','http://www.hsqldb.com') SELECT * FROM book where id=2 UPDATE BOOK SET description='hsqldb for web' where id=3
今后如果有时间的话,打算在Android上试一试
--------------《Try》《doing》《it》《!》-------------