AbstractSQLQueryService.java 4.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. package com.vcarecity.cvs.service.impl;
  2. import com.vcarecity.cvs.core.AutoMapper;
  3. import com.vcarecity.cvs.service.SQLQueryService;
  4. import com.zaxxer.hikari.HikariDataSource;
  5. import lombok.AllArgsConstructor;
  6. import lombok.Data;
  7. import lombok.NoArgsConstructor;
  8. import lombok.extern.slf4j.Slf4j;
  9. import java.sql.*;
  10. import java.util.ArrayList;
  11. import java.util.List;
  12. import java.util.Set;
  13. import java.util.stream.Collectors;
  14. import static com.vcarecity.cvs.FileExporterApp.TABLE_COLUMN;
  15. /**
  16. * @author Kerry on 19/11/27
  17. */
  18. @Slf4j
  19. public abstract class AbstractSQLQueryService implements SQLQueryService {
  20. private boolean isFirst = true;
  21. protected final HikariDataSource dataSource;
  22. protected AbstractSQLQueryService(HikariDataSource dataSource) {
  23. this.dataSource = dataSource;
  24. }
  25. @Override
  26. public <T> List<T> queryByPage(String table, int page, int pageCount, Class<T> clazz) throws SQLException {
  27. final String querySql = getQuerySql(table);
  28. long startTime = System.currentTimeMillis();
  29. final Connection connection = dataSource.getConnection();
  30. final PreparedStatement preparedStatement = getPreparedStatement(connection, querySql, page, pageCount);
  31. ResultSet resultSet = preparedStatement.executeQuery();
  32. List<T> list = resultMapper(table, resultSet, clazz);
  33. logger.debug("query success. size = {}. usageTime = {} /ms", list.size(), (System.currentTimeMillis() - startTime));
  34. resultSet.close();
  35. preparedStatement.close();
  36. connection.close();
  37. return list;
  38. }
  39. /**
  40. * 组装表
  41. *
  42. * @param table
  43. * @return
  44. */
  45. protected abstract String getQuerySql(String table);
  46. /**
  47. * get PreparedStatement
  48. *
  49. * @param connection
  50. * @param sql
  51. * @param start
  52. * @param pageCount
  53. * @return
  54. * @throws SQLException
  55. */
  56. protected abstract PreparedStatement getPreparedStatement(Connection connection, String sql, int start, int pageCount) throws SQLException;
  57. public <T> List<T> resultMapper(String table, ResultSet resultSet, Class<T> clazz) throws SQLException {
  58. if (clazz == Object.class) {
  59. //noinspection unchecked
  60. return (List<T>) resultSetToObject(table, resultSet);
  61. }
  62. return autoMapper(resultSet, clazz);
  63. }
  64. public List<Object[]> resultSetToObject(String table, ResultSet resultSet) throws SQLException {
  65. final ResultSetMetaData metaData = resultSet.getMetaData();
  66. final int columnCount = metaData.getColumnCount() - 1;
  67. final List<ColumnIndexName> columnWithObject = getColumnWithObject(metaData);
  68. final Set<Integer> skipIndex = columnWithObject.stream().map(ColumnIndexName::getIndex).collect(Collectors.toSet());
  69. final String[] header = columnWithObject.stream().map(ColumnIndexName::getName).toArray(String[]::new);
  70. TABLE_COLUMN.put(table, header);
  71. if (isFirst) {
  72. final String join = String.join(",", header);
  73. logger.info("header = ({})", join);
  74. isFirst = false;
  75. }
  76. List<Object[]> data = new ArrayList<>();
  77. while (resultSet.next()) {
  78. Object[] objects = new Object[columnCount];
  79. int cIndex = 0;
  80. for (int i = 0; i < columnCount; i++) {
  81. if (!skipIndex.contains(i)) {
  82. continue;
  83. }
  84. objects[cIndex++] = resultSet.getObject(i + 1);
  85. }
  86. data.add(objects);
  87. }
  88. return data;
  89. }
  90. @NoArgsConstructor
  91. @AllArgsConstructor
  92. @Data
  93. public static class ColumnIndexName {
  94. private int index;
  95. private String name;
  96. }
  97. /**
  98. * @param metaData
  99. * @return
  100. */
  101. protected List<ColumnIndexName> getColumnWithObject(ResultSetMetaData metaData) throws SQLException {
  102. final int columnCount = metaData.getColumnCount();
  103. List<ColumnIndexName> res = new ArrayList<>(columnCount);
  104. for (int i = 0; i < columnCount; i++) {
  105. String name = metaData.getColumnName(i + 1);
  106. res.add(new ColumnIndexName(i, name));
  107. }
  108. return res;
  109. }
  110. public <T> List<T> autoMapper(ResultSet resultSet, Class<T> clazz) throws SQLException {
  111. List<T> list = new ArrayList<>();
  112. while (resultSet.next()) {
  113. final T t = AutoMapper.autoMapper(resultSet, clazz);
  114. if (t != null) {
  115. list.add(t);
  116. }
  117. }
  118. return list;
  119. }
  120. }