package org.jeecg.modules.iot.depository; import com.baomidou.dynamic.datasource.annotation.DS; import org.springframework.stereotype.Service; import java.sql.*; import java.util.List; /** * @author cuikaidong * @date 2025/5/6 */ @Service public class MysqlDataWriter { // 创建MysqlTable表 public static void createMysqlTable(String tableName, String... columns) { if (DbConfig.DATABASE.equals("sqlserver")) { // 调用mysql创建表方法 createSqlserverTable(tableName, columns); } else if (DbConfig.DATABASE.equals("mysql")) { String sql = String.format("CREATE TABLE IF NOT EXISTS %s (%s)", tableName, String.join(", ", columns)); try (Connection conn = DriverManager.getConnection(DbConfig.URL, DbConfig.USER, DbConfig.PASSWORD); Statement stmt = conn.createStatement()) { stmt.executeUpdate(sql); System.out.println("表创建成功: " + tableName); } catch (SQLException e) { e.printStackTrace(); } } } // 写入数据 public static void insertMysqlData(String tableName, String[] columns, Object[] values) { if (columns.length != values.length) { throw new IllegalArgumentException("字段与值的数量不匹配"); } String placeholders = String.join(", ", java.util.Collections.nCopies(columns.length, "?")); String columnNames = String.join(", ", columns); String sql = String.format("INSERT INTO %s (%s) VALUES (%s)", tableName, columnNames, placeholders); try (Connection conn = DriverManager.getConnection(DbConfig.URL, DbConfig.USER, DbConfig.PASSWORD); PreparedStatement pstmt = conn.prepareStatement(sql)) { for (int i = 0; i < values.length; i++) { pstmt.setObject(i + 1, values[i]); } pstmt.executeUpdate(); // System.out.println("数据写入成功"); } catch (SQLException e) { e.printStackTrace(); } } // 增加字段 在 类中添加以下方法 public static void addMysqlColumn(String tableName, String columnDefinition, String columnName) { if (isColumnExists(tableName, columnName)) { System.out.println("字段已存在,无需添加: " + columnName); return; } String sql = String.format("ALTER TABLE %s ADD COLUMN %s", tableName, columnDefinition); try (Connection conn = DriverManager.getConnection(DbConfig.URL, DbConfig.USER, DbConfig.PASSWORD); Statement stmt = conn.createStatement()) { stmt.executeUpdate(sql); System.out.println("字段添加成功: " + columnDefinition); } catch (SQLException e) { e.printStackTrace(); } } // 辅助方法:检查表中是否已存在指定字段 private static boolean isColumnExists(String tableName, String columnName) { String sql = String.format( "SELECT COUNT(*) FROM information_schema.columns " + "WHERE table_name = '%s' AND column_name = '%s'", tableName, columnName ); try (Connection conn = DriverManager.getConnection(DbConfig.URL, DbConfig.USER, DbConfig.PASSWORD); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql)) { if (rs.next()) { return rs.getInt(1) > 0; } } catch (SQLException e) { e.printStackTrace(); } return false; } // 批量导入字段 public static void addMysqlColumns(String tableName, List columnDefinitions, List columnNames) { if (columnDefinitions.size() != columnNames.size()) { throw new IllegalArgumentException("字段定义和字段名的数量必须一致"); } StringBuilder sqlBuilder = new StringBuilder("ALTER TABLE ").append(tableName).append(" ADD COLUMN ( "); for (int i = 0; i < columnDefinitions.size(); i++) { String columnName = columnNames.get(i); if (batchIsColumnExists(tableName, columnName)) { System.out.println("字段已存在,无需添加: " + columnName); continue; } String columnDefinition = columnDefinitions.get(i); if (i > 0) { sqlBuilder.append(", "); } sqlBuilder.append(columnDefinition); } sqlBuilder.append(" ) "); String sql = sqlBuilder.toString(); if (sql.endsWith(" ADD COLUMN ( )")) { System.out.println("没有需要添加的新字段"); return; } try (Connection conn = DriverManager.getConnection(DbConfig.URL, DbConfig.USER, DbConfig.PASSWORD); Statement stmt = conn.createStatement()) { stmt.executeUpdate(sql); System.out.println("字段批量添加成功"); } catch (SQLException e) { e.printStackTrace(); } } // 验证字段是否重复 private static boolean batchIsColumnExists(String tableName, String columnName) { String sql = String.format( "SELECT COUNT(*) FROM information_schema.columns " + "WHERE TABLE_SCHEMA = 'lx_iot' AND table_name = '%s' AND column_name = '%s'", tableName, columnName ); try (Connection conn = DriverManager.getConnection(DbConfig.URL, DbConfig.USER, DbConfig.PASSWORD); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql)) { if (rs.next()) { return rs.getInt(1) > 0; } } catch (SQLException e) { e.printStackTrace(); } return false; } /************************************************************ sqlserver版本 ***************************************/ // 创建sqlserver表 public static void createSqlserverTable(String tableName, String... columns) { String schemaName = "dbo"; // 创建表的 SQL(如果不存在) String tableSql = String.format( "IF NOT EXISTS (SELECT * FROM sys.tables WHERE name = '%s' AND schema_id = SCHEMA_ID('%s')) " + "CREATE TABLE [%s].[%s] (%s)", tableName, schemaName, schemaName, tableName, String.join(", ", columns) ); // String sql = String.format("CREATE TABLE IF NOT EXISTS %s (%s)", tableName, String.join(", ", columns)); try (Connection conn = DriverManager.getConnection(DbConfig.URL, DbConfig.USER, DbConfig.PASSWORD); Statement stmt = conn.createStatement()) { stmt.executeUpdate(tableSql); System.out.println("表创建成功: " + tableName); } catch (SQLException e) { e.printStackTrace(); } } // 批量导入字段(SQL Server 版本) public static void addSqlserverColumns(String schemaName, String tableName, List columnDefinitions, List columnNames) { if (columnDefinitions.size() != columnNames.size()) { throw new IllegalArgumentException("字段定义和字段名的数量必须一致"); } // 转义表名中的方括号,防止SQL注入 tableName = tableName.replace("[", "[[").replace("]", "]]"); StringBuilder sqlBuilder = new StringBuilder(); sqlBuilder.append("ALTER TABLE [").append(schemaName).append("].[") .append(tableName).append("] ADD "); boolean hasNewColumns = false; for (int i = 0; i < columnDefinitions.size(); i++) { String columnName = columnNames.get(i); if (sqlServeBatchIsColumnExists(schemaName, tableName, columnName)) { System.out.println("字段已存在,无需添加: " + columnName); continue; } String columnDefinition = columnDefinitions.get(i); if (hasNewColumns) { sqlBuilder.append(", "); } sqlBuilder.append("[").append(columnName.replace("[", "[[").replace("]", "]]")).append("] ") .append(columnDefinition); hasNewColumns = true; } String sql = sqlBuilder.toString(); if (!hasNewColumns) { System.out.println("没有需要添加的新字段"); return; } try (Connection conn = DriverManager.getConnection(DbConfig.URL, DbConfig.USER, DbConfig.PASSWORD); Statement stmt = conn.createStatement()) { System.out.println("执行SQL: " + sql); // 调试用 stmt.executeUpdate(sql); System.out.println("字段批量添加成功"); } catch (SQLException e) { System.err.println("批量添加字段失败: " + sql); e.printStackTrace(); } } /** * 验证字段是否存在(SQL Server 版本) */ private static boolean sqlServeBatchIsColumnExists(String schemaName, String tableName, String columnName) { String sql = "SELECT COUNT(*) FROM sys.columns " + "WHERE object_id = OBJECT_ID('[" + schemaName + "].[" + tableName + "]') " + "AND name = @columnName"; try (Connection conn = DriverManager.getConnection(DbConfig.URL, DbConfig.USER, DbConfig.PASSWORD); PreparedStatement pstmt = conn.prepareStatement(sql)) { pstmt.setString(1, columnName); try (ResultSet rs = pstmt.executeQuery()) { if (rs.next()) { return rs.getInt(1) > 0; } } } catch (SQLException e) { System.err.println("检查字段存在性失败: " + sql); e.printStackTrace(); } return false; } }