From fc47a705ab33a976f7a116c0ce6e236bb5057fa5 Mon Sep 17 00:00:00 2001
From: zhongrj <646384940@qq.com>
Date: Fri, 23 Feb 2024 17:19:19 +0800
Subject: [PATCH] binlog 数据同步完善(新增,修改,删除同步)
---
src/main/java/org/springblade/binlog/listener/TourBinLogListener.java | 86 +++++++++++++++++++++++++++++++++++--------
1 files changed, 70 insertions(+), 16 deletions(-)
diff --git a/src/main/java/org/springblade/binlog/listener/TourBinLogListener.java b/src/main/java/org/springblade/binlog/listener/TourBinLogListener.java
index b073fef..28139c3 100644
--- a/src/main/java/org/springblade/binlog/listener/TourBinLogListener.java
+++ b/src/main/java/org/springblade/binlog/listener/TourBinLogListener.java
@@ -1,8 +1,8 @@
package org.springblade.binlog.listener;
-
import cn.hutool.core.collection.CollectionUtil;
import lombok.extern.slf4j.Slf4j;
+import org.springblade.binlog.client.MysqlClient;
import org.springblade.binlog.config.DataSourceConfig;
import org.springblade.binlog.constant.BinLogConstants;
import org.springblade.binlog.util.BinLogUtils;
@@ -16,6 +16,7 @@
import javax.annotation.Resource;
import java.io.Serializable;
import java.util.ArrayList;
+import java.util.Date;
import java.util.List;
import java.util.Map;
@@ -90,28 +91,30 @@
private void saveHandle(BinLogItem item) {
String tableName = item.getDbTable().split("-")[1];
Map<String, Serializable> data = item.getAfter();
- log.info(tableName);
Map<String, DataProperty> dataProperty = item.getDataProperty();
-
+ // 创建更新对象
List<String> keyList = new ArrayList<>();
List<String> valueList = new ArrayList<>();
+ // 遍历匹配数据
dataProperty.forEach((key,value)->{
- log.info(key);
- log.info(value.dataType);
+// log.info("数据类型 " + value.dataType);
if(null!=data.get(key)) {
- log.info(data.get(key).toString());
- valueList.add(data.get(key).toString());
- }else {
- if (value.dataType.equals("int") ||
- value.dataType.equals("bigint") ||
- value.dataType.equals("datetime") ||
- value.dataType.equals("date")){
- valueList.add(null);
- }else{
- valueList.add("");
+ keyList.add(key);
+ if (value.dataType.equals("varchar") ||
+ value.getDataType().equals("char")) {
+ valueList.add("'" + data.get(key).toString() + "'");
+ }else if(value.dataType.equals("text") ||
+ value.dataType.equals("mediumtext")) {
+ byte[] bytes = (byte[])data.get(key);
+ valueList.add("'" + new String(bytes) + "'");
+ }else if(value.dataType.equals("date") ||
+ value.getDataType().equals("datetime")) {
+ Long time = Long.parseLong(data.get(key).toString());
+ valueList.add("'" + BinLogUtils.getDateFormatStr(new Date(time)) + "'");
+ }else {
+ valueList.add(data.get(key).toString());
}
}
- keyList.add(key);
});
// 拼接sql
StringBuilder sqlBuilder = new StringBuilder();
@@ -124,6 +127,8 @@
.append(String.join(",",valueList))
.append(");");
log.info("sql: " + sqlBuilder.toString());
+ // 同步到其他数据库
+ MysqlClient.insert(sqlBuilder.toString());
}
/**
@@ -131,6 +136,43 @@
* @param item
*/
private void updateHandle(BinLogItem item) {
+ String tableName = item.getDbTable().split("-")[1];
+ Map<String, Serializable> data = item.getAfter();
+ Map<String, DataProperty> dataProperty = item.getDataProperty();
+ // 创建更新对象
+ List<String> updateList = new ArrayList<>();
+ // 遍历匹配数据
+ dataProperty.forEach((key,value)->{
+// log.info("数据类型 " + value.dataType);
+ if(null!=data.get(key) && !key.equals("id")) {
+ if (value.dataType.equals("varchar") ||
+ value.getDataType().equals("char")) {
+ updateList.add(key + " = '" + data.get(key).toString() + "'");
+ }else if(value.dataType.equals("text") ||
+ value.dataType.equals("mediumtext")) {
+ byte[] bytes = (byte[])data.get(key);
+ updateList.add(key + " = '" + new String(bytes) + "'");
+ }else if(value.dataType.equals("date") ||
+ value.getDataType().equals("datetime")) {
+ Long time = Long.parseLong(data.get(key).toString());
+ updateList.add(key + " = '" + BinLogUtils.getDateFormatStr(new Date(time)) + "'");
+ }else {
+ updateList.add(key + " = " + data.get(key).toString());
+ }
+ }
+ });
+ // 拼接sql
+ StringBuilder sqlBuilder = new StringBuilder();
+ sqlBuilder.append("update ")
+ .append(tableName)
+ .append(" set ")
+ .append(String.join(",",updateList))
+ .append(" where id = ")
+ .append(data.get("id"))
+ .append(";");
+ log.info("sql: " + sqlBuilder.toString());
+ // 同步到其他数据库
+ MysqlClient.update(sqlBuilder.toString());
}
/**
@@ -138,6 +180,18 @@
* @param item 数据
*/
private void deletedHandle(BinLogItem item) {
+ String tableName = item.getDbTable().split("-")[1];
+ Map<String, Serializable> data = item.getBefore();
+ // 拼接sql
+ StringBuilder sqlBuilder = new StringBuilder();
+ sqlBuilder.append("delete from ")
+ .append(tableName)
+ .append(" where id = ")
+ .append(data.get("id"))
+ .append(";");
+ log.info("sql: " + sqlBuilder.toString());
+ // 同步到其他数据库
+ MysqlClient.delete(sqlBuilder.toString());
}
}
--
Gitblit v1.9.3