溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java 中如何使用 SQL 查詢文本

發(fā)布時(shí)間:2020-06-12 13:59:18 來(lái)源:網(wǎng)絡(luò) 閱讀:417 作者:raqsoft 欄目:大數(shù)據(jù)

使用 SQL 查詢語(yǔ)言,你只能查詢位于數(shù)據(jù)庫(kù)里面的數(shù)據(jù),但是當(dāng)你面對(duì)的數(shù)據(jù)是一些 Excel 表格或者 Txt 文本格式時(shí),有什么辦法能直接對(duì)著文件進(jìn)行 Select 查詢呢?

? 引言

        作為一名數(shù)據(jù)庫(kù)開(kāi)發(fā)程序員,使用 SQL 語(yǔ)言查詢數(shù)據(jù)是再普通不過(guò)的一件事。而 SQL 語(yǔ)言是基于數(shù)據(jù)庫(kù)的查詢語(yǔ)言,這就要求被查詢的數(shù)據(jù)只能位于數(shù)據(jù)庫(kù)中。但在實(shí)際工作中,時(shí)常會(huì)碰到一些不是來(lái)源于數(shù)據(jù)庫(kù)的數(shù)據(jù),特別是很多來(lái)自一些 Excel 表格或者 TXT 文本文件。如果要對(duì)它們進(jìn)行 SQL 查詢,通常做法是在數(shù)據(jù)庫(kù)中創(chuàng)建臨時(shí)表,然后導(dǎo)入數(shù)據(jù)后再使用 SQL 對(duì)其查詢。這種做法本身未嘗不可,但是有幾點(diǎn)不妥:

        首先,比較麻煩,數(shù)據(jù)的來(lái)源五花八門(mén),格式不同,表結(jié)構(gòu)也各不相同。導(dǎo)入操作往往只能由數(shù)據(jù)庫(kù)管理員手動(dòng)維護(hù),其面臨的復(fù)雜度可想而知。

        其次,數(shù)據(jù)庫(kù)常常會(huì)涉及敏感數(shù)據(jù)或安全考慮,就算你不怕麻煩,愿意去維護(hù),也未必有權(quán)限進(jìn)行這類操作。

        最后,這些數(shù)據(jù)往往可能是臨時(shí)的、突發(fā)的,根本不適合往數(shù)據(jù)庫(kù)里添加,否則會(huì)搞得數(shù)據(jù)庫(kù)越來(lái)越臃腫,最終導(dǎo)致整體訪問(wèn)性能低下。

        有了這些不妥,程序員一般也就不得不放棄 SQL 式查詢了,只能通過(guò)程序?qū)崿F(xiàn)一些簡(jiǎn)單的關(guān)鍵字搜索等功能,畢竟自己去實(shí)現(xiàn) SQL 語(yǔ)法的查詢不僅難度大而且完全沒(méi)必要。

        但是 SQL 查詢有時(shí)候真的很好用啊……那么,有沒(méi)有一種第三方軟件能實(shí)現(xiàn) SQL 式查詢文本,讓程序員在享受便利的同時(shí),不需要考慮上面這些煩心的問(wèn)題呢?

        答案自然是有,那就是本文要介紹的——集算器。

? 開(kāi)始

        下面就來(lái)介紹一下,如何在 Java 中利用集算器實(shí)現(xiàn) SQL 式查詢文本文件。當(dāng)然,此處的文本文件不是指完全自由的文本文件,而是有格式規(guī)定的,類似于數(shù)據(jù)表的文件。

        從官網(wǎng)下載并安裝好集算器,將 dm.jar 及其依賴的配置文件 raqsoftConfig.xml 加入到當(dāng)前程序的類路徑。然后使用集算器提供的 JDBC 類,便可將文本文件當(dāng)成數(shù)據(jù)庫(kù)中的數(shù)據(jù)表來(lái)進(jìn)行 SQL 式查詢了。

        示例用到兩個(gè)文件,第一個(gè) student.txt 數(shù)據(jù)內(nèi)容如下:

Java 中如何使用 SQL 查詢文本

        數(shù)據(jù)格式為:第一行為字段名,后續(xù)行是數(shù)據(jù),各列之間用 Tab 鍵分開(kāi)。這個(gè)表是各個(gè)班級(jí)的學(xué)生基本情況。

        第二個(gè) score.txt 數(shù)據(jù)內(nèi)容如下:

Java 中如何使用 SQL 查詢文本

        這個(gè)文件通過(guò)‘班級(jí)’,‘學(xué)生 ID’兩個(gè)關(guān)鍵字段,記錄每個(gè)學(xué)生的各科成績(jī)。

