提交 | 用户 | 时间
e7c126 1 package com.iailab.module.report.service.goview;
H 2
3 import com.iailab.module.report.controller.admin.goview.vo.data.GoViewDataRespVO;
4 import com.google.common.collect.Maps;
5 import org.springframework.jdbc.core.JdbcTemplate;
6 import org.springframework.jdbc.support.rowset.SqlRowSet;
7 import org.springframework.jdbc.support.rowset.SqlRowSetMetaData;
8 import org.springframework.stereotype.Service;
9 import org.springframework.validation.annotation.Validated;
10
11 import javax.annotation.Resource;
12 import java.util.Arrays;
13 import java.util.LinkedList;
14 import java.util.Map;
15
16 /**
17  * GoView 数据 Service 实现类
18  *
19  * 补充说明:
20  * 1. 目前默认使用 jdbcTemplate 查询项目配置的数据源。如果你想查询其它数据源,可以新建对应数据源的 jdbcTemplate 来实现。
21  * 2. 默认数据源是 MySQL 关系数据源,可能数据量比较大的情况下,会比较慢,可以考虑后续使用 Click House 等等。
22  *
23  * @author iailab
24  */
25 @Service
26 @Validated
27 public class GoViewDataServiceImpl implements GoViewDataService {
28
29     @Resource
30     private JdbcTemplate jdbcTemplate;
31
32     @Override
33     public GoViewDataRespVO getDataBySQL(String sql) {
34         // 1. 执行查询
35         SqlRowSet sqlRowSet = jdbcTemplate.queryForRowSet(sql);
36
37         // 2. 构建返回结果
38         GoViewDataRespVO respVO = new GoViewDataRespVO();
39         // 2.1 解析元数据
40         SqlRowSetMetaData metaData = sqlRowSet.getMetaData();
41         String[] columnNames = metaData.getColumnNames();
42         respVO.setDimensions(Arrays.asList(columnNames));
43         // 2.2 解析数据明细
44         respVO.setSource(new LinkedList<>()); // 由于数据量不确认,使用 LinkedList 虽然内存占用大一点,但是不存在扩容复制的问题
45         while (sqlRowSet.next()) {
46             Map<String, Object> data = Maps.newHashMapWithExpectedSize(columnNames.length);
47             for (String columnName : columnNames) {
48                 data.put(columnName, sqlRowSet.getObject(columnName));
49             }
50             respVO.getSource().add(data);
51         }
52         return respVO;
53     }
54
55 }