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

SqlDdlDao quick start

2019-07-25
sybn

环境依赖

  • 依赖 jre 1.8+

  • 依赖 slf4j (默认不自动引入 slf4j 实现)

  • 支持与 spring boot / spring data / spring mvc / hibernate / spark / spark sql 等生态系统共存

maven 引用

  • 暂不支持在maven公共库引用, 目前支持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>
<properties>
	<sybn.version>0.3.8-SNAPSHOT</sybn.version>
</properties>

<distributionManagement>
	<repository>
		<id>releases</id>
		<name>vcfilm releases</name>
		<url> http://nexus.xxx.cn:8081/nexus/content/repositories/releases/</url>
	</repository>
	<snapshotRepository>
		<id>snapshots</id>
		<name>vcfilm snapshots</name>
		<url>http://nexus.xxx.cn:8081/nexus/content/repositories/snapshots/</url>
	</snapshotRepository>
</distributionManagement>

<dependencies>

	<!-- jdbc (mysql / gbase / Presto 等)  -->
	<dependency>
		<groupId>cn.linpengfei.sybnutil</groupId>
		<artifactId>dbutil-dao</artifactId>
		<version>${sybn.version}</version>
	</dependency>

	<!-- mongo db -->
	<dependency>
		<groupId>cn.linpengfei.sybnutil</groupId>
		<artifactId>mongo-dao</artifactId>
		<version>${sybn.version}</version>
	</dependency>
	
	<!-- solr -->
	<dependency>
		<groupId>cn.linpengfei.sybnutil</groupId>
		<artifactId>solr-dao</artifactId>
		<version>${sybn.version}</version>
	</dependency>
	
	<!-- es -->
	<dependency>
		<groupId>cn.linpengfei.sybnutil</groupId>
		<artifactId>es-dao</artifactId>
		<version>${sybn.version}</version>
	</dependency>
	
	<!-- hbase -->
	<dependency>
		<groupId>cn.linpengfei.sybnutil</groupId>
		<artifactId>hadoop-dao</artifactId>
		<version>${sybn.version}</version>
	</dependency>
	
</dependencies>

单库查询样例

// 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'";

// 1. 构造不同数据库实例执行查询
// mysql / mongo / solr / HBase 数据量大时, 可以使用 StreamDao 以 Stream 流形式返回数据
SqlDdlDao dao = new DbutilDaoImpl("jdbc:mysql://账户:密码@192.168.4.31:3306,192.168.4.32:3306/test"); // sql
SqlDdlDao dao = new MongoDaoImpl("mongodb://账户:密码@192.168.4.31:27017,192.168.4.32:27017/test"); // mongo
SqlDdlDao dao = new SolrDaoImpl("solr://192.168.7.71:2181,192.168.7.72:2181/solr"); // solr
SqlDdlDao dao = new EsDaoImpl("es://192.168.7.71:9200"); // es
SqlDdlDao dao = new HBaseDaoImpl("hbase://192.168.7.71,192.168.7.72/hbase-unsecure"); // HBase

// 三种不同返回值的查询例子, 支持 ? 占位符
List<Map<String, Object>> sqlFindListMap = dao.sqlFindListMap(sqlFind);
List<SybnJunitBase> sqlFindList = dao.sqlFindList(sqlFind, SybnJunitBase.class);
long count = dao.sqlCount(sqlCount);

// 2. 直接查询jvm中的 list 数据
List<Map<String, Object>> sqlFindListMap = DatasSqlDdlEngine.sqlFindListMap(list, sqlFind);
List<SybnJunitBase> sqlFindList = DatasSqlDdlEngine.sqlFindList(list, sqlFind, SybnJunitBase.class);

跨库查询样例

  • 准备 SqlDdlDaoMultipleImpl
// 初始化各种数据源, 为了容易理解这里使用直接传入jdbc的实现类
SqlDdlDao dao1 = new DbutilDaoImpl("jdbc:mysql://账户:密码@192.168.4.31:3306,192.168.4.32:3306/test"); // sql
SqlDdlDao dao2 = new MongoDaoImpl("mongodb://账户:密码@192.168.4.31:27017,192.168.4.32:27017/test"); // mongo
SqlDdlDao dao3 = new SolrDaoImpl("solr://192.168.7.71:2181,192.168.7.72:2181/solr"); // solr
SqlDdlDao dao4 = new EsDaoImpl("es://192.168.7.71:9200,192.168.7.72:9200"); // es
SqlDdlDao dao5 = new HBaseDaoImpl("hbase://192.168.7.71,192.168.7.72/hbase-unsecure"); // HBase
// 推荐使用配置文件管理数据库连接信息, 比如: SqlDdlDao dao1 = new DbutilDaoConfImpl("mysql_test@xxx.properties")

// 构造 SqlDdlDaoMultipleImpl, 并将以上数据源注册进来.
SqlDdlDaoMultipleImpl multipleDao = new SqlDdlDaoMultipleImpl();
multipleDao.addAllTableSource(dao1);
multipleDao.addAllTableSource(dao2);
multipleDao.addAllTableSource(dao3);
multipleDao.addAllTableSource(dao4);
multipleDao.addAllTableSource(dao5);
  • from 子查询
String sql = "
	select type_name,sum(count) as count from (
		select type,count(*) as count from table1 group by type;
		select type,type_name from table2;
		join right(type_name) on left.type = right.type;
	) group by type_name";
List<Map<String,Object>> mapList = multipleDao.sqlFindListMap(sql);
List<Bean> beanList = multipleDao.sqlFindList(sql, Bean.class);
  • select 子查询 V:0.2.19
String sql = "
	select * from table1 where id in (
		select id from table2
	);"
List<Map<String,Object>> mapList = multipleDao.sqlFindListMap(sql);
List<Bean> beanList = multipleDao.sqlFindList(sql, Bean.class);
  • union V:0.2.18
String sql = "
	select * from table1 
	union all
	select * from table2;"
List<Map<String,Object>> mapList = multipleDao.sqlFindListMap(sql);
List<Bean> beanList = multipleDao.sqlFindList(sql, Bean.class);
  • 临时变量 V:0.3.4
-- 支持 mysql风格的临时变量
set @time_date_str := '2019-01-16',
    @time := str_to_date(@time_date_str, '%Y-%m-%d');
select * from table where time_str > @time_date_str and time > @time

-- 扩展支持 list 型变量
set @a@list = (1028, 1029, 1030, 1031, 1032);
select * from table where id in (@a@list);

-- 扩展支持 list 型变量,并内嵌函数和变量
set @a = 1032;
set @a@list = (1028, CONVERT("1029", SIGNED), CAST("1030" as SIGNED), toInt("1031"), @a);
select * from table where id in (@a@list);

-- 扩展支持 list 型变量,并从查询获取值
set @a@list = (SELECT id FROM table order by id limit 5);
select * from table where id in (@a@list);

在线测试


Comments

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