From 5b678c3ee14d92547ffdf16663ab62416f38d9b0 Mon Sep 17 00:00:00 2001 From: guoshengxiong <1923636941@qq.com> Date: Sat, 30 Aug 2025 18:12:22 +0800 Subject: [PATCH] =?UTF-8?q?bug=E4=BF=AE=E5=A4=8D=E5=92=8Cmysql=E6=89=B9?= =?UTF-8?q?=E9=87=8F=E6=9B=BF=E6=8D=A2=E5=80=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../RiskListSourceDataCenterController.java | 4 +- .../XzSecurityDangerItemRecordController.java | 3 + .../xml/XzSecurityDangerItemRecordMapper.xml | 8 +- .../com/zhgd/xmgl/util/MysqlUrlReplacer.java | 138 ++++++++++++++++++ 4 files changed, 148 insertions(+), 5 deletions(-) create mode 100644 src/main/java/com/zhgd/xmgl/util/MysqlUrlReplacer.java diff --git a/src/main/java/com/zhgd/xmgl/modules/risk/controller/RiskListSourceDataCenterController.java b/src/main/java/com/zhgd/xmgl/modules/risk/controller/RiskListSourceDataCenterController.java index f68bc6b2c..1773ac841 100644 --- a/src/main/java/com/zhgd/xmgl/modules/risk/controller/RiskListSourceDataCenterController.java +++ b/src/main/java/com/zhgd/xmgl/modules/risk/controller/RiskListSourceDataCenterController.java @@ -175,8 +175,8 @@ public class RiskListSourceDataCenterController { if (CollUtil.isEmpty(sourceVos)) { return Result.ok(); } - Date begin = DateUtil.parseDateTime(MapUtils.getString(param, "effectiveTimeEnd_begin")); - Date end = DateUtil.parseDateTime(MapUtils.getString(param, "effectiveTimeBegin_end")); + Date begin = DateUtil.parseDate(MapUtils.getString(param, "effectiveTimeEnd_begin")); + Date end = DateUtil.parseDate(MapUtils.getString(param, "effectiveTimeBegin_end")); List checkNumBos = getSourceCheckNumBo(sourceVos); //1. 计算有效期内的source的应排查、(未施工+已排查)数量 for (RiskListSourceVo sourceVo : sourceVos) { diff --git a/src/main/java/com/zhgd/xmgl/modules/xz/security/controller/XzSecurityDangerItemRecordController.java b/src/main/java/com/zhgd/xmgl/modules/xz/security/controller/XzSecurityDangerItemRecordController.java index b5c7f4928..2936e063a 100644 --- a/src/main/java/com/zhgd/xmgl/modules/xz/security/controller/XzSecurityDangerItemRecordController.java +++ b/src/main/java/com/zhgd/xmgl/modules/xz/security/controller/XzSecurityDangerItemRecordController.java @@ -170,6 +170,9 @@ public class XzSecurityDangerItemRecordController { } @ApiOperation(value = "查询我使用过的最近三天的三条数据", notes = "查询我使用过的最近三天的三条数据", httpMethod = "GET") + @ApiImplicitParams({ + @ApiImplicitParam(name = "projectSn", value = "项目唯一标识", paramType = "body", required = true, dataType = "String"), + }) @GetMapping(value = "/getNewestUseRecords") public Result> getNewestUseRecords(@ApiIgnore @RequestParam HashMap param) { List list = dangerItemRecordService.getNewestUseRecords(param); diff --git a/src/main/java/com/zhgd/xmgl/modules/xz/security/mapper/xml/XzSecurityDangerItemRecordMapper.xml b/src/main/java/com/zhgd/xmgl/modules/xz/security/mapper/xml/XzSecurityDangerItemRecordMapper.xml index 9cf05ca77..bcae38780 100644 --- a/src/main/java/com/zhgd/xmgl/modules/xz/security/mapper/xml/XzSecurityDangerItemRecordMapper.xml +++ b/src/main/java/com/zhgd/xmgl/modules/xz/security/mapper/xml/XzSecurityDangerItemRecordMapper.xml @@ -40,12 +40,14 @@ diff --git a/src/main/java/com/zhgd/xmgl/util/MysqlUrlReplacer.java b/src/main/java/com/zhgd/xmgl/util/MysqlUrlReplacer.java new file mode 100644 index 000000000..bb04676ea --- /dev/null +++ b/src/main/java/com/zhgd/xmgl/util/MysqlUrlReplacer.java @@ -0,0 +1,138 @@ +package com.zhgd.xmgl.util; + +import cn.hutool.db.Db; +import cn.hutool.db.Entity; +import cn.hutool.db.ds.simple.SimpleDataSource; + +import javax.sql.DataSource; +import java.sql.SQLException; +import java.util.List; + +public class MysqlUrlReplacer { + + private DataSource dataSource; + + public MysqlUrlReplacer(String url, String username, String password) { + this.dataSource = new SimpleDataSource(url, username, password); + } + + /** + * 批量替换所有表中的HTTP URL + */ + public void batchReplaceUrls(String oldDomain, String newDomain) throws SQLException { + // 获取所有表名 + List tables = Db.use(dataSource).query( + "SELECT table_name FROM information_schema.tables WHERE table_schema = DATABASE()" + ); + + for (Entity table : tables) { + String tableName = table.getStr("table_name"); + processTable(tableName, oldDomain, newDomain); + } + } + + /** + * 处理单个表 + */ + private void processTable(String tableName, String oldDomain, String newDomain) throws SQLException { + // 获取表的字符串类型字段 + List columns = Db.use(dataSource).query( + "SELECT column_name FROM information_schema.columns " + + "WHERE table_schema = DATABASE() AND table_name = ? " + + "AND data_type IN ('varchar', 'text', 'longtext', 'mediumtext', 'char')", + tableName + ); + + for (Entity column : columns) { + String columnName = column.getStr("column_name"); + replaceColumnData(tableName, columnName, oldDomain, newDomain); + } + } + + /** + * 替换单个字段的数据 + */ + private void replaceColumnData(String tableName, String columnName, + String oldDomain, String newDomain) throws SQLException { + String sql = String.format( + "UPDATE %s SET %s = REPLACE(%s, ?, ?) WHERE %s LIKE ?", + tableName, columnName, columnName, columnName + ); + + int affectedRows = Db.use(dataSource).execute( + sql, + oldDomain, + newDomain, + "%" + oldDomain + "%" + ); + + if (affectedRows > 0) { + System.out.printf("表 %s 的字段 %s 更新了 %d 行数据%n", + tableName, columnName, affectedRows); + } + } + + /** + * 安全模式:先查询再更新(推荐用于生产环境) + */ + public void safeBatchReplaceUrls(String oldDomain, String newDomain) throws SQLException { + List tables = Db.use(dataSource).query( + "SELECT table_name FROM information_schema.tables WHERE table_schema = DATABASE()" + ); + + for (Entity table : tables) { + String tableName = table.getStr("table_name"); + safeProcessTable(tableName, oldDomain, newDomain); + } + } + + private void safeProcessTable(String tableName, String oldDomain, String newDomain) throws SQLException { + List columns = Db.use(dataSource).query( + "SELECT column_name FROM information_schema.columns " + + "WHERE table_schema = DATABASE() AND table_name = ? " + + "AND data_type IN ('varchar', 'text', 'longtext', 'mediumtext', 'char')", + tableName + ); + + for (Entity column : columns) { + String columnName = column.getStr("column_name"); + // 先查询受影响的数据 + List affectedData = Db.use(dataSource).query( + String.format("SELECT COUNT(*) as count FROM %s WHERE %s LIKE ?", + tableName, columnName), + "%" + oldDomain + "%" + ); + + long count = affectedData.get(0).getLong("count"); + if (count > 0) { + System.out.printf("表 %s 字段 %s 有 %d 条数据需要更新%n", + tableName, columnName, count); + + // 确认后再更新 + replaceColumnData(tableName, columnName, oldDomain, newDomain); + } + } + } + + + public static void main(String[] args) throws SQLException { + // 使用方法2 + MysqlUrlReplacer replacer = new MysqlUrlReplacer( + "jdbc:mysql://localhost:3306/uface", + "root", + "root" + ); + + // 批量替换 +// replacer.batchReplaceUrls( +// "http://jxj.zhgdyun.com:21000", +// "http://new.domain.com:8080" +// ); + + // 或者安全模式批量替换 + replacer.safeBatchReplaceUrls( + "http://jxj.zhgdyun.com:21000", + "http://new.domain.com:8080" + ); + } +}