diff --git a/src/main/java/space/caoshd/otone/builder/TableBuilder.java b/src/main/java/space/caoshd/otone/builder/TableBuilder.java new file mode 100644 index 0000000..487db7e --- /dev/null +++ b/src/main/java/space/caoshd/otone/builder/TableBuilder.java @@ -0,0 +1,73 @@ +package space.caoshd.otone.builder; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import space.caoshd.otone.entity.TableInfo; +import space.caoshd.otone.tool.PropertyTools; +import space.caoshd.otone.util.ConfigConstants; +import space.caoshd.otone.util.DatabaseUtils; +import space.caoshd.otone.util.PropertiesConstants; +import space.caoshd.otone.util.SqlConstants; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; +import java.util.Objects; + +public class TableBuilder { + + private static final Logger LOGGER = LoggerFactory.getLogger(TableBuilder.class); + + public static List loadTableInfo() { + List result = new ArrayList<>(); + PropertyTools configProperties = + new PropertyTools(PropertiesConstants.CONFIG_PROPERTIES_PATH); + List schemaNames = configProperties.getStrings(ConfigConstants.SCHEMA_NAMES); + if (schemaNames.isEmpty()) { + // TODO LOAD CURRENT SCHEMA + } else { + for (String schemaName : schemaNames) { + result.addAll(loadTableInfo(schemaName)); + } + } + return result; + } + + public static List loadTableInfo(String schema) { + List result = new ArrayList<>(); + PropertyTools configProperties = + new PropertyTools(PropertiesConstants.CONFIG_PROPERTIES_PATH); + List tables = configProperties.getStrings(ConfigConstants.TABLE_NAMES); + if (tables.isEmpty()) { + // TODO LOAD ALL TABLE + } else { + for (String table : tables) { + TableInfo tableInfo = loadTableInfo(schema, table); + if (Objects.nonNull(tableInfo)) { + result.add(tableInfo); + } + } + } + return result; + } + + public static TableInfo loadTableInfo(String schemaName, String tableName) { + PropertyTools sqlProperties = new PropertyTools(PropertiesConstants.MYSQL_PROPERTIES_PATH); + String sql = sqlProperties.getString(SqlConstants.TABLE_DETAIL_SQL_SCHEMA_TABLE); + List params = Arrays.asList(schemaName, tableName); + Map table = DatabaseUtils.one(sql, params); + if (Objects.isNull(table)) { + LOGGER.warn("table: [{}] not exists", tableName); + return null; + } + TableInfo result = new TableInfo(); + result.setTableName(tableName); + String tableCommentLabel = + sqlProperties.getString(SqlConstants.TABLE_DETAIL_LABEL_TABLE_COMMENT); + String comment = table.get(tableCommentLabel); + result.setComment(comment); + return result; + } + +} diff --git a/src/main/java/space/caoshd/otone/entity/FieldInfo.java b/src/main/java/space/caoshd/otone/entity/FieldInfo.java new file mode 100644 index 0000000..b12d375 --- /dev/null +++ b/src/main/java/space/caoshd/otone/entity/FieldInfo.java @@ -0,0 +1,64 @@ +package space.caoshd.otone.entity; + +public class FieldInfo { + + private String fieldName; + + private String propertyName; + + private String sqlType; + + private String javaType; + + private String comment; + + private Boolean autoIncrement; + + public String getFieldName() { + return fieldName; + } + + public void setFieldName(String fieldName) { + this.fieldName = fieldName; + } + + public String getPropertyName() { + return propertyName; + } + + public void setPropertyName(String propertyName) { + this.propertyName = propertyName; + } + + public String getSqlType() { + return sqlType; + } + + public void setSqlType(String sqlType) { + this.sqlType = sqlType; + } + + public String getJavaType() { + return javaType; + } + + public void setJavaType(String javaType) { + this.javaType = javaType; + } + + public String getComment() { + return comment; + } + + public void setComment(String comment) { + this.comment = comment; + } + + public Boolean getAutoIncrement() { + return autoIncrement; + } + + public void setAutoIncrement(Boolean autoIncrement) { + this.autoIncrement = autoIncrement; + } +} diff --git a/src/main/java/space/caoshd/otone/util/DatabaseUtils.java b/src/main/java/space/caoshd/otone/util/DatabaseUtils.java new file mode 100644 index 0000000..8b4dcb3 --- /dev/null +++ b/src/main/java/space/caoshd/otone/util/DatabaseUtils.java @@ -0,0 +1,88 @@ +package space.caoshd.otone.util; + +import space.caoshd.otone.tool.PropertyTools; + +import java.io.InputStream; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.ResultSetMetaData; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +public class DatabaseUtils { + private DatabaseUtils() {} + + + public static Connection getConnection() { + try { + InputStream datasourcePropertiesStream = ResourceUtils.getClassPathFileStream( + PropertiesConstants.DATASOURCE_PROPERTIES_PATH); + PropertyTools propertyTools = new PropertyTools(datasourcePropertiesStream); + String username = propertyTools.getString("username"); + String password = propertyTools.getString("password"); + String driverClassName = propertyTools.getString("driver-class-name"); + String url = propertyTools.getString("url"); + Class.forName(driverClassName); + return DriverManager.getConnection(url, username, password); + } catch (Exception e) { + throw new RuntimeException(e); + } + + } + + public static List> list(String sql, List params) { + try (Connection connection = getConnection()) { + List> result = new ArrayList<>(); + PreparedStatement preparedStatement = connection.prepareStatement(sql); + for (int i = 0; i < params.size(); i++) { + preparedStatement.setObject(i + 1, params.get(i)); + } + ResultSet resultSet = preparedStatement.executeQuery(); + ResultSetMetaData metaData = resultSet.getMetaData(); + int columnCount = metaData.getColumnCount(); + while (resultSet.next()) { + for (int i = 1; i <= columnCount; i++) { + Map row = new HashMap<>(); + String columnLabel = metaData.getColumnLabel(i); + String columnValue = resultSet.getString(i); + row.put(columnLabel.toUpperCase(), columnValue); + result.add(row); + } + } + return result; + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + public static Map one(String sql, List params) { + try (Connection connection = getConnection()) { + PreparedStatement preparedStatement = connection.prepareStatement(sql); + for (int i = 0; i < params.size(); i++) { + preparedStatement.setObject(i + 1, params.get(i)); + } + ResultSet resultSet = preparedStatement.executeQuery(); + + if (!resultSet.next()) { + return null; + } + ResultSetMetaData metaData = resultSet.getMetaData(); + int columnCount = metaData.getColumnCount(); + Map result = new HashMap<>(); + + for (int i = 1; i <= columnCount; i++) { + String columnLabel = metaData.getColumnLabel(i); + String columnValue = resultSet.getString(i); + result.put(columnLabel.toUpperCase(), columnValue); + } + + return result; + } catch (Exception e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/main/java/space/caoshd/otone/util/SqlConstants.java b/src/main/java/space/caoshd/otone/util/SqlConstants.java new file mode 100644 index 0000000..ea0ac4c --- /dev/null +++ b/src/main/java/space/caoshd/otone/util/SqlConstants.java @@ -0,0 +1,18 @@ +package space.caoshd.otone.util; + +public class SqlConstants { + + private SqlConstants() {} + + public static final String TABLE_DETAIL_SQL = "table.detail.sql"; + + public static final String TABLE_DETAIL_SQL_SCHEMA = "table.detail.sql.schema"; + + public static final String TABLE_DETAIL_SQL_SCHEMA_TABLE = "table.detail.sql.schema.table"; + + public static final String TABLE_DETAIL_LABEL_TABLE_NAME = "table.detail.label.table-name"; + + public static final String TABLE_DETAIL_LABEL_TABLE_COMMENT = + "table.detail.label.table-comment"; + +} diff --git a/src/test/java/space/caoshd/otone/builder/TableBuilderTest.java b/src/test/java/space/caoshd/otone/builder/TableBuilderTest.java new file mode 100644 index 0000000..126d49c --- /dev/null +++ b/src/test/java/space/caoshd/otone/builder/TableBuilderTest.java @@ -0,0 +1,18 @@ +package space.caoshd.otone.builder; + +import org.junit.jupiter.api.Test; +import space.caoshd.otone.entity.TableInfo; + +import java.util.List; + +import static org.junit.jupiter.api.Assertions.*; + +class TableBuilderTest { + + @Test + void loadTableInfo() { + List tableInfos = + TableBuilder.loadTableInfo(); + System.out.println(tableInfos); + } +} \ No newline at end of file