在 Web 2.0 時代,REST 風格服務已成主流,但傳統資料庫操作仍需大量樣板代碼 (Entity、DAO、Controller)。sqlRest 開源框架打破這一慣例:透過一個 Servlet + 簡單配置,自動將資料表映射為 REST 資源,CRUD 操作直接對應 HTTP 動詞 (GET/POST/PUT/DELETE)。本文完整記錄從部署、配置、測試到 DB2 整合的全流程實踐。
sqlrest-0.3.2 (SourceForge 唯一可用版本)webapps/sqlrest 複製至 Tomcat webapps/https://localhost:8080/sqlrest 見到資源列表即成功
坑點預警:若 Tomcat 啟動報 UnsupportedClassVersionError (JDK 版本不符),需從 CVS 檢出源碼重新編譯部署。
:pserver:anonymous@sqlrest.cvs.sourceforge.net:/cvsroot/sqlrest
WEB-INF/classes
<database>
<jdbc-driver-class>org.hsqldb.jdbcDriver</jdbc-driver-class> <!-- 預設 HSQLDB -->
<database-url>jdbc:hsqldb:file:data/exampledb</database-url>
<user>sa</user>
<password></password>
</database>
內建範例資料庫 data/exampledb.script 包含 4 張表:CUSTOMER、PRODUCT、INVOICE、ITEM (複合主鍵)。
| HTTP 方法 | URL 範例 | 語意 | SQL 對應 |
|---|---|---|---|
| GET | /sqlrest | 列出所有資源 | SHOW TABLES |
| GET | /sqlrest/INVOICE/ | 列出所有發票 | SELECT * FROM INVOICE |
| GET | /sqlrest/INVOICE/31/ | 取得單筆發票 | SELECT * FROM INVOICE WHERE ID=31 |
| POST | /sqlrest/CUSTOMER/ | 新增客戶 | INSERT INTO CUSTOMER ... |
| PUT | /sqlrest/CUSTOMER/22/ | 更新客戶 | UPDATE CUSTOMER SET ... WHERE ID=22 |
| DELETE | /sqlrest/CUSTOMER/22/ | 刪除客戶 | DELETE FROM CUSTOMER WHERE ID=22 |
複合主鍵限制:ITEM 表主鍵為 (INVOICEID, ITEMID),但當前版本僅解析第一個參數,/sqlrest/ITEM/1/ 返回該發票所有明細,無法精確到單筆明細。

URL url = new URL("https://localhost:8080/sqlrest/INVOICE/");
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("GET"); // 或 POST/PUT/DELETE
// 處理回應流...
rest.client.RestClient 封裝佳,可輕鬆擴充回傳 String
MainServletTest 覆蓋全介面,可整合 Ant 持續集成db2sampl 建立)db2jcc.jar, db2jcc_license_cu.jar 放入 WEB-INF/lib/<database>
<jdbc-driver-class>com.ibm.db2.jcc.DB2Driver</jdbc-driver-class>
<database-url>jdbc:db2:sample</database-url>
<user>your_user</user>
<password>your_pwd</password>
</database>
sqlRest 強制要求資料表有單一欄位主鍵。SAMPLE 資料庫多表無主鍵,需調整:
EMPLOYEE 表ALTER TABLE EMPLOYEE ADD PRIMARY KEY (EMPNO)
瀏覽 https://localhost:8080/sqlrest 應顯示 EMPLOYEE 資源,後續可測試 CRUD 全介面。
| 限制 | 影響 | 建議擴展方向 |
|---|---|---|
| 單一資料庫 | URL 無命名空間區分多庫 | 修改 DatabaseAnalyser 支援多 DataSource,URL 加入 /dbname/ 前綴 |
| 複合主鍵支援不全 | 無法精確定位單筆記錄 | 增強 URL 解析器支援多參數 /table/pk1/pk2/ |
| 非主鍵表直接報錯 | 啟動失敗,無法共存既有結構 | 修改 DatabaseAnalyser.getDatabaseInfo() 跳過不合規表而非拋異常 |
| 無認證授權 | 生產環境不可用 | 整合 Spring Security 或 Servlet Filter 實現 Token/OAuth |
sqlRest 體現 「資料即資源」 核心思想:
預見未來資料庫將內建 REST 端點 (如同當年內建 SOAP),sqlRest 為此趨勢提供了輕量級參考實作。
本文基於 Eclipse 3.2 + JDK 1.5 + Tomcat 5.5 環境驗證。源碼與配套專案可從文末下載。