要实现Java监听MySQL数据库更新,可以使用JDBC连接数据库并定时查询数据变化。以下是一个简单的示例:,,1. 确保已经安装了MySQL JDBC驱动,如果没有安装,可以在项目的pom.xml文件中添加以下依赖:,,“xml,, mysql, mysql-connector-java, 8.0.26,,`,,2. 创建一个名为DatabaseListener的类,用于监听数据库更新:,,`java,import java.sql.Connection;,import java.sql.DriverManager;,import java.sql.ResultSet;,import java.sql.Statement;,import java.util.Timer;,import java.util.TimerTask;,,public class DatabaseListener {, private static final String URL = "jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC";, private static final String USER = "root";, private static final String PASSWORD = "your_password";, private static final String TABLE_NAME = "your_table_name";, private static final long CHECK_INTERVAL = 5000; // 检查间隔,单位:毫秒,, public static void main(String[] args) {, Timer timer = new Timer();, timer.schedule(new TimerTask() {, @Override, public void run() {, try {, checkDataChanges();, } catch (Exception e) {, e.printStackTrace();, }, }, }, 0, CHECK_INTERVAL);, },, private static void checkDataChanges() throws Exception {, try (Connection connection = DriverManager.getConnection(URL, USER, PASSWORD)) {, connection.setAutoCommit(false); // 开启事务, Statement statement = connection.createStatement();, ResultSet resultSet = statement.executeQuery("SELECT * FROM " + TABLE_NAME + " FOR UPDATE"); // 加锁查询,等待其他事务释放锁, if (!resultSet.next()) { // 如果没有数据,说明没有更新, System.out.println("No data changes found.");, } else { // 如果有数据,说明有更新, System.out.println("Data has changed!");, }, resultSet.close();, statement.close();, connection.commit(); // 提交事务, } catch (Exception e) {, throw e;, }, },},`,,3. 修改URL、USER、PASSWORD和TABLE_NAME变量为实际的数据库连接信息和表名。,,4. 运行DatabaseListener类的main`方法,程序将每隔5秒检查一次数据库是否有更新。如果有更新,控制台将输出”Data has changed!”。
要监听MySQL数据表的变化,可以使用MySQL的触发器功能,以下是详细的步骤:
1、创建一个新的数据库和数据表,用于存储变化的数据,创建一个名为changes_log的数据库和一个名为table_changes的数据表。

CREATE DATABASE changes_log;
USE changes_log;
CREATE TABLE table_changes (
id INT AUTO_INCREMENT PRIMARY KEY,
table_name VARCHAR(255) NOT NULL,
operation ENUM('INSERT', 'UPDATE', 'DELETE') NOT NULL,
data JSON NOT NULL,
changed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
2、为需要监听变化的表创建触发器,为名为my_table的表创建触发器。
DELIMITER //
CREATE TRIGGER my_table_after_insert
AFTER INSERT ON my_table
FOR EACH ROW
BEGIN
INSERT INTO table_changes (table_name, operation, data)
VALUES ('my_table', 'INSERT', NEW);
END;
//
CREATE TRIGGER my_table_after_update
AFTER UPDATE ON my_table
FOR EACH ROW
BEGIN
INSERT INTO table_changes (table_name, operation, data)
VALUES ('my_table', 'UPDATE', NEW);
END;
//
CREATE TRIGGER my_table_after_delete
AFTER DELETE ON my_table
FOR EACH ROW
BEGIN
INSERT INTO table_changes (table_name, operation, data)
VALUES ('my_table', 'DELETE', OLD);
END;
//
DELIMITER ;
3、在Java程序中,使用JDBC连接到MySQL数据库,并查询changes_log数据库中的table_changes数据表。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class Main {
public static void main(String[] args) {
try {
// 加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 连接数据库
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/changes_log", "username", "password");
// 创建Statement对象
Statement statement = connection.createStatement();
// 查询table_changes数据表
ResultSet resultSet = statement.executeQuery("SELECT * FROM table_changes");
// 处理查询结果
while (resultSet.next()) {
System.out.println("Table Name: " + resultSet.getString("table_name"));
System.out.println("Operation: " + resultSet.getString("operation"));
System.out.println("Data: " + resultSet.getString("data"));
System.out.println("Changed At: " + resultSet.getTimestamp("changed_at"));
System.out.println("");
}
// 关闭资源
resultSet.close();
statement.close();
connection.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
这样,每当my_table表中的数据发生变化时,触发器就会将变化的数据插入到changes_log数据库的table_changes数据表中,Java程序可以查询这个数据表,获取所有的变化记录。



评论(0)