- 简介
- 使用说明
- 直接在命令行用 sql 查询 excel
- maven 依赖
- 基于 dao 查询 csv 的 demo
- jdbc 查询 xls 的 demo
- 在 mybatis 中使用
- 查询巨大的 cvs 文件
- 在线测试
简介
FileSqlDaoConfImpl 提供 excel 操作 ORM, 支持数据 CRUD 以及 sql 查询, 对外可直接提供 jdbc 只读接口.
本文主要介绍 sql 查询能力。
包括 FileSqlDaoConfImpl 在内的所有 SqlDdlDao 都支持注入到 SqlDdlDaoMultipleImpl 做跨存储引擎的数据查询.
使用说明
-
默认将 excel 文件中的数据读取后, 所有的修改操作都不会落入磁盘.
-
如需将修改后的数据写入磁盘, 需要手动处理.
直接在命令行用 sql 查询 excel
语法: java -jar dw-util-select-xls.jar [--out=输出路径] 'sql' '数据文件路径1' ['数据文件路径2' ...]
sql 此伪sql支持多表嵌套嵌套查询,少部分语法与mysql不一致
文件路径 可以为多个 csv, json, xls, xlsx 文件, 第一个xls会映射为'data_1'表,第二个为'data_2'...所有xls的数据会映射为'data_all'表
maven 依赖
<dependency>
<groupId>cn.linpengfei.sybnutil</groupId>
<artifactId>sybn-jdbc-driver</artifactId>
<version>0.3.11-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>cn.linpengfei.sybnutil</groupId>
<artifactId>sybn-core</artifactId>
<version>0.3.11-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>cn.linpengfei.sybnutil</groupId>
<artifactId>ofice-util</artifactId>
<version>0.3.11-SNAPSHOT</version>
</dependency>
基于 dao 查询 csv 的 demo
// 使用指定的连接访问
SybnDao dao = new FileSqlDaoConfImpl("junit", "jdbc:csv:file:utf8://test_csv.csv?database=test_db&table=test_table&charset=utf-8");
// 从配置文件读取连接
//SybnDao dao = new SybnDaoConfImpl("test", "junit_test@junit_test_init.properties");
// 传统sql占位符
dao.sqlFindListMap("select * from a in (?,?,?)", 1,2,3);
// 一个?占位一个集合
List<Integer> list = ListUtil.toList(1,2,3);
dao.sqlFindListMap("select * from a in (?)", list);
// myBatis 风格
Map<String, Object> map = new HashMap();
map.put("list", list)
dao.sqlFindListMap("select * from a in (#{xxx})", map);
jdbc 查询 xls 的 demo
// 注册 excel 加载器, 支持 xls/xlsx 的加载. 默认只会注册 csv 加载器.
SybnFileLoaderPool.addSybnFileLoader(new SybnExcelFileLoader());
// 创建 jdbc 连接
String url = "jdbc:excel:file:utf8://test_xls.xls?database=test_db&table=test_table";
Properties properties = new SybnProperties(n);
Connection connect = new SybnDaoDriver().connect(url, properties);
// 被执行的 sql
String selectSql = "select * from sybn_junit_crud_test_entry where type = ? limit 1";
// 使用 jdbc 执行此 sql
PreparedStatement selectStatement = connect.prepareStatement(selectSql);
selectStatement.setInt(1, 0); // type = 0
ResultSet selectResultSet = selectStatement.executeQuery();
List<Map<String, Object>> select = HandlerUtil.MAP_LIST_HANDLER.handle(selectResultSet);
selectResultSet.close();
// 打印结果
LogUtil.info("select", select.size(), select);
在 mybatis 中使用
在 spring boot + mybatis 中使用本工具类的 JDBC 能力查询, 无需特殊设置, 正常注册 jdbc 即可:
@Slf4j
@Configuration
public class ExcelDataSourceConfig {
@Value("${spring.profiles.active}")
private String activeProfile;
// sybn.datasource.excel.url=jdbc:csv:file:utf8://test_csv.csv?database=test_db&table=test_table&charset=utf-8
@Value("${sybn.datasource.excel.url}")
private String url;
public static DruidDataSource esDataSource(){
testJdbcProperties = new JdbcProperties();
// SybnDaoDriver 会根据jdbc后面的字符串决定连接哪种数据库, 支持 mysql / mongo / solr / es / hbase
// 需要引用对应的 maven 实现, 比如 dbutil-dao / mongo-dao / solr-dao / es-dao / hadoop-dao
// url 中多个地址逗号分割, 比如: jdbc:es://server1:9200,server3:9200,server3:9200/
testJdbcProperties.setUrl(url);
testJdbcProperties.setDriverClassName("cn.sybn.util.io.driver.SybnDaoDriver");
ElasticDataSourceConfig config = new ElasticDataSourceConfig();
config.activeProfile = "local";
return config.dataSource(testJdbcProperties);
}
}
查询巨大的 cvs 文件
如需查询巨大的 csv 文件, 请使用 stream 版本.
提示: 每次查询都会重新从磁盘读取文件.
// 使用指定的连接访问
SybnStreamDao dao = new FileSqlStreamDaoConfImpl("junit", "jdbc:stream:csv:file:utf8://test_csv.csv?database=test_db&table=test_table&charset=utf-8");
// 从配置文件读取连接
//SybnDao dao = new FileSqlStreamDaoConfImpl("test", "junit_test@junit_test_init.properties");
// 传统sql占位符
dao.sqlFindListMap("select * from a in (?,?,?)", 1,2,3);
// 一个?占位一个集合
List<Integer> list = ListUtil.toList(1,2,3);
dao.sqlFindListMap("select * from a in (?)", list);
// myBatis 风格
Map<String, Object> map = new HashMap();
map.put("list", list)
dao.sqlFindListMap("select * from a in (#{xxx})", map);
在线测试
可以用以下链接尝测试执行 sql, 测试表: csv_demo_table
-
可以使用 show table status 查询其他测试表, 以及测试表数据来源.