要实现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)