DbUtils.java 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. /**
  2. * Copyright (c) 2020 佳缘科技 All rights reserved.
  3. * <p>
  4. * https://www.scjydz.com
  5. * <p>
  6. * 版权所有,侵权必究!
  7. */
  8. package com.wjp.modules.devtools.utils;
  9. import com.baomidou.mybatisplus.core.toolkit.StringUtils;
  10. import com.wjp.modules.devtools.config.DataSourceInfo;
  11. import com.wjp.modules.devtools.config.query.AbstractQuery;
  12. import com.wjp.modules.devtools.entity.TableFieldEntity;
  13. import com.wjp.modules.devtools.entity.TableInfoEntity;
  14. import lombok.extern.slf4j.Slf4j;
  15. import oracle.jdbc.OracleConnection;
  16. import java.sql.*;
  17. import java.util.ArrayList;
  18. import java.util.List;
  19. /**
  20. * DB工具类
  21. *
  22. * @author Toby javatangbin@163.com
  23. */
  24. @Slf4j
  25. public class DbUtils {
  26. private static final int CONNECTION_TIMEOUTS_SECONDS = 6;
  27. /**
  28. * 获得数据库连接
  29. *
  30. * @param info
  31. * @return
  32. * @throws ClassNotFoundException
  33. * @throws SQLException
  34. */
  35. public static Connection getConnection(DataSourceInfo info) throws ClassNotFoundException, SQLException {
  36. DriverManager.setLoginTimeout(CONNECTION_TIMEOUTS_SECONDS);
  37. Class.forName(info.getDbType().getDriverClass());
  38. Connection connection = DriverManager.getConnection(info.getConnUrl(), info.getUsername(), info.getPassword());
  39. if(info.getDbType() == DbType.Oracle){
  40. ((OracleConnection)connection).setRemarksReporting(true);
  41. }
  42. return connection;
  43. }
  44. /**
  45. * 获取数据库表信息
  46. */
  47. public static TableInfoEntity getTablesInfo(DataSourceInfo info, String tableName) {
  48. try {
  49. AbstractQuery dbQuery = info.getDbQuery();
  50. //查询数据
  51. PreparedStatement preparedStatement = info.getConnection().prepareStatement(dbQuery.tablesSql(tableName));
  52. ResultSet rs = preparedStatement.executeQuery();
  53. if (rs.next()) {
  54. TableInfoEntity tableInfo = new TableInfoEntity();
  55. tableInfo.setTableName(rs.getString(dbQuery.tableName()));
  56. tableInfo.setClassName(GenUtils.columnToJava(tableInfo.getTableName()));
  57. tableInfo.setTableComment(rs.getString(dbQuery.tableComment()));
  58. tableInfo.setDatasourceId(info.getId());
  59. return tableInfo;
  60. }
  61. }catch (Exception e){
  62. e.printStackTrace();
  63. }
  64. return null;
  65. }
  66. /**
  67. * 获取所有的数据库表
  68. */
  69. public static List<TableInfoEntity> getTablesInfoList(DataSourceInfo info) {
  70. List<TableInfoEntity> tableInfoList = new ArrayList<>();
  71. try {
  72. AbstractQuery dbQuery = info.getDbQuery();
  73. //查询数据
  74. PreparedStatement preparedStatement = info.getConnection().prepareStatement(dbQuery.tablesSql(null));
  75. ResultSet rs = preparedStatement.executeQuery();
  76. while (rs.next()) {
  77. TableInfoEntity tableInfo = new TableInfoEntity();
  78. tableInfo.setTableName(rs.getString(dbQuery.tableName()));
  79. tableInfo.setClassName(GenUtils.columnToJava(tableInfo.getTableName()));
  80. tableInfo.setTableComment(rs.getString(dbQuery.tableComment()));
  81. tableInfo.setDatasourceId(info.getId());
  82. tableInfoList.add(tableInfo);
  83. }
  84. info.getConnection().close();
  85. }catch (Exception e){
  86. e.printStackTrace();
  87. }
  88. return tableInfoList;
  89. }
  90. /**
  91. * 获取表的列属性
  92. *
  93. * @param info 数据库配置文件
  94. * @param tableName 表名
  95. */
  96. public static List<TableFieldEntity> getTableColumns(DataSourceInfo info, Long tableId, String tableName) {
  97. List<TableFieldEntity> tableFieldList = new ArrayList<>();
  98. try {
  99. AbstractQuery dbQuery = info.getDbQuery();
  100. String tableFieldsSql = dbQuery.tableFieldsSql();
  101. if (info.getDbType() == DbType.Oracle) {
  102. DatabaseMetaData md = info.getConnection().getMetaData();
  103. tableFieldsSql = String.format(tableFieldsSql.replace("#schema", md.getUserName()), tableName);
  104. } else {
  105. tableFieldsSql = String.format(tableFieldsSql, tableName);
  106. }
  107. PreparedStatement preparedStatement = info.getConnection().prepareStatement(tableFieldsSql);
  108. ResultSet rs = preparedStatement.executeQuery();
  109. while (rs.next()) {
  110. TableFieldEntity field = new TableFieldEntity();
  111. field.setTableId(tableId);
  112. field.setTableName(tableName);
  113. field.setColumnName(rs.getString(dbQuery.fieldName()));
  114. String columnType = rs.getString(dbQuery.fieldType());
  115. if(columnType.indexOf(" ") != -1){
  116. columnType = columnType.substring(0, columnType.indexOf(" "));
  117. }
  118. field.setColumnType(columnType);
  119. field.setColumnComment(rs.getString(dbQuery.fieldComment()));
  120. String key = rs.getString(dbQuery.fieldKey());
  121. field.setPk(StringUtils.isNotBlank(key) && "PRI".equals(key.toUpperCase()));
  122. tableFieldList.add(field);
  123. }
  124. }catch (Exception e){
  125. e.printStackTrace();
  126. }
  127. return tableFieldList;
  128. }
  129. }