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

mongo 数据查询

2019-09-20
sybn

简介

mongo dao 提供简便的 mongo 数据库操作 ORM, 支持数据 CRUD 以及 sql 查询. 直接 jdbc driver 查询.

通过 mongo dao, 没有任何 mongo 基础的开发人员可以将 mongo 直接当作 sql 库来使用, 降低开发成本。

因为 mongo 的某些特性, 某些 sql 准换为 mongo 查询的结果可有有所不同, 比如 1 != ‘1’ 等.

本文主要介绍使用 sql 查询 mongo 的能力。

maven 信息

  • 私服
<mirror>
    <id>nexus-local</id>
    <mirrorOf>central</mirrorOf>
    <name>vcfilm inside nexus</name>
    <url>http://10.12.62.6:8081/nexus/content/groups/public/</url>
</mirror>
<mirror>
    <id>Nexus-snapshots</id>
    <url>http://10.12.62.6:8081/nexus/content/groups/snapshots/</url>
    <mirrorOf>public-snapshots</mirrorOf>
</mirror>
  • dependency
<dependency>
    <groupId>cn.linpengfei.sybnutil</groupId>
    <artifactId>mongo-dao</artifactId>
    <version>0.3.5-SNAPSHOT</version>
</dependency>

<dependency>
    <groupId>cn.linpengfei.sybnutil</groupId>
    <artifactId>sybn-jdbc-driver</artifactId>
    <version>0.3.5-SNAPSHOT</version>
</dependency>

sql 转 aggregate

mongo 原生不支持 sql 语句查询, mongo 的查询语言为 json 风格的 Aggregate。

我们的 MongoAggregateBuilder 可以把 sql 语句转换为 mongo 的 Aggregate 表达式。

转换后的 Aggregate 表达式可以在任何原生的 mongo 环境中执行, 无需依赖本工具类。

已经为大家准备好了 web 版接口: 在线测试

使用 MongoDao 查询 sql 语句

使用 mongo dao 可以直接执行 sql 语句获取数据, 支持返回 List / Stream, 支持指定返回值的类型。 在线测试

// sql 语句
String sqlFind = "select * from sybn_junit_base where id between '2018-03-20' and '2018-03-21'";
String sqlCount = "select count(*) from sybn_junit_base where id between '2018-03-20' and '2018-03-21'";

// 使用最简单的方法构造 dao 线程安全
SqlDdlDao dao = new MongoDaoImpl("mongodb://账户:密码@192.168.4.31:27017,192.168.4.32:27017/test");

// 执行 sql 查询 List<Map<String, Object>> 格式数据
List<Map<String, Object>> sqlFindListMap = dao.sqlFindListMap(sqlFind);
// 执行 sql 查询 List<bean> 格式数据
List<SybnJunitBase> sqlFindList = dao.sqlFindList(sqlFind, SybnJunitBase.class);
// 执行 sql 查询 Stream<Map<String, Object>> 格式数据
Stream<Map<String, Object>> sqlFindStreamMap = dao.sqlFindStreamMap(sqlFind);
// 执行 sql 查询 Stream<bean> 格式数据
Stream<SybnJunitBase> sqlFindStream = dao.sqlFindStream(sqlFind, SybnJunitBase.class);
// 执行 count
long count = dao.sqlCount(sqlCount);
  • 查询表结构

sqlFindListMap 方案支持使用 show databases / show tables / show create table 等命令查询表即表结构

在线测试

使用 jdbc 查询 mongo

正在测试直接将 mongo 转化为 jdbc 数据源使用, 让使用者与本工具类代码解耦。

  • 原生 jdbc
// 创建 jdbc 连接
String url = "jdbc:mongo://127.0.0.1:27017/junit_test";
Map<String, String> n = MB.n("user", "junit_test_user", "password", "junit_test_pass");
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);
  • 使用 jdbc 连接池
// 创建 jdbc 连接
String url = "jdbc:mongo://127.0.0.1:27017/junit_test";
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("cn.sybn.util.io.driver.SybnDaoDriver");
dataSource.setUrl(url);
dataSource.setUsername("junit_test_user");
dataSource.setPassword("junit_test_pass");
Connection connect = dataSource.getConnection();

// 被执行的 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);

注意

限制: mongo 只支持少部分 udf / udaf 函数。

限制: mongo 比较操作时,区分字段类型。

支持: show databases, show tables 等命令。

相关页面


下一篇 SQL AST 语法树

Comments

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