50

Java 中如何使用 SQL 查询文本

 5 years ago
source link: https://ask.hellobi.com/blog/raqsoft/19200?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

【摘要】

使用 SQL 查询语言,你只能查询位于数据库里面的数据,但是当你面对的数据是一些 Excel 表格或者 Txt 文本格式时,有什么办法能直接对着文件进行 Select 查询呢?去乾学院看个究竟: Java 中如何使用 SQL 查询文本 !

Ø 引言

作为一名数据库开发程序员,使用 SQL 语言查询数据是再普通不过的一件事。而 SQL 语言是基于数据库的查询语言,这就要求被查询的数据只能位于数据库中。但在实际工作中,时常会碰到一些不是来源于数据库的数据,特别是很多来自一些 Excel 表格或者 TXT 文本文件。如果要对它们进行 SQL 查询,通常做法是在数据库中创建临时表,然后导入数据后再使用 SQL 对其查询。这种做法本身未尝不可,但是有几点不妥:

首先,比较麻烦,数据的来源五花八门,格式不同,表结构也各不相同。导入操作往往只能由数据库管理员手动维护,其面临的复杂度可想而知。

其次,数据库常常会涉及敏感数据或安全考虑,就算你不怕麻烦,愿意去维护,也未必有权限进行这类操作。

最后,这些数据往往可能是临时的、突发的,根本不适合往数据库里添加,否则会搞得数据库越来越臃肿,最终导致整体访问性能低下。

有了这些不妥,程序员一般也就不得不放弃 SQL 式查询了,只能通过程序实现一些简单的关键字搜索等功能,毕竟自己去实现 SQL 语法的查询不仅难度大而且完全没必要。

但是 SQL 查询有时候真的很好用啊……那么,有没有一种第三方软件能实现 SQL 式查询文本,让程序员在享受便利的同时,不需要考虑上面这些烦心的问题呢?

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

Ø 开始

下面就来介绍一下,如何在 Java 中利用集算器实现 SQL 式查询文本文件。当然,此处的文本文件不是指完全自由的文本文件,而是有格式规定的,类似于数据表的文件。

从官网下载并安装好集算器,将 dm.jar 及其依赖的配置文件 raqsoftConfig.xml 加入到当前程序的类路径。然后使用集算器提供的 JDBC 类,便可将文本文件当成数据库中的数据表来进行 SQL 式查询了。

示例用到两个文件,第一个 student.txt 数据内容如下:

ueyeQz2.png!web

数据格式为:第一行为字段名,后续行是数据,各列之间用 Tab 键分开。这个表是各个班级的学生基本情况。

第二个 score.txt 数据内容如下:

AbQJriR.png!web

这个文件通过‘班级’,‘学生 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 文件名。执行后结果如下:

ANnQf2r.png!web

可以看到,使用集算器的 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. 姓名

执行后,得到每班学生的总分表:

meu2yar.png!web

可以看到,集算器用 SQL 查询文本时,对于常规的分组、表的联合都没问题。那么带参数的查询,又该如何写呢?

Ø 使用参数

只需将执行语句方法块里的代码替换为以下代码:

/******************* 执行语句方法 ********************/

CallableStatement cs = null; // 定义 CallableStatement 对象 String

String sql = “ SELECT 姓名, 性别 FROM student.txt WHERE 班级 =? ”;

cs = con.prepareCall(sql);

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

rst = cs.executeQuery();

/******************* 执行语句方法结束 ****************/

换完后,注意要引入 CallableStatement 类。执行后结果如下:

Fjyaumq.png!web

带参数的句子仍然没问题,调用方法也跟数据库标准是一致的。不过上述结果中,性别显示为数字,集算器 SQL 能不能支持转换语法呢?

Ø CASE 语句

将上面的 SQL 语句替换成带 CASE 的 SQL 语句:

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

结果如下:

7fINfuZ.png!web

通过上面这几个例子可以看到,集算器对常用查询的支持还是比较全面的。鉴于篇幅原因,这里就不继续一一列举了。更多集算器查询文件时的详细语法以及函数,请参考文档: http://doc.raqsoft.com.cn/esproc/func/dbquerysql.html#db_sql_

本文由润乾软件 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。

转载、引用前需联系作者,并署名作者且注明文章出处。

本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK