package org.springblade.binlog.vo; import com.github.shyiko.mysql.binlog.event.EventType; import com.google.common.collect.Maps; import lombok.Data; import java.io.Serializable; import java.util.Map; import static com.github.shyiko.mysql.binlog.event.EventType.isDelete; import static com.github.shyiko.mysql.binlog.event.EventType.isWrite; /** * binlog对象 * * @author zrj * @since 2024/02/19 **/ @Data public class BinLogItem implements Serializable { private static final long serialVersionUID = 5503152746318421290L; private String dbTable; private EventType eventType; private Long timestamp = null; private Long serverId = null; // 存储字段-之前的值之后的值 private Map before = null; private Map after = null; // 存储字段--类型 private Map dataProperty = null; /** * 新增或者删除操作数据格式化 */ public static BinLogItem itemFromInsertOrDeleted(Serializable[] row, Map dataPropertyMap, EventType eventType) { if (null == row || null == dataPropertyMap) { return null; } if (row.length != dataPropertyMap.size()) { return null; } // 初始化Item BinLogItem item = new BinLogItem(); item.eventType = eventType; item.dataProperty = dataPropertyMap; item.before = Maps.newHashMap(); item.after = Maps.newHashMap(); Map beOrAf = Maps.newHashMap(); dataPropertyMap.entrySet().forEach(entry -> { String key = entry.getKey(); DataProperty dataProperty = entry.getValue(); beOrAf.put(key, row[dataProperty.inx]); }); // 写操作放after,删操作放before if (isWrite(eventType)) { item.after = beOrAf; } if (isDelete(eventType)) { item.before = beOrAf; } return item; } /** * 更新操作数据格式化 */ public static BinLogItem itemFromUpdate(Map.Entry mapEntry, Map dataPropertyMap, EventType eventType) { if (null == mapEntry || null == dataPropertyMap) { return null; } // 初始化Item BinLogItem item = new BinLogItem(); item.eventType = eventType; item.dataProperty = dataPropertyMap; item.before = Maps.newHashMap(); item.after = Maps.newHashMap(); Map be = Maps.newHashMap(); Map af = Maps.newHashMap(); dataPropertyMap.entrySet().forEach(entry -> { String key = entry.getKey(); DataProperty dataProperty = entry.getValue(); be.put(key, mapEntry.getKey()[dataProperty.inx]); af.put(key, mapEntry.getValue()[dataProperty.inx]); }); item.before = be; item.after = af; return item; } }