? JDBC 示例

        對(duì)于熟悉 JDBC 的同學(xué)來(lái)說(shuō),Java 調(diào)用集算器使用 SQL 查詢文本的過(guò)程很簡(jiǎn)單,下面貼出示例代碼:

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;// 執(zhí)行語(yǔ)句

ResultSet rst = null;// 結(jié)果集

try {

/********* 通過(guò) JDBC 連接到 集算器 *********/

Class.forName(“com.esproc.jdbc.InternalDriver”);

con = DriverManager.getConnection(“jdbc:esproc:local://”);

/******************* 執(zhí)行語(yǔ)句方法 ********************/

stmt = con.createStatement();

rst = stmt.executeQuery(“SELECT * FROM score.txt”);

/******************* 執(zhí)行語(yǔ)句方法結(jié)束 ****************/

ResultSetMetaData meta = rst.getMetaData();

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

System.out.print(meta.getColumnName(i + 1) + “\t”);

}

System.out.println();

// 輸出結(jié)果

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(“沒(méi)找到驅(qū)動(dòng)程序”);

cnf.printStackTrace();

} catch (SQLException se) {

se.printStackTrace();

}

}

}

        示例中可以看到加粗的 SQL 語(yǔ)句跟普通 SQL 語(yǔ)法基本一致,僅僅是表名不一樣,這里直接寫(xiě) TXT 文件名。執(zhí)行后結(jié)果如下:

Java 中如何使用 SQL 查詢文本

        可以看到,使用集算器的 JDBC,完全可以將具有表結(jié)構(gòu)的文本文件直接當(dāng)成數(shù)據(jù)表來(lái)查詢。而集算器除了支持 TXT 格式之外,還支持 CSV、XLS、XLSX 甚至 JSON。另外,集算器自身也有兩種數(shù)據(jù)存儲(chǔ)格式:BTX 和 CTX,也是可以直接查詢的。

        好,進(jìn)一步的問(wèn)題來(lái)了,集算器對(duì) SQL 的各種命令能夠支持到何種程度呢?

        首先需要說(shuō)明的是,集算器不是一個(gè)數(shù)據(jù)庫(kù)產(chǎn)品,所以對(duì) SQL 中一些數(shù)據(jù)庫(kù)維護(hù)命令是不支持的,比如 Create、Delete 等。

        那么對(duì)于 Select 可以支持到什么程度呢?

? 分組統(tǒng)計(jì)

        下面來(lái)看看 SQL 查詢中最普遍的查詢,將 student.txt 跟 score.txt 關(guān)聯(lián)起來(lái),并分組統(tǒng)計(jì)出每名學(xué)生的總成績(jī)。將上面示例代碼中加粗的 SQL 語(yǔ)句替換為如下語(yǔ)句:

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

        執(zhí)行后,得到每班學(xué)生的總分表:

Java 中如何使用 SQL 查詢文本

        可以看到,集算器用 SQL 查詢文本時(shí),對(duì)于常規(guī)的分組、表的聯(lián)合都沒(méi)問(wèn)題。那么帶參數(shù)的查詢,又該如何寫(xiě)呢?

? 使用參數(shù)

        只需將執(zhí)行語(yǔ)句方法塊里的代碼替換為以下代碼:

/******************* 執(zhí)行語(yǔ)句方法 ********************/

CallableStatement cs = null; // 定義 CallableStatement 對(duì)象 String

String sql = “SELECT 姓名, 性別 FROM student.txt WHERE 班級(jí) =?”;

cs = con.prepareCall(sql);

cs.setString(1, “一班”);

rst = cs.executeQuery();

/******************* 執(zhí)行語(yǔ)句方法結(jié)束 ****************/

        換完后,注意要引入 CallableStatement 類。執(zhí)行后結(jié)果如下:

Java 中如何使用 SQL 查詢文本

        帶參數(shù)的句子仍然沒(méi)問(wèn)題,調(diào)用方法也跟數(shù)據(jù)庫(kù)標(biāo)準(zhǔn)是一致的。不過(guò)上述結(jié)果中,性別顯示為數(shù)字,集算器 SQL 能不能支持轉(zhuǎn)換語(yǔ)法呢?

? CASE 語(yǔ)句

        將上面的 SQL 語(yǔ)句替換成帶 CASE 的 SQL 語(yǔ)句:

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

        結(jié)果如下:

Java 中如何使用 SQL 查詢文本

        通過(guò)上面這幾個(gè)例子可以看到,集算器對(duì)常用查詢的支持還是比較全面的。鑒于篇幅原因,這里就不繼續(xù)一一列舉了。更多集算器查詢文件時(shí)的詳細(xì)語(yǔ)法以及函數(shù),請(qǐng)參考文檔:http://doc.raqsoft.com.cn/esproc/func/dbquerysql.html#db_sql_


向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI