From 65f2695963e9a03339e361d7f137a050e28265d4 Mon Sep 17 00:00:00 2001 From: mcy Date: Thu, 29 Nov 2018 15:39:08 +0800 Subject: [PATCH] =?UTF-8?q?rdb=20=E5=85=B3=E9=94=AE=E5=AD=97=E8=BD=AC?= =?UTF-8?q?=E8=AF=91=E7=AC=A6=E8=BF=87=E6=BB=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../canal/client/adapter/support/Util.java | 19 +++++++++++++++++++ .../adapter/rdb/service/RdbSyncService.java | 17 ++++++++++------- .../client/adapter/rdb/support/SyncUtil.java | 6 +++++- 3 files changed, 34 insertions(+), 8 deletions(-) diff --git a/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/support/Util.java b/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/support/Util.java index e3c8032c..919974a1 100644 --- a/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/support/Util.java +++ b/client-adapter/common/src/main/java/com/alibaba/otter/canal/client/adapter/support/Util.java @@ -117,4 +117,23 @@ public class Util { return file; } + + public static String cleanColumn(String column) { + if (column == null) { + return null; + } + if (column.contains("`")) { + column = column.replaceAll("`", ""); + } + + if (column.contains("'")) { + column = column.replaceAll("'", ""); + } + + if (column.contains("\"")) { + column = column.replaceAll("\"", ""); + } + + return column; + } } diff --git a/client-adapter/rdb/src/main/java/com/alibaba/otter/canal/client/adapter/rdb/service/RdbSyncService.java b/client-adapter/rdb/src/main/java/com/alibaba/otter/canal/client/adapter/rdb/service/RdbSyncService.java index 02e87cdf..ef80bb2f 100644 --- a/client-adapter/rdb/src/main/java/com/alibaba/otter/canal/client/adapter/rdb/service/RdbSyncService.java +++ b/client-adapter/rdb/src/main/java/com/alibaba/otter/canal/client/adapter/rdb/service/RdbSyncService.java @@ -78,6 +78,9 @@ public class RdbSyncService { Map configMap = mappingConfigCache .get(destination + "." + database + "." + table); + if (configMap == null) { + continue; + } for (MappingConfig config : configMap.values()) { if (config.getConcurrent()) { @@ -177,13 +180,13 @@ public class RdbSyncService { List> values = new ArrayList<>(); for (Map.Entry entry : columnsMap.entrySet()) { - String targetClolumnName = entry.getKey(); + String targetColumnName = entry.getKey(); String srcColumnName = entry.getValue(); if (srcColumnName == null) { - srcColumnName = targetClolumnName; + srcColumnName = Util.cleanColumn(targetColumnName); } - Integer type = ctype.get(targetClolumnName.toLowerCase()); + Integer type = ctype.get(Util.cleanColumn(targetColumnName).toLowerCase()); Object value = data.get(srcColumnName); @@ -238,7 +241,7 @@ public class RdbSyncService { for (String targetColumnName : targetColumnNames) { updateSql.append(targetColumnName).append("=?, "); - Integer type = ctype.get(targetColumnName.toLowerCase()); + Integer type = ctype.get(Util.cleanColumn(targetColumnName).toLowerCase()); BatchExecutor.setValue(values, type, data.get(srcColumnName)); } } @@ -344,10 +347,10 @@ public class RdbSyncService { String targetColumnName = entry.getKey(); String srcColumnName = entry.getValue(); if (srcColumnName == null) { - srcColumnName = targetColumnName; + srcColumnName = Util.cleanColumn(targetColumnName); } sql.append(targetColumnName).append("=? AND "); - Integer type = ctype.get(targetColumnName.toLowerCase()); + Integer type = ctype.get(Util.cleanColumn(targetColumnName).toLowerCase()); // 如果有修改主键的情况 if (o != null && o.containsKey(srcColumnName)) { BatchExecutor.setValue(values, type, o.get(srcColumnName)); @@ -384,7 +387,7 @@ public class RdbSyncService { String targetColumnName = entry.getKey(); String srcColumnName = entry.getValue(); if (srcColumnName == null) { - srcColumnName = targetColumnName; + srcColumnName = Util.cleanColumn(targetColumnName); } Object value; if (o != null && o.containsKey(srcColumnName)) { diff --git a/client-adapter/rdb/src/main/java/com/alibaba/otter/canal/client/adapter/rdb/support/SyncUtil.java b/client-adapter/rdb/src/main/java/com/alibaba/otter/canal/client/adapter/rdb/support/SyncUtil.java index 1b2e8e0a..6be7ef3f 100644 --- a/client-adapter/rdb/src/main/java/com/alibaba/otter/canal/client/adapter/rdb/support/SyncUtil.java +++ b/client-adapter/rdb/src/main/java/com/alibaba/otter/canal/client/adapter/rdb/support/SyncUtil.java @@ -74,6 +74,8 @@ public class SyncUtil { case Types.LONGVARCHAR: if (value instanceof String) { pstmt.setString(i, (String) value); + } else if (value == null) { + pstmt.setNull(i, type); } else { pstmt.setString(i, value.toString()); } @@ -140,8 +142,10 @@ public class SyncUtil { pstmt.setBigDecimal(i, new BigDecimal((float) value)); } else if (value instanceof Double) { pstmt.setBigDecimal(i, new BigDecimal((double) value)); - } else { + } else if (value != null) { pstmt.setBigDecimal(i, new BigDecimal(value.toString())); + } else { + pstmt.setNull(i, type); } break; case Types.REAL: