Java高手速成│实战:应用数据库和GUI开发产品销售管理软件(2)

简介: 实战项目:应用数据库和GUI开发产品销售管理软件(2)

image.png

01、项目分析

改进实战项目——应用数据库和GUI开发产品销售管理软件(1)的设计和操作,并增加新的功能;利用按钮和文本框实现对数据库编程的主要操作,如数据表创建、记录添加、记录选择、记录更新、记录删除、数据表删除等功能。图1显示了这个实例运行后的典型显示窗口。

image.png


▍图1 实例运行后的典型运行窗口

02、类的设计

JDBCQueryFrame——用来进行JDBC数据库连接、建立包括创建、加入、选择、更新、删除、消除等SQL指令的提示以及异常处理等操作。并且创建ButtonPanel对象处理对GUI组件的布局管理和显示。

ButtonPanel——包括按钮、文本框等GUI组件的创建、事件处理、输入指令信息和输出结果显示格式处理、SQL指令的发送、回传以及显示处理以及异常处理等功能。

JDBCQueryFrameApp——测试程序,用来运行这个实战项目代码。完整源程序代码见本文压缩附件中名为JDBCQueryFrame.java以及JDBCQueryFrameApp.java。

当程序运行时,用户按下任何一个对数据表和记录操作的按钮,相应的SQL指令语法格式将显示在文本框中,提示用户的操作。例如,按下选择Select记录按钮后,将显示如图2所示窗口:

image.png


▍图2 进行选择记录操作的窗口

这时用户可以在提示处输入具体的字段列表、数据表名以及选择条件。例如,全选数据表Products所有记录的SQL指令为:

SELECT * FROM Products

按下以上指令,按下发送Submit键后,将在文本框中显示SQL指令执行结果,如图3所示。如果用户输入错误的SQL指令,将显示出错信息。

image.png


▍图3 执行SQL选择记录指令后的一个典型运行结果

以上操作包括其他对数据表记录操作的主要代码如下:

 
public void actionPerformed(ActionEvent e) { //事件处理
      Object source = e.getSource();
      if (source == createButton) { //建立新表事件
      setUpdateComponents();
        submitButton.setVisible(true);
        update = true;
      area.setText(createQuery);
      }
      else if(source == insertButton) { //添加记录事件
      setUpdateComponents();
        submitButton.setVisible(true);
        update = true;
      area.setText(insertQuery);
      }
    else if(source == selectButton) { //选择记录事件
        setUpdateComponents(); //调用自定义方法设置GUI显示
        submitButton.setVisible(true); //显示发送按钮
        update = false; //更新状态为假
        area.setText(selectQuery); //显示SQL选择指令语法格式
      }
      else if(source == updateButton) {
      setUpdateComponents();
        update = true;
      area.setText(updateQuery);
      }
      else if(source == deleteButton) {
      setUpdateComponents();
        update = true;
      area.setText(deleteQuery);
      }
       else if(source == dropButton) {
      setUpdateComponents();
        update = true;
      area.setText(dropQuery);
      }
     else if( source == submitButton) { //发送事件处理
        query = area.getText(); //得到SQL指令
        executeQuery(); //执行SQL指令
        resetComponents(); //重设GUI显示
        area.setText(""); //清除SQL指令
        if (update) //如果是更新操作
        JOptionPane.showMessageDialog(null, "The following SQL statement has been executed:\n" + query);
        else { //如果是选择记录操作
          displayRecords(); //调用自定义方法显示选择的记录
        }
      }
       else if(source == exitButton) {
         System.exit(0);
       }
    }

