diff --git a/src/main/java/neatlogic/framework/dao/mapper/healthcheck/SqlStatusMapper.java b/src/main/java/neatlogic/framework/dao/mapper/healthcheck/SqlStatusMapper.java index 6f7aa426285d8d5e63371aa194c005283b9df2c6..3728748a3e16837c477fa697bdfdbfd8194d4d8c 100644 --- a/src/main/java/neatlogic/framework/dao/mapper/healthcheck/SqlStatusMapper.java +++ b/src/main/java/neatlogic/framework/dao/mapper/healthcheck/SqlStatusMapper.java @@ -15,8 +15,12 @@ package neatlogic.framework.dao.mapper.healthcheck; import neatlogic.framework.dto.healthcheck.InnoDbStatusVo; +import java.util.List; +import java.util.Map; + public interface SqlStatusMapper { InnoDbStatusVo getInnodbStatus(); + List> selectListBySql(String sql); } diff --git a/src/main/java/neatlogic/framework/dao/mapper/healthcheck/SqlStatusMapper.xml b/src/main/java/neatlogic/framework/dao/mapper/healthcheck/SqlStatusMapper.xml index 9a72b046b4a49d11f60c592351909f28e60cad24..0618776d67813719ec98bce7f373457f9933353d 100644 --- a/src/main/java/neatlogic/framework/dao/mapper/healthcheck/SqlStatusMapper.xml +++ b/src/main/java/neatlogic/framework/dao/mapper/healthcheck/SqlStatusMapper.xml @@ -20,5 +20,8 @@ along with this program. If not, see .--> show engine innodb status + diff --git a/src/main/java/neatlogic/framework/util/JdbcUtil.java b/src/main/java/neatlogic/framework/util/JdbcUtil.java index 3d44e90442933d6db484c4c815e6f7ef354a7669..1d23aab7d151219ba7825bbb7dc9986d3d25d84c 100644 --- a/src/main/java/neatlogic/framework/util/JdbcUtil.java +++ b/src/main/java/neatlogic/framework/util/JdbcUtil.java @@ -4,12 +4,14 @@ import neatlogic.framework.common.config.Config; import neatlogic.framework.common.config.LocalConfig; import neatlogic.framework.dto.TenantVo; import neatlogic.framework.exception.module.ModuleInitRuntimeException; +import org.apache.commons.collections4.CollectionUtils; +import org.apache.commons.collections4.MapUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.sql.*; -import java.util.Properties; +import java.util.*; public class JdbcUtil { static Logger logger = LoggerFactory.getLogger(JdbcUtil.class); @@ -113,4 +115,139 @@ public class JdbcUtil { } } -} \ No newline at end of file + /** + * + * @param sql + * @param neatlogicConn + * @return + * @throws SQLException + */ + public static List> selectList(String sql, Connection neatlogicConn) throws SQLException { + try ( + PreparedStatement preparedStatement = neatlogicConn.prepareStatement(sql); + ResultSet resultSet = preparedStatement.executeQuery(); + ) { + List> resultList = new ArrayList<>(); + ResultSetMetaData metaData = resultSet.getMetaData(); + int columnCount = metaData.getColumnCount(); + while (resultSet.next()) { + Map rowMap = new LinkedHashMap<>(); + for (int i = 1; i <=columnCount; i++) { + String columnName = metaData.getColumnName(i); + Object columnValue = resultSet.getObject(i); + rowMap.put(columnName, columnValue); + } + resultList.add(rowMap); + } + return resultList; + } + } + + /** + * 数据可视化 + * +----+----+ + * |a |b | + * +----+----+ + * |A |B | + * +----+----+ + * @param sql + * @param tbodyList + * @return + */ + public static String dataVisualization(String sql, List> tbodyList) { + sql = sql != null ? sql : StringUtils.EMPTY; + tbodyList = tbodyList != null ? tbodyList : new ArrayList<>(); + StringBuilder stringBuilder = new StringBuilder(); + Map columnName2valueMaxLengthMap = new LinkedHashMap<>(); + if (CollectionUtils.isNotEmpty(tbodyList)) { + for (Map tbody : tbodyList) { + for (Map.Entry entry : tbody.entrySet()) { + String columnName = entry.getKey(); + Object columnValue = entry.getValue(); + int length = columnName.length(); + if (columnValue != null) { + length = Math.max(columnValue.toString().length(), length); + } + Integer maxLength = columnName2valueMaxLengthMap.getOrDefault(columnName, 0); + maxLength = Math.max(maxLength, length); + columnName2valueMaxLengthMap.put(columnName, maxLength); + } + } + int length = generateRowDividingLine(stringBuilder, columnName2valueMaxLengthMap); + int maxLength = length - 4; + while(StringUtils.isNotBlank(sql)) { + if (sql.length() > maxLength) { + generateSqlRow(stringBuilder, sql.substring(0, maxLength), maxLength); + sql = sql.substring(maxLength); + } else { + generateSqlRow(stringBuilder, sql, maxLength); + break; + } + } + generateRowDividingLine(stringBuilder, columnName2valueMaxLengthMap); + generateRowData(stringBuilder, columnName2valueMaxLengthMap, null); + generateRowDividingLine(stringBuilder, columnName2valueMaxLengthMap); + for (Map map : tbodyList) { + generateRowData(stringBuilder, columnName2valueMaxLengthMap, map); + } + generateRowDividingLine(stringBuilder, columnName2valueMaxLengthMap); + } else { + columnName2valueMaxLengthMap.put("sql", sql.length()); + int length = generateRowDividingLine(stringBuilder, columnName2valueMaxLengthMap); + int maxLength = length - 4; + generateSqlRow(stringBuilder, sql, maxLength); + generateRowDividingLine(stringBuilder, columnName2valueMaxLengthMap); + String str = "No data"; + stringBuilder.append("| "); + stringBuilder.append(str); + stringBuilder.append(" ".repeat(maxLength - str.length() + 1)); + stringBuilder.append("|"); + stringBuilder.append(System.lineSeparator()); + generateRowDividingLine(stringBuilder, columnName2valueMaxLengthMap); + } + stringBuilder.append(tbodyList.size()).append(" rows in set").append(System.lineSeparator()); + stringBuilder.insert(0, System.lineSeparator()); + return stringBuilder.toString(); + } + + private static int generateRowDividingLine(StringBuilder stringBuilder, Map columnName2valueMaxLengthMap) { + for (Map.Entry entry : columnName2valueMaxLengthMap.entrySet()) { + Integer maxLength = entry.getValue(); + stringBuilder.append("+-"); + stringBuilder.append("-".repeat(maxLength + 1)); + } + stringBuilder.append("+"); + int length = stringBuilder.length(); + stringBuilder.append(System.lineSeparator()); + return length; + } + + private static void generateSqlRow(StringBuilder stringBuilder, String sql, int maxLength) { + stringBuilder.append("| "); + stringBuilder.append(sql); + stringBuilder.append(" ".repeat(maxLength - sql.length() + 1)); + stringBuilder.append("|"); + stringBuilder.append(System.lineSeparator()); + } + + private static void generateRowData(StringBuilder stringBuilder, Map columnName2valueMaxLengthMap, Map map) { + for (Map.Entry entry : columnName2valueMaxLengthMap.entrySet()) { + String key = entry.getKey(); + String valueStr = StringUtils.EMPTY; + Object valueObj = key; + if (MapUtils.isNotEmpty(map)) { + valueObj = map.get(key); + } + if (valueObj != null) { + valueStr = valueObj.toString(); + } + Integer maxLength = entry.getValue(); + stringBuilder.append("| "); + stringBuilder.append(valueStr); + stringBuilder.append(" ".repeat(maxLength - valueStr.length() + 1)); + } + stringBuilder.append("|"); + stringBuilder.append(System.lineSeparator()); + } + +}