【摘要】
        使用 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 数据内容如下:

数据格式为:第一行为字段名,后续行是数据,各列之间用 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_

Java 中如何使用 SQL 查询文本相关推荐

  1. java 查询sql_Java 中如何使用 SQL 查询文本

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

  2. Java中使用hql,sql查询--多表查询后的新实体构建方法

    2019独角兽企业重金招聘Python工程师标准>>> SQL> select r.roleid,r.rolename from dsp_role r,dsp_userinfo ...

  3. Hibernate中的命名SQL查询

    2019独角兽企业重金招聘Python工程师标准>>> 1.  命名查询指的是用<sql-query>标签在影射文档中定义的SQL查询,可以通过使用Session.get ...

  4. java如何获取手机号码归属地_在java中如何根据手机号查询号码归属地

    在java中如何根据手机号查询号码归属地 1.maven项目中配置 com.googlecode.libphonenumber geocoder 2.15 com.googlecode.libphon ...

  5. java怎么在文本框里输入文件,java中如何把窗体内文本框输入的内容保存到文件内?...

    java中如何把窗体内文本框输入的内容保存到文件内? 1.获取文本框中的文本 2.将内容写入文件内 具体示例如下所示: public static void main(String [] args){ ...

  6. php pdo预处理查询,关于php:从PDO预处理语句中获取原始SQL查询字符串

    在对准备好的语句调用pdoStatement::execute()时,是否有方法执行原始SQL字符串?出于调试目的,这将非常有用. 对于php>=5.1,请查看php.net/manual/en ...

  7. java 键入_在Java中键入Safe SQL

    java 键入 字符串,字符串,字符串 无论您使用的是JPA , MyBatis还是Spring Data JDBC之类的框架,总会最终将SQL语句声明为Java String. 这种方法的问题在于, ...

  8. Java、JSP通用SQL查询分析器

    技术:Java.JSP等 摘要: 本文主要针对当前很多软件都无法实现跨数据库.跨平台来执行sql语句而用户又仅需做一些基本的增删改查操作的矛盾,设计了一个能够跨平台跨数据库的软件.此软件是一个通用SQ ...

  9. Java中如何解析SQL语句、格式化SQL语句、生成SQL语句?

    昨天在群里看到有小伙伴问,Java里如何解析SQL语句然后格式化SQL,是否有现成类库可以使用? 之前TJ没有做过这类需求,所以去研究了一下,并找到了一个不过的解决方案,今天推荐给大家,如果您正要做类 ...

最新文章

  1. CentOS5.8 RHCS配置
  2. 位置式PID与增量式PID的介绍和代码实现
  3. 安利一波veronica老师
  4. SuperMap.IS.AjaxScript缓冲区分析及专题图制作
  5. git中如何合并某个指定文件?
  6. [javascript]图解+注释版 Ext.extend()
  7. 假设以带头结点的循环链表表示队列_关于反转链表,看这一篇就够了!
  8. AIOps产品与架构浅析
  9. 教育院校公共机房虚拟桌面解决方案
  10. [导入]表单确认按钮——Javascript函数
  11. 深度学习在图像语义分割中的应用
  12. 51单片机c语言的延时程序,51单片机延时程序
  13. FME中GIS面分图层转为CAD填充并符号化,且图斑含面积属性
  14. Python代码对接抖音去水印提取API接口、TikTok去水印解析接口的源码
  15. 淘宝客佣金设置多少合适?淘宝客的佣金是怎么算的?
  16. 数论进阶——莫比乌斯反演
  17. 硬盘安装XP蓝屏,U盘安装XP提示INF file txtsetup……
  18. Android怎么实现解压文件,Android如何实现压缩和解压缩文件
  19. 什么是链路追踪?分布式系统如何实现链路追踪?
  20. PotPlayer不支持S/W HEVC(H.265)解码的解决方法

热门文章

  1. 浅谈RPA 在银行领域的十个场景应用
  2. 万字长文总结机器学习的模型评估与调参
  3. 贾扬清出任阿里巴巴开源技术委员会负责人
  4. 2019年人工智能硬件与应用大趋势
  5. 「AlphaGo 之父」David Silver最新演讲,传授强化学习的十大原则
  6. 曝光丨探访哈工大机器人的秘密基地(图)
  7. Pytorch+CNN+MNIST手写数字识别实战
  8. IBM 揭晓全球第一项 2纳米芯片技术,为半导体领域实现重大突破
  9. 中国的自动驾驶到底发展到了什么程度?
  10. 人工智能第一股“旷视科技”赴港递交IPO材料 半年亏损52亿估值280亿