java 查询sql_Java 中如何使用 SQL 查询文本
【摘要】
使用 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_Java 中如何使用 SQL 查询文本相关推荐
- Java 中如何使用 SQL 查询文本
[摘要] 使用 SQL 查询语言,你只能查询位于数据库里面的数据,但是当你面对的数据是一些 Excel 表格或者 Txt 文本格式时,有什么办法能直接对着文件进行 Select 查询呢 ...
- Hibernate中的命名SQL查询
2019独角兽企业重金招聘Python工程师标准>>> 1. 命名查询指的是用<sql-query>标签在影射文档中定义的SQL查询,可以通过使用Session.get ...
- 关于oracle查询语句中like '%中文的%' 查询不到数据的问题
关于oracle查询语句中like '%中文的%' 查询不到数据的问题 问题描述: 关于oracle查询语句中like '%中文的%' 查询不到数据的问题解决 起因: 在Windows10 系统环境下 ...
- php pdo预处理查询,关于php:从PDO预处理语句中获取原始SQL查询字符串
在对准备好的语句调用pdoStatement::execute()时,是否有方法执行原始SQL字符串?出于调试目的,这将非常有用. 对于php>=5.1,请查看php.net/manual/en ...
- python 查询sqlserver 视图_在Python中,将SQL查询的输出显示为表,就像在SQL中一样...
这似乎是一个基本的函数,但我对Python还不熟悉,所以也许我没有正确地搜索这个函数. 在Microsoft SQL Server中,当SELECT top 100 * FROM dbo.Patien ...
- java hql查询_Spring 中常用的hql查询方法(getHibernateTemplate())(转)
示例:this.getHibernateTemplate().find("from bean.User"); 返回所有User对象 二.find(String queryStrin ...
- java查询学号数据库_数据库SQL查询语句练习题 PDF 下载
主要内容: 设教学数据库Education有三个关系: 学生关系S(SNO,SNAME,AGE,SEX,SDEPT):学习关系SC(SNO,CNO,GRADE):课程关系C(CNO,CNAME,CDE ...
- Java 8流中的常见SQL子句及其等效项
功能编程允许使用通用语言进行准声明性编程 . 通过使用功能强大的流畅API(例如Java 8的Stream API )或jOOλ的顺序Stream扩展Seq或更复杂的库(例如javaslang或fun ...
- oracle突然查询变慢,[转] Oracle sql 查询突然变慢 -- 案例分析
一条sql突然执行变慢,耗时9秒,应用是不能改的,只能从数据库方面下手解决 步骤思路: 1:查看sql是否走索引 2:查看索引是否失效 3:hint 强制走索引(只是用来查看hint状态下,查询是否更 ...
最新文章
- C语言经典例84-一个偶数总能表示为两个素数之和
- TFS中的迭代(五)
- 微软Webcast课程下载软件iReaper正式登陆Android平台
- 一种基于AliOS Things的uData感知设备软件框架
- 触发2次 layui_[电路小知识篇]D型触发器电路
- 如何获取查询生成器以字符串形式输出其原始SQL查询?
- 二项分布的实现(np.random.binomial)
- wince6移植之创建.pbcxml文件
- 1113 Integer Set Partition(25 分)
- 金鱼的养殖知识大全(一)
- MySQL子查询的优缺点_为什么MySQL不推荐使用子查询和join
- postgres链接太多(sorry, too many clients already)
- 《我的世界》JAVA版本需使用微软账号登录
- 基于MATLAB燃料电池控制系统测试平台
- 如何在小程序的wxml中书写函数逻辑,wxs的使用
- Fiddler跟F12
- WRF模式行业应用问题解析及辅助学习
- OpenCV的 Mat对象 与Halcon的 HImage对象 的相互转换
- 天合航旅丨一周航旅资讯
- MOOS-Ivp初学
热门文章
- Flutter进阶—网络和HTTP
- Dart基础-运算符
- javascript控制页面控件隐藏显示的两种方法
- 2个维度5大方法,让你的微服务在K8s上跑起来
- 不如安卓?iPhone 12 5G 速度上演“滑铁卢”
- UCloud发布新一代归档存储产品,存储成本直降80%
- 任正非回应退休传闻;董明珠谈直播首秀“失败”;Wine 5.7 发布​| 极客头条...
- 听说你还不会归并排序?
- 被高估了的测试驱动开发?
- 余承东硬刚 iPhone11;苹果推送正式版 iOS 13;php-nsq 3.4.3 线上稳定版发布 | 极客头条...