# db-listener **Repository Path**: huoyo/db-listener ## Basic Information - **Project Name**: db-listener - **Description**: 一个简单的嵌入式(maven依赖即可)数据库监听器,可以监听数据库的变动并转换为sql - **Primary Language**: Unknown - **License**: LGPL-2.1 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2024-10-20 - **Last Updated**: 2025-11-30 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README [别拦我,我要支持作者,让他加班升级维护](https://afdian.com/a/huoyo)

DB-Listener

简单、好用、易集成的数据库监听工具

一个轻便的数据库监听工具,可以实时监听数据库的改动信息并生成对应的sql语句

- ✅ 实时监听数据库数据库改动 - ✅ 将数据库改动信息转换成sql语句 - ✅ 支持全量数据+增量 > 目前仅支持监听MySQL,后续慢慢扩展 ## 文档 ## 集成 ```xml cn.langpy db-listener 1.0.4 ``` ## 快速使用 ```java import cn.langpy.dblistener.core.EventListener; public static void main(String[] args) { ListenEngine engine = ListenEngine.builder() .type(DbType.Mysql) .host("127.0.0.1") .port(3306) .databases(Arrays.asList("db1", "db2")) .tables(Arrays.asList("db1.table1", "db1.table2", "db2.table1")) .username("root") .password("123456") // .listener(new ConsoleListener()) .listener(new EventListener(){ @Override public void onInsert(EventRow eventRow) {log.info("【"+eventRow.getOperate()+"】"+eventRow.getSql());} @Override public void onUpdate(EventRow eventRow) {log.info("【"+eventRow.getOperate()+"】"+eventRow.getSql());} @Override public void onDelete(EventRow eventRow) {log.info("【"+eventRow.getOperate()+"】"+eventRow.getSql());} @Override public void onRead(EventRow eventRow) {log.info("【"+eventRow.getOperate()+"】"+eventRow.getSql());} @Override public void onAlter(EventRow eventRow) {log.info("【"+eventRow.getOperate()+"】"+eventRow.getSql());} @Override public void onTruncate(EventRow eventRow) {log.info("【"+eventRow.getOperate()+"】"+eventRow.getSql());} @Override public void onDrop(EventRow eventRow) {log.info("【"+eventRow.getOperate()+"】"+eventRow.getSql());} @Override public void onCreate(EventRow eventRow) {log.info("【"+eventRow.getOperate()+"】"+eventRow.getSql());} }) .initialize(false) //首次启动是否同步全量数据 慎重开启 .build(); engine.start(true); } ``` ## 更多细节 ### 1.创建引擎 ```java import cn.langpy.dblistener.core.EventListener; public static void main(String[] args) { ListenEngine engine = ListenEngine.builder() .type(DbType.Mysql) .host("127.0.0.1") .port(3306) .driver("com.mysql.cj.jdbc.Driver") .databases(Arrays.asList("db1", "db2")) .tables(Arrays.asList("db1.table1", "db1.table2", "db2.table1")) .username("root") .password("123456") .listener(new ConsoleListener()) .initialize(false) //首次启动是否同步全量数据 慎重开启 .build(); engine.start(true); } ``` * NOTE: > 1. ConsoleListener是一个直接提供的控制台输出监听器,用来测试ListenEngine是否启动成功 > > 2. engine.start(true)提供一个bool参数,true表示阻塞启动,false表示异步启动 > ### 2.创建监听器 * 创建监听器直接实现EventListener接口即可 ```java public class MyListener1 implements EventListener { @Override public void onInsert(EventRow eventRow) { /*insert语句*/ } @Override public void onUpdate(EventRow eventRow) { /*update语句*/ } @Override public void onDelete(EventRow eventRow) { } @Override public void onRead(EventRow eventRow) { } @Override public void onAlter(EventRow eventRow) { } @Override public void onTruncate(EventRow eventRow) { } @Override public void onDrop(EventRow eventRow) { } @Override public void onCreate(EventRow eventRow) { } } ``` * 然后将监听器添加到ListenEngine ```java ListenEngine engine = ListenEngine.builder() .type(DbType.Mysql) .listener(new MyListener1()) .build(); ``` * 有多个监听器时可以如下操作 ```java import java.util.Arrays; ListenEngine engine = ListenEngine.builder() .type(DbType.Mysql) .listeners(Arrays.as(new MyListener1(),new MyListener2())) .build(); ``` ### 3.数据改变事件EventRow * 操作类型 ```java public void onInsert(EventRow eventRow) { eventRow.getOperate(); /* public enum OperateType { CREATE, UPDATE, ALTER, DELETE, INSERT, READ, DROP, TRUNCATE, UNKOWN; }*/ } ``` * 是否为ddl语句 ```java public void onInsert(EventRow eventRow) { eventRow.getDdl(); /*true or false*/ } ``` * sql语句 ```java public void onInsert(EventRow eventRow) { eventRow.getSql(); /*原始数据的sql语句*/ } ``` * 数据改变细节 ```java public void onInsert(EventRow eventRow) { eventRow.getBefores(); /*改变之前的数据list*/ eventRow.getAfters(); /*改变之后的数据list*/ } ```