AbstractSQLQueryService.java 3.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  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.extern.slf4j.Slf4j;
  6. import java.sql.*;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9. /**
  10. * @author Kerry on 19/11/27
  11. */
  12. @Slf4j
  13. public abstract class AbstractSQLQueryService implements SQLQueryService {
  14. protected final HikariDataSource dataSource;
  15. protected AbstractSQLQueryService(HikariDataSource dataSource) {
  16. this.dataSource = dataSource;
  17. }
  18. @Override
  19. public <T> List<T> queryByPage(String table, int page, int pageCount, Class<T> clazz) throws SQLException {
  20. final String querySql = getQuerySql(table);
  21. long startTime = System.currentTimeMillis();
  22. final Connection connection = dataSource.getConnection();
  23. final PreparedStatement preparedStatement = getPreparedStatement(connection, querySql, page, pageCount);
  24. ResultSet resultSet = preparedStatement.executeQuery();
  25. List<T> list = resultMapper(resultSet, clazz);
  26. logger.debug("query success. size = {}. usageTime = {} /ms", list.size(), (System.currentTimeMillis() - startTime));
  27. resultSet.close();
  28. preparedStatement.close();
  29. connection.close();
  30. return list;
  31. }
  32. /**
  33. * 组装表
  34. *
  35. * @param table
  36. * @return
  37. */
  38. protected abstract String getQuerySql(String table);
  39. /**
  40. * get PreparedStatement
  41. *
  42. * @param connection
  43. * @param sql
  44. * @param start
  45. * @param pageCount
  46. * @return
  47. * @throws SQLException
  48. */
  49. protected abstract PreparedStatement getPreparedStatement(Connection connection, String sql, int start, int pageCount) throws SQLException;
  50. public <T> List<T> resultMapper(ResultSet resultSet, Class<T> clazz) throws SQLException {
  51. if (clazz == Object.class) {
  52. //noinspection unchecked
  53. return (List<T>) resultSetToObject(resultSet);
  54. }
  55. return autoMapper(resultSet, clazz);
  56. }
  57. public List<Object[]> resultSetToObject(ResultSet resultSet) throws SQLException {
  58. final ResultSetMetaData metaData = resultSet.getMetaData();
  59. final int columnCount = metaData.getColumnCount() - 1;
  60. int skipRnIndex = -1;
  61. int index = 0;
  62. String[] header = new String[columnCount];
  63. for (int i = 0; i < columnCount; i++) {
  64. String s = metaData.getColumnName(i + 1);
  65. if ("RN".equalsIgnoreCase(s)) {
  66. skipRnIndex = i;
  67. } else {
  68. header[index++] = s;
  69. }
  70. }
  71. logger.info("header = ({})", String.join(",", header));
  72. List<Object[]> data = new ArrayList<>();
  73. while (resultSet.next()) {
  74. Object[] objects = new Object[columnCount];
  75. int cIndex = 0;
  76. for (int i = 0; i < columnCount; i++) {
  77. if (i == skipRnIndex) {
  78. continue;
  79. }
  80. objects[cIndex++] = resultSet.getObject(i + 1);
  81. }
  82. data.add(objects);
  83. }
  84. return data;
  85. }
  86. public <T> List<T> autoMapper(ResultSet resultSet, Class<T> clazz) throws SQLException {
  87. List<T> list = new ArrayList<>();
  88. while (resultSet.next()) {
  89. final T t = AutoMapper.autoMapper(resultSet, clazz);
  90. if (t != null) {
  91. list.add(t);
  92. }
  93. }
  94. return list;
  95. }
  96. }