cuikaidong
2025-06-12 44e283b774bb1168d0c17dfe5070a1ca8e2274cd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
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<String> columnDefinitions, List<String> 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<String> columnDefinitions, List<String> 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;
    }
}