123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122 |
- package com.vcarecity.cvs.service.impl;
-
- import com.vcarecity.cvs.core.AutoMapper;
- import com.vcarecity.cvs.service.SQLQueryService;
- import com.zaxxer.hikari.HikariDataSource;
- import lombok.extern.slf4j.Slf4j;
-
- import java.sql.*;
- import java.util.ArrayList;
- import java.util.List;
-
- /**
- * @author Kerry on 19/11/27
- */
-
- @Slf4j
- public abstract class AbstractSQLQueryService implements SQLQueryService {
-
- protected final HikariDataSource dataSource;
-
- protected AbstractSQLQueryService(HikariDataSource dataSource) {
- this.dataSource = dataSource;
- }
-
- @Override
- public <T> List<T> queryByPage(String table, int page, int pageCount, Class<T> clazz) throws SQLException {
-
- final String querySql = getQuerySql(table);
-
- long startTime = System.currentTimeMillis();
-
-
- final Connection connection = dataSource.getConnection();
-
- final PreparedStatement preparedStatement = getPreparedStatement(connection, querySql, page, pageCount);
-
- ResultSet resultSet = preparedStatement.executeQuery();
-
- List<T> list = resultMapper(resultSet, clazz);
-
- logger.debug("query success. size = {}. usageTime = {} /ms", list.size(), (System.currentTimeMillis() - startTime));
-
- resultSet.close();
- preparedStatement.close();
- connection.close();
-
- return list;
- }
-
- /**
- * 组装表
- *
- * @param table
- * @return
- */
- protected abstract String getQuerySql(String table);
-
- /**
- * get PreparedStatement
- *
- * @param connection
- * @param sql
- * @param start
- * @param pageCount
- * @return
- * @throws SQLException
- */
- protected abstract PreparedStatement getPreparedStatement(Connection connection, String sql, int start, int pageCount) throws SQLException;
-
- public <T> List<T> resultMapper(ResultSet resultSet, Class<T> clazz) throws SQLException {
- if (clazz == Object.class) {
- //noinspection unchecked
- return (List<T>) resultSetToObject(resultSet);
- }
- return autoMapper(resultSet, clazz);
- }
-
- public List<Object[]> resultSetToObject(ResultSet resultSet) throws SQLException {
- final ResultSetMetaData metaData = resultSet.getMetaData();
- final int columnCount = metaData.getColumnCount() - 1;
-
-
- int skipRnIndex = -1;
- int index = 0;
- String[] header = new String[columnCount];
- for (int i = 0; i < columnCount; i++) {
- String s = metaData.getColumnName(i + 1);
- if ("RN".equalsIgnoreCase(s)) {
- skipRnIndex = i;
- } else {
- header[index++] = s;
- }
- }
-
- logger.info("header = ({})", String.join(",", header));
-
- List<Object[]> data = new ArrayList<>();
- while (resultSet.next()) {
- Object[] objects = new Object[columnCount];
- int cIndex = 0;
- for (int i = 0; i < columnCount; i++) {
- if (i == skipRnIndex) {
- continue;
- }
- objects[cIndex++] = resultSet.getObject(i + 1);
- }
- data.add(objects);
- }
- return data;
- }
-
- public <T> List<T> autoMapper(ResultSet resultSet, Class<T> clazz) throws SQLException {
- List<T> list = new ArrayList<>();
- while (resultSet.next()) {
- final T t = AutoMapper.autoMapper(resultSet, clazz);
- if (t != null) {
- list.add(t);
- }
- }
- return list;
- }
- }
|