可以看到,按下selectButton将触发对记录的选择事件处理。首先调用自定义方法setUpdateComponents(),改变GUI窗口的显示内容,并设置显示发送按钮。由于选择记录的操作与其他操作不同,需要调用Statement的executeQuery()方法,所以设置表示不同操作状态的布尔变量update为假;而利用executeUpdate()对记录和数据进行更新操作时,则设置update为真。最后调用JTextArea的方法setText()将标准记录选择指令格式显示在文本框中。按下submitButton,将触发对发送事件的处理,通过调用JTextArea的getText()获取文本框中用户修改后的选择记录指令,再调用自定义方法executeQuery()执行这个指令。这时,窗口将被重设为原先的显示状态,并且清除文本框中的内容。如果update状态为真,说明不是选择记录的操作,而是更新纪录,否则调用自定义方法displayRecords(),将这个指令执行后得到的数据表记录显示到文本框中。另外一个自定义方法makeEvenSpace()对除过每个记录的最后一列的长度进行计算,然后补加空格,使记录的每列都有相同的显示长度,便于确定记录位置和编程。如下是executeQuery()、displayRecords()以及makeEvenSpace()方法的代码:

 
private void executeQuery() { //自定义方法执行SQL指令
  try {
    if (update) //更新记录操作
      stmt.executeUpdate(query);
    else
      rs = stmt.executeQuery(query); //选择记录操作
  }
  catch (SQLException e) {
    JOptionPane.showMessageDialog(null, "Error in SQL statement...”);
  }
}
private void displayRecords() { //自定义方法显示执行结果
  String record = "", newRecord = ""; //初始化
  try {
    ResultSetMetaData metadata = rs.getMetaData(); //创建元数据对象
    int col = metadata.getColumnCount(); //得到记录行数
    while (rs.next()) { //循环得到所有选择的纪录
      for(int i=1; i <= col; i++) {
          colSize = metadata.getColumnDisplaySize(i);
          record = rs.getString(i); //得到记录
          if (i <= col-1) //不是最后一列
            record = makeEvenSpace(record, colSize); //补加空格
          newRecord += record + "\t";
        }
area.append(newRecord + "\n");
        record = "";
        newRecord = ""; //清除内容,为下一行准备
    }
    rs.close();
  }
  catch (SQLException sqle) {
       JOptionPane.showMessageDialog(null, "Error in SQL statement...");
  }
  catch (NullPointerException e) {
    JOptionPane.showMessageDialog(null, "No such record found...");
  }
}

关于设置和更新GUI窗口显示的代码,以及对记录和数据表的其他操作与选择记录有所相似!

目录
相关文章
|
2天前
|
Java 测试技术 程序员
💡Java 零基础 | 深入理解注释的重要性与应用
【10月更文挑战第10天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
10 5
|
1天前
|
设计模式 算法 Java
Java中的多态性:深入理解与应用
【10月更文挑战第16天】 在Java编程的广阔天地中,多态性作为一种强大的面向对象特性,扮演着至关重要的角色。它允许我们以统一的方式处理不同类型的对象,极大地提高了程序的灵活性和可扩展性。本文将深入浅出地探讨Java中多态性的概念、实现机制以及在实际开发中的应用,帮助读者更好地理解和运用这一特性。
|
2天前
|
开发框架 Java 程序员
揭开Java反射的神秘面纱:从原理到实战应用!
本文介绍了Java反射的基本概念、原理及应用场景。反射允许程序在运行时动态获取类的信息并操作其属性和方法,广泛应用于开发框架、动态代理和自定义注解等领域。通过反射,可以实现更灵活的代码设计,但也需注意其性能开销。
10 1
|
3天前
|
Java 测试技术 程序员
💡 Java 零基础 | 探索 if 条件语句的应用与技巧
【10月更文挑战第9天】本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&收藏&&订阅!持续更新中,up!up!up!!
9 2
|
9天前
|
存储 SQL 关系型数据库
Mysql学习笔记(二):数据库命令行代码总结
这篇文章是关于MySQL数据库命令行操作的总结,包括登录、退出、查看时间与版本、数据库和数据表的基本操作(如创建、删除、查看)、数据的增删改查等。它还涉及了如何通过SQL语句进行条件查询、模糊查询、范围查询和限制查询,以及如何进行表结构的修改。这些内容对于初学者来说非常实用,是学习MySQL数据库管理的基础。
43 6
|
7天前
|
存储 关系型数据库 MySQL
Mysql(4)—数据库索引
数据库索引是用于提高数据检索效率的数据结构,类似于书籍中的索引。它允许用户快速找到数据,而无需扫描整个表。MySQL中的索引可以显著提升查询速度,使数据库操作更加高效。索引的发展经历了从无索引、简单索引到B-树、哈希索引、位图索引、全文索引等多个阶段。
38 3
Mysql(4)—数据库索引
|
9天前
|
SQL Ubuntu 关系型数据库
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
本文为MySQL学习笔记,介绍了数据库的基本概念,包括行、列、主键等,并解释了C/S和B/S架构以及SQL语言的分类。接着,指导如何在Windows和Ubuntu系统上安装MySQL,并提供了启动、停止和重启服务的命令。文章还涵盖了Navicat的使用,包括安装、登录和新建表格等步骤。最后,介绍了MySQL中的数据类型和字段约束,如主键、外键、非空和唯一等。
27 3
Mysql学习笔记(一):数据库详细介绍以及Navicat简单使用
|
14天前
|
缓存 算法 关系型数据库
Mysql(3)—数据库相关概念及工作原理
数据库是一个以某种有组织的方式存储的数据集合。它通常包括一个或多个不同的主题领域或用途的数据表。
38 5
Mysql(3)—数据库相关概念及工作原理
|
1天前
|
存储 关系型数据库 MySQL
如何在MySQL中创建数据库?
【10月更文挑战第16天】如何在MySQL中创建数据库?
|
5天前
|
SQL Oracle 关系型数据库
安装最新 MySQL 8.0 数据库(教学用)
安装最新 MySQL 8.0 数据库(教学用)
34 4