HSQLDB是一个非常好的内存数据库,对于处理少量数据的小型数据应用非常适合。
其中,text table更是扩展了数据存储的方式,它可以将一个csv文件挂接进来,进而,对这个表的全部操作都将在这个csv文件中体现出来。但是,他不支持excel作为数据源。
我增加了这个功能。思路如下:
如果我们想要挂接一个csv,那么需要写:
SET TABLE table_1 SOURCE "data.csv;encoding=GB2312;"
表示把data.csv挂在table_1上了,这样,select, insert, update都会时时体现在这个csv上,顺着这个思路,我的目标是通过:
SET TABLE table_1 SOURCE "data.xls;encoding=GB2312"
定义一个xls文件,如果系统也能够处理,多好!
设想是:如果能在系统真正处理之前,检测一下,如果判断是xls,那么就是用POI将其转化为csv文件,然后使用这个csv文件拼接上去。
最终找到,在org.hsqldb.persist.TextCache里面处理这些事情,于是在:
protected void initParams(Database database,String baseFileName) throws HsqlException {
里面增加了一段代码,
if(fileName.endsWith(ExcelToCsv.EXT_XLS)) { try { ExcelToCsv etc = new ExcelToCsv(fileName,tableprops.getProperty(ExcelToCsv.ROW_COUNT),tableprops.getProperty(ExcelToCsv.COL_COUNT)); fileName = etc.parse(); } catch (IOException e) { // TODO error handling e.printStackTrace(); } }
其中,ExcelToCsv是我新增的一个类,用于读取Excel将其写成csv。
在实际使用中,需要提供Excel文件中有多少列,和多少行(对于多少行,如果事先无法确定,可以给一个足够大的数),也就是说,在实际使用中,用:
SET TABLE table_1 SOURCE "data.xls;encoding=GB2312;rowcount=200;colcount=11"
其中,定义了,table_1这个表从Excel里面取11列,最多取200行(实际Excel文件里面只有157行)。
附件是基于HSQLDB1.8.0.10版本增加这个功能的jar以及相关原代码。
缺陷如下:
1、基于上面的机制,只在set的时候处理一次,那么,以后对于table_1的任何操作都不会反映在excel文件里面,而只会在csv里面,不过我的客户都是只有select,而不会update, delete,所以这个功能对我用处不大;
2、一些exception的处理没有写完善;
哪位老大有时间,完善一把呗