# 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*/
}
```