sybn sybn-util 项目说明文档 - 基于java的跨数据库联合查询

用sql查询本地excel文件(csv,xls,xlsx)

2020-06-28
sybn

简介

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 查询其他测试表, 以及测试表数据来源.


Similar Posts

下一篇 关于变量

Comments

暂不开放评论! 可微信联系