Java 中如何使用 SQL 查詢文本

【摘要】
        使用 SQL 查詢語言,你只能查詢位於數據庫裏面的數據,可是當你面對的數據是一些 Excel 表格或者 Txt 文本格式時,有什麼辦法能直接對着文件進行 Select 查詢呢?去乾學院看個究竟:Java 中如何使用 SQL 查詢文本!
Ø 引言html

        做爲一名數據庫開發程序員,使用 SQL 語言查詢數據是再普通不過的一件事。而 SQL 語言是基於數據庫的查詢語言,這就要求被查詢的數據只能位於數據庫中。但在實際工做中,時常會碰到一些不是來源於數據庫的數據,特別是不少來自一些 Excel 表格或者 TXT 文本文件。若是要對它們進行 SQL 查詢,一般作法是在數據庫中建立臨時表,而後導入數據後再使用 SQL 對其查詢。這種作法自己何嘗不可,可是有幾點不妥:java

        首先,比較麻煩,數據的來源五花八門,格式不一樣,表結構也各不相同。導入操做每每只能由數據庫管理員手動維護,其面臨的複雜度可想而知。程序員

        其次,數據庫經常會涉及敏感數據或安全考慮,就算你不怕麻煩,願意去維護,也未必有權限進行這類操做。sql

        最後,這些數據每每多是臨時的、突發的,根本不適合往數據庫裏添加,不然會搞得數據庫愈來愈臃腫,最終致使總體訪問性能低下。數據庫

        有了這些不妥,程序員通常也就不得不放棄 SQL 式查詢了,只能經過程序實現一些簡單的關鍵字搜索等功能,畢竟本身去實現 SQL 語法的查詢不只難度大並且徹底不必。安全

        可是 SQL 查詢有時候真的很好用啊……那麼,有沒有一種第三方軟件能實現 SQL 式查詢文本,讓程序員在享受便利的同時,不須要考慮上面這些煩心的問題呢?函數

        答案天然是有,那就是本文要介紹的——集算器性能

Ø 開始spa

        下面就來介紹一下,如何在 Java 中利用集算器實現 SQL 式查詢文本文件。固然,此處的文本文件不是指徹底自由的文本文件,而是有格式規定的,相似於數據表的文件。3d

        從官網下載並安裝好集算器,將 dm.jar 及其依賴的配置文件 raqsoftConfig.xml 加入到當前程序的類路徑。而後使用集算器提供的 JDBC 類,即可將文本文件當成數據庫中的數據表來進行 SQL 式查詢了。

        示例用到兩個文件,第一個 student.txt 數據內容以下:

        數據格式爲:第一行爲字段名,後續行是數據,各列之間用 Tab 鍵分開。這個表是各個班級的學生基本狀況。

        第二個 score.txt 數據內容以下:

        這個文件經過‘班級’,‘學生 ID’兩個關鍵字段,記錄每一個學生的各科成績。

Ø JDBC 示例

        對於熟悉 JDBC 的同窗來講,Java 調用集算器使用 SQL 查詢文本的過程很簡單,下面貼出示例代碼:

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.ResultSet;

import java.sql.ResultSetMetaData;

import java.sql.SQLException;

import java.sql.Statement;

public class SQLDemo {

public static void main(String[] args) {

Connection con = null;// 鏈接

Statement stmt = null;// 執行語句

ResultSet rst = null;// 結果集

try {

/********* 經過 JDBC 鏈接到 集算器 */

Class.forName(「com.esproc.jdbc.InternalDriver」);

con = DriverManager.getConnection(「jdbc:esproc:local://」);

/******************* 執行語句方法 /

stmt = con.createStatement();

rst = stmt.executeQuery(「SELECT * FROM score.txt」);

/******************* 執行語句方法結束 **/

ResultSetMetaData meta = rst.getMetaData();

for (int i = 0; i < meta.getColumnCount(); i++) {

System.out.print(meta.getColumnName(i + 1) + 「\t」);

}

System.out.println();

// 輸出結果

while (rst.next()) {

for (int i = 0; i < meta.getColumnCount(); i++) {

System.out.print(rst.getObject(i + 1) + 「\t」);

}

System.out.println();

}

stmt.close();

con.close();

} catch (ClassNotFoundException cnf) {

System.out.println(「沒找到驅動程序」);

cnf.printStackTrace();

} catch (SQLException se) {

se.printStackTrace();

}

}

}

        示例中能夠看到加粗的 SQL 語句跟普通 SQL 語法基本一致,僅僅是表名不同,這裏直接寫 TXT 文件名。執行後結果以下:

        能夠看到,使用集算器的 JDBC,徹底能夠將具備表結構的文本文件直接當成數據表來查詢。而集算器除了支持 TXT 格式以外,還支持 CSV、XLS、XLSX 甚至 JSON。另外,集算器自身也有兩種數據存儲格式:BTX 和 CTX,也是能夠直接查詢的。

        好,進一步的問題來了,集算器對 SQL 的各類命令可以支持到何種程度呢?

        首先須要說明的是,集算器不是一個數據庫產品,因此對 SQL 中一些數據庫維護命令是不支持的,好比 Create、Delete 等。

        那麼對於 Select 能夠支持到什麼程度呢?

Ø 分組統計

        下面來看看 SQL 查詢中最廣泛的查詢,將 student.txt 跟 score.txt 關聯起來,並分組統計出每名學生的總成績。將上面示例代碼中加粗的 SQL 語句替換爲以下語句:

SELECT A. 班級,A. 姓名,sum(B. 成績) 總分 FROM student.txt A JOIN score.txt B ON A. 班級 =B. 班級 AND A. 學生 ID=B. 學生 ID GROUP BY A. 班級,A. 姓名

        執行後,獲得每班學生的總分表:

        能夠看到,集算器用 SQL 查詢文本時,對於常規的分組、表的聯合都沒問題。那麼帶參數的查詢,又該如何寫呢?

Ø 使用參數

        只需將執行語句方法塊裏的代碼替換爲如下代碼:

/******************* 執行語句方法 /

CallableStatement cs = null; // 定義 CallableStatement 對象 String

String sql = 「SELECT 姓名, 性別 FROM student.txt WHERE 班級 =?」;

cs = con.prepareCall(sql);

cs.setString(1, 「一班」);

rst = cs.executeQuery();

/******************* 執行語句方法結束 **/

        換完後,注意要引入 CallableStatement 類。執行後結果以下:

        帶參數的句子仍然沒問題,調用方法也跟數據庫標準是一致的。不過上述結果中,性別顯示爲數字,集算器 SQL 能不能支持轉換語法呢?

Ø CASE 語句

        將上面的 SQL 語句替換成帶 CASE 的 SQL 語句:

SELECT 姓名,CASE 性別 WHEN 0 THEN ‘男’ ELSE ‘女’ END 性別 FROM student.txt WHERE 班級 =?

        結果以下:

        經過上面這幾個例子能夠看到,集算器對經常使用查詢的支持仍是比較全面的。鑑於篇幅緣由,這裏就不繼續一一列舉了。更多集算器查詢文件時的詳細語法以及函數,請參考文檔:http://doc.raqsoft.com.cn/esproc/func/dbquerysql.html#db_sql_

相關文章
相關標籤/搜索