使用hsqldb將常用數(shù)據(jù)庫整合到應(yīng)用程序中
提到過一些常用數(shù)據(jù)庫,可以視作固定編碼的數(shù)據(jù)庫。對于這些書庫,通常只進(jìn)行查詢使用。
因此針對一些比如用戶希望只傳入ip地址就要查詢到用戶信息,或者只傳入行政區(qū)劃編號,
就可以得到行政區(qū)劃名字等等需求。而且用戶不希望去配置數(shù)據(jù)庫信息等等,
Access文件雖然比較方便,卻不具有跨平臺的效果,因此可以借助開源免費的hsql來進(jìn)行在應(yīng)用小型數(shù)據(jù)庫的嵌入。
尤其是在1.7.2版本加入了新的特性,可以支持在jar里直接以只讀方式訪問數(shù)據(jù)庫。
因此,把封裝好的class和數(shù)據(jù)文件一并打包,可以非常方便的給別人使用。
以下是操作過程,
首先下載hsql,最新的穩(wěn)定版本是1.7.3.3:
下載ip數(shù)據(jù)庫:
然后利用自帶工具將其數(shù)據(jù)解壓導(dǎo)出為文本文件
,用Editplus打開,替換掉 CZ88.NET,以減少文件占用空間,(使用正則表達(dá)式進(jìn)行替換,將數(shù)據(jù)規(guī)整。
用xmlspy進(jìn)行轉(zhuǎn)換成xml再導(dǎo)入access,(這一步完全可以省略掉)),然后直接用access導(dǎo)入這195074條記錄。
然后是從Access里導(dǎo)入數(shù)據(jù)
比如我的常用數(shù)據(jù)有ip地址信息表,行政區(qū)劃和省份信表:
//創(chuàng)建表
connto.createStatement().execute("CREATE TABLE PROVINCE(PDOMAIN VARCHAR(3),PLABEL VARCHAR(50),PNAME VARCHAR(6),PNO VARCHAR(3),PSHORTNAME VARCHAR(2))");
connto.createStatement().execute(
"CREATE TABLE XZQH(NAME VARCHAR(30),CODE VARCHAR(6),O_CODE VARCHAR(8))");
connto.createStatement().execute(
"CREATE TABLE IPINFO(IPS BIGINT,IPE BIGINT,AREA VARCHAR(60))");
ResultSet rs = stmtin.executeQuery("SELECT * FROM province");
PreparedStatement pstmt = connto.prepareStatement(
"insert into province (pdomain,plabel,pname,pno,pshortname) values(?,?,?,?,?)");
導(dǎo)入完成之后,將數(shù)據(jù)文件添加到j(luò)ar文件中,再封裝好常用方法。
就可以了,以后的數(shù)據(jù)維護(hù)也非常簡單,只要不修改表結(jié)果,只需要把數(shù)據(jù)文件更新即可,不需要修改任何代碼。
調(diào)用方法示例 :
先引入這個jar文件,然后使用下面的方法調(diào)用,
String area=com.lizongbo.database.SearchUtil.findAreabyIp("192.168.9.1");
使用者不需要關(guān)心任何其它的東西,一行代碼就得到想要的結(jié)果了。
不過需要注意的是,使用了ip數(shù)據(jù)庫之后,因為ip數(shù)據(jù)庫記錄量很大,生成的scrpit文件比較大,我的文件有22M,
打包壓縮后的jar,也有 3M大小,初始化數(shù)據(jù)庫的時候會非常緩慢。
綜合考慮, 犧牲空間和一部分內(nèi)存來換取應(yīng)用程序的可復(fù)用和跨平臺以及數(shù)據(jù)記錄可維護(hù)性,還是比較值得的。
抓圖: