本节概要

本节将实现数据库记录的备份、恢复功能和软件的退出。

 

备份功能

备份功能同样是在MainPageController.java中的backupMenuItemEvent()方法所触发的,即事件处理代码写在该方法内。

注意,需要在db.properties中添加一对键值对,即是数据库名称,你要备份的数据库名称。

java进程退出时自动打印堆栈_JavaFX

/**
     * “备份”菜单项的事件监听器
     *
     * @param actionEvent 事件
     */
    @FXML
    public void backupMenuItemEvent(ActionEvent actionEvent) throws IOException {
        //实例化文件选择器
        FileChooser fileChooser = new FileChooser();
        //设置打开文件选择框默认输入的文件名
        fileChooser.setInitialFileName("Database_Backup_" + dateTools.dateFormat(new Date(), "yyyy-MM-dd") + ".sql");
        //打开文件选择框
        File result = fileChooser.showSaveDialog(null);
        if (result != null) {
            String savePath = result.getAbsolutePath();
            // 实例化Properties对象
            Properties properties = new Properties();
            // 加载properties配置文件
            FileInputStream fis = new FileInputStream(new File("src\\AccountSystem\\properties\\db.properties"));
            properties.load(fis);
            // 通过键名获取对应的值
            String databaseName = properties.get("databaseName").toString();
            String user = properties.get("user").toString();
            String password = properties.get("password").toString();
            // 调用备份方法需要提供MySQL的用户名、密码和数据库名,这些数据从properties文件中读取
            boolean b = JDBCUtils.backup(user, password, savePath, databaseName);
            if (b) {
                SimpleTools.informationDialog(Alert.AlertType.INFORMATION, "提示", "信息", "备份数据库成功!");
            } else {
                SimpleTools.informationDialog(Alert.AlertType.ERROR, "提示", "错误", "备份数据库失败!");
            }
            // 关闭流
            fis.close();
        }
    }

通过FileChooser选择要备份的路径,然后读取db.properties中的数据库名称以及用户和密码,然后将其作为参数传递到JDBCUtils的backup方法中,执行备份操作。该backup()本质上是执行的DOS命令,只不过是封装到方法内而已。

运行程序,测试功能:

java进程退出时自动打印堆栈_Java实战_02

备份成功后,用记事本打开,可以看到如下信息:

java进程退出时自动打印堆栈_实战_03

如果输出backup()方法的stmt,即可在控制台看到输出的信息:

mysqldump -uroot -padmin db_bookkeepingSystem > C:\Users\Administrator\Music\Database_Backup_2020-02-12.sql

其中root是用户名,admin是数据库登录密码,db_bookkeepingSystem是要备份的数据库名称,而后面的路径是要保存的sql文件地址。

把上面的这个语句在DOS窗口也可以得到执行:

java进程退出时自动打印堆栈_实战_04

 

恢复功能

同样是写在recoverMenuItemEvent()方法内的事件处理,代码如下:

/**
     * “恢复”菜单项的事件监听器
     *
     * @param actionEvent 事件
     */
    @FXML
    public void recoverMenuItemEvent(ActionEvent actionEvent) throws IOException {
        //实例化文件选择器
        FileChooser fileChooser = new FileChooser();
        //设置默认文件过滤器
        fileChooser.setSelectedExtensionFilter(new FileChooser.ExtensionFilter("sql(*.sql)", "sql"));
        //打开文件选择框
        File result = fileChooser.showOpenDialog(null);
        if (result != null) {
            // 恢复文件的路径
            String recoverPath = result.getAbsolutePath();
            // 实例化Properties对象
            Properties properties = new Properties();
            // 加载properties配置文件
            FileInputStream fis = new FileInputStream(new File("src\\AccountSystem\\properties\\db.properties"));
            properties.load(fis);
            // 通过键名获取对应的值
            String databaseName = properties.get("databaseName").toString();
            String user = properties.get("user").toString();
            String password = properties.get("password").toString();
            boolean b = JDBCUtils.recover(user, password, databaseName, recoverPath);
            if (b) {
                // 刷新界面显示的数据
                initialize();
                SimpleTools.informationDialog(Alert.AlertType.INFORMATION, "提示", "信息", "数据库恢复成功!");
            } else {
                SimpleTools.informationDialog(Alert.AlertType.ERROR, "提示", "错误", "数据库恢复失败!");
            }
            // 关闭流
            fis.close();
        }
    }

同样调用了JDBCUtils类中的recover方法。

 

退出功能

退出功能即结束程序,通常使用

System.exit(0);

因此退出菜单项的事件监听器代码就是下面这些了:

/**
     * “退出”菜单项的事件监听器
     *
     * @param actionEvent 事件
     */
    @FXML
    public void exitMenuItemEvent(ActionEvent actionEvent) {
        System.exit(0);
    }

然后点击”退出“菜单项就会结束程序。