JAVA+MySQL数据库实现机床管理系统(增删改查)

写在开头,这篇博客其实就是课设报告改的,在此特别感谢一位大佬:大帅不想当程序猿(实习ing版(解析+源码)基于JAVA Swing+MySQL实现学生信息管理系统(增、删、改、查)数据库/文件存储_学生信息管理系统实现增删改查-CSDN博客

代码差不多完全照着他的改的,只改动了一些细节,很快就搞定了,找资源的时间甚至比改代码的时间还长。

1 课题简介

    1. 背景及研究现状

随着工业生产的发展,机床的管理变得越来越重要。然而,传统的机床管理方式效率不高,无法满足现代生产的需求。因此,我们需要一个能够有效管理机床信息的系统。

    1. 设计内容与设计思路

设计的内容主要包括管理员登录、机床信息的增删改查等功能。设计思路是使用Java作为开发语言,SQL数据库用于存储数据。

    1. 设计目的及意义

设计的目的是提高机床管理的效率和准确性。这个系统的意义在于,它可以帮助工厂更好地管理机床,从而提高生产效率。

2 系统分析与设计

2.1 可行性分析

2.1.1 经济可行性

考虑到该系统可以提高生产效率,节省人力成本,因此,从经济角度来看,该系统可行的。

2.1.2 技术可行性

现阶段使用Java和SQL数据库开发这个系统是完全可行的,因为这两种技术都是成熟的,经过两年系统性学习,具备开发这样一个管理系统的基础知识和拓展资料。

2.1.3 操作可行性

由于该系统的操作界面设计得简单易用,功能完备且运行流畅,符合人机交互原则,从操作角度来看,该系统是可行的。

2.2 需求分析

2.2.1 系统设计目标

系统的设计目标是创建一个易于使用,功能完备,有管理员登录,机床名称、型号、编号等信息的增删改查功能的机床管理系统,能够满足工厂对机床管理的需求。

2.2.2 系统功能需求分析

根据工厂对机床信息日常管理需要,机床信息管理系统包括以下功能:

1.登录系统;

2.新建机床信息:添加机床信息;

3.删除机床信息:对指定机床信息进行删除;

4.修改机床信息:对指定机床信息进行修改

5.查找机床信息:输入机床名、工作状态、型号等查询符合条件的机床;

6.将机床信息保存至文件并导出

7.退出系统。

2.2.3 系统性能需求分析

1. 登录系统: 系统需要有一个安全的用户验证机制,以确保只有授权的管理员可以登录。这需要一个数据库表来存储用户的用户名和加密的密码。

2. 新建机床信息: 系统需要能够接收用户输入的机床信息,并将其存储在数据库中。这需要一个表单界面来收集用户输入的信息,以及数据库表来存储这些信息。

3. 删除机床信息: 系统需要能够根据用户的指示,从数据库中删除指定的机床信息。这可能需要一个搜索功能来帮助用户找到要删除的机床,以及数据库操作来实际删除数据。

4. 修改机床信息: 系统需要能够根据用户的指示,修改数据库中的指定机床信息。这需要一个搜索功能来帮助用户找到要修改的机床,一个表单界面来收集用户输入的新信息,以及数据库操作来实际修改数据。

5. 查找机床信息: 系统需要能够根据用户输入的关键字,从数据库中查找符合条件的机床信息。这需要一个搜索功能来接收用户输入的关键字,并在数据库中进行搜索。

6.将机床信息保存至文件并导出: 系统需要能够将数据库中的机床信息导出到一个文件中。这需要一个数据库操作来读取数据,以及一个文件操作来写入数据。

7.退出系统: 系统需要能够在用户选择退出时,安全地关闭所有打开的资源,如数据库连接,打开的文件等。

2.3 系统总体设计

系统采用C/S架构,基本原理: 客户端通过网络直接与数据库服务器进行通信。客户端发送SQL查询请求到数据库服务器,数据库服务器处理这些查询,然后将结果返回给客户端。

工作过程:

客户端发起连接请求到数据库服务器。数据库服务器接收连接请求,进行身份验证,如果验证通过,则建立连接。客户端通过这个连接发送SQL查询请求到数据库服务器。

数据库服务器接收到查询请求,处理查询,然后将查询结果返回给客户端。客户端接收查询结果,进行必要的处理,如显示在用户界面上。当客户端不再需要与数据库服务器通信时,它会关闭连接。

2.4 系统数据库设计

系统使用的是关系型数据库MySQL。选用MySQL的原则和理由是因为MySQL具有开源、高可靠性、稳定性好、成本低等特点,适合中小型企业或个人开发者使用。同时,MySQL也可以方便地进行数据备份,保证数据安全。

数据库的创建过程如下:

下载并安装MySQL数据库;

在MySQL Workbench中创建一个新的数据库;

新建表my_address_book,按照表结构设计填写字段;

将表my_address_book导入数据库中;

修改代码中的数据库连接信息,确保能够连接到所创建的数据库。

表1 info表结构:

列名

数据类型

宽度

是否为空

id

int

11

主关键字

name

varchar

50

NOT NULL

mode

varchar

10

NOT NULL

telephone

varchar

20

number

varchar

20

time

date

specification

varchar

50

数据库关系设计

表2 登录用户名和密码

字段

数据类型

说明

Username

varchar

用户名

Password

varchar

登录密码

3 系统详细设计

3.1 系统开发及运行环境

3.1.1 软件环境

编程语言:java;编译软件:IDEA;数据库:MySQL;系统:Windows11

驱动:com.mysql.cj.jdbc.Driver

3.1.2 硬件环境

CPU:AMD5600H GPU:GTX1650 内存:16GB 硬盘容量:512GB笔记本电脑

3.2 数据库访问技术

系统设计采用了数据库连接访问技术来实现与数据库的交互。具体来说,使用了Java语言中的JDBC(Java Database Connectivity)技术。

JDBC是Java平台提供的一组用于执行SQL语句并访问关系型数据库的API接口。通过JDBC,我们可以连接到数据库,并执行各种数据库操作,如查询、插入、更新和删除数据等。

在系统设计中,通过以下步骤来使用数据库连接访问技术:

1. 导入JDBC驱动:首先需要导入数据库的JDBC驱动程序。这可以通过使用Class.forName()方法来加载驱动程序类。例如,在示例代码中,使用Class.forName(driverName)加载MySQL的JDBC驱动程序。

2. 建立数据库连接:使用DriverManager.getConnection()方法建立与数据库的连接。需要传入数据库的URL、用户名和密码作为参数。在示例代码中,使用getConnection(url, userName, password)方法来获取数据库连接。

3. 创建Statement对象:通过Connection对象的createStatement()方法创建一个Statement对象。Statement对象用于执行SQL语句并返回执行结果。

4. 执行SQL语句:使用Statement对象的executeQuery()方法执行SELECT语句,返回一个ResultSet对象,该对象包含了查询结果的数据。使用executeUpdate()方法执行INSERT、UPDATE和DELETE等语句。

5. 处理结果集:对于SELECT语句,需要通过遍历ResultSet对象来处理查询结果的数据。可以使用ResultSet的各种getXXX()方法获取每一列的值。

6. 关闭连接和资源:在不再需要数据库连接时,需要关闭连接和释放相关资源。可以使用Connection和Statement对象的close()方法来关闭连接和释放资源。

3.3 系统框架的实现(或基本配置)

3.3.1 主要的类与接口

表3 Connect

类名

类的成员属性和方法

说明

Connect.

java

private static String driverName

driverName

private static String url

url

private static String userName, private static String password

用户名和密码

private Connection conn

Connection对象

private Statement stmt

Statement对象

public C onnect()

加载数据库

public Connection getConnection() throws SQLException

获取数据库连接

表4  MachineSystem

类名

类的成员属性和方法

说明

MachineSystem.java

JButton searchBtn,createBtn,updateBtn,deleteBtn,exitBtn

定义5个系统功能按钮, 用于事件响应

JTable infoTable

定义5个表格, 用于显示机床信息

JLabel keyLab

定义1个标签, 用于提醒用户输入信息

JTextField keyText

定义1个文本框, 用于用户查询信息

private Map<String, String>PersonInfo

私有化Map集合对象

public MachineSystem()

在面板中添加组件、标签和文本框

public static void flashInfo()

将机床信息写入数据库

public void

actionPerformed(ActionEvent e)

功能按钮监听

protected void searchInfo(String key)

实现查询信息

public static Vector<String> column

实例化用于存储表格数据的Vector数组

public static Vector<Vector<String>>info=new Vector<Vector<String>>()

实例化用于存储学生信息的Vector数组

表5  MyDialog

类名

类的成员属性和方法

说明

MyDialog.java

private JPanel pCenter, pSouth

定义2个面板

private JLabel nameLab,modeLab,

mailLab,timeLab,

phoneLab,specificationLab

定义6个机床信息标签, 用于提示

private JTextField nameText,

maiIText,timeText,

phoneText,specificationText

定义6个机床信息文本框用于输入信息

private JComboBox<String> sex

定义1个下拉列表组件

private JButton yesBtn, noBtn

定义2个按钮, 用于给用户选择储存方式

public MyDialog(String title,Map<String, String> info)

构造方法, 用于窗口添加组件和标案等

public void

actionPerformed(ActionEvente)

系统功能按钮监听器模块

public void insertTool()

添加信息当用户输入无效信息时提示模块

public void dbinsertTool()

将新建的机床信息写入数据库的表中模块

public void fileinsertTool()

将新建的机床信息写入文件中模块

public void deleteTool()

删除指定机床信息模块

public void updateTool()

修改指定机床信息模块

3.4 具体功能模块的实现

3.4.1 Connect类模块

一、模块功能概述:

用于连接MySQL数据库,并提供对数据库的操作接口。整个程序包含以下部分:

1. 数据库连接类 Connect

2. 数据库连接方法 getConnection()

3. 数据库连接关闭方法 dispose()

二、Connect类详细介绍

1. 属性:

- driverName: 驱动名称,用于加载数据库驱动。

- url: 数据库连接地址,指定要连接的数据库的位置和名称。

- userName: 登录数据库的用户名。

- password: 登录数据库的密码。

- conn: 连接对象,用于在程序中操作数据库。

- stmt: SQL语句执行对象,用于执行SQL语句。

2. 方法:

- Connect():构造函数,用于加载数据库驱动。

- getConnection():获取数据库连接。

- dispose():关闭数据库连接和SQL语句执行对象。

三、数据模型

本程序只提供了数据库连接的功能,因此并不需要特定的数据模型。如果需要对数据库进行操作,则需要定义数据模型来表示数据库中的数据,并使用DAO模式对其进行操作。

四、各模块的实现说明

1. Connect类

Connect类用于连接MySQL数据库,并提供对数据库的操作接口。该类实现了获取数据库连接和关闭数据库连接的功能,并且提供了一个构造函数,用于在实例化该类时加载数据库驱动。具体实现如下:

public class Connect {

    private static String driverName = "com.mysql.cj.jdbc.Driver";

    private static String url = "jdbc:mysql://localhost:3306/jsp";

    private static String userName = "root";

    private static String password = "111111";

    private Connection conn;

    private Statement stmt;

    public Connect() {

        try {

            Class.forName(driverName);//加载数据库

        } catch (ClassNotFoundException e) {

            e.printStackTrace();

        }

    }

    // 获取数据库连接

    public Connection getConnection() throws SQLException {

        return DriverManager.getConnection(url, userName, password);//使用DriverManger获取数据库连接

    }

    // 关闭数据库连接和SQL语句执行对象

    public void dispose() {

        try {

            if (conn != null) {

                conn.close();

            }

            if (stmt != null) {

                stmt.close();

            }

        } catch (SQLException e) {

            e.printStackTrace();

        }

    }

}

2. 数据库连接方法

getConnection() 方法用于获取数据库连接,其实现方式是使用 DriverManager 类的静态方法 getConnection() 来获取数据库连接。具体实现如下:

// 获取数据库连接

public Connection getConnection() throws SQLException {

    return DriverManager.getConnection(url, userName, password);

}

3. 数据库连接关闭方法

dispose() 方法用于关闭数据库连接和SQL语句执行对象,其实现方式是判断是否存在连接或执行对象,如果存在则调用 close() 方法来关闭它们。具体实现如下:

// 关闭数据库连接和SQL语句执行对象

public void dispose() {

    try {

        if (conn != null) {

            conn.close();

        }

        if (stmt != null) {

            stmt.close();

        }

    } catch (SQLException e) {

        e.printStackTrace();

    }

}

  • 已建立的数据库表:my_address_book数据库表

3.4.2 MyDialog类模块

 模块一:界面设计

1、界面列表:

- `MyDialog` 类,继承自 `JDialog`

  - 属性:

    - `dbconn`:`Connect` 对象,用于数据库连接

    - `id`:当前机床的 ID

    - `pCenter`:`JPanel` 对象,用于放置输入框和标签

    - `pSouth`:`JPanel` 对象,用于放置按钮

    - `nameLab`、`modeLab`、`phoneLab`、`mailLab`、`timeLab`、`specificationLab`:`JLabel` 对象,分别对应机床名称、工作状态、负责人电话、型号、使用日期、规格的标签

    - `nameText`、`phoneText`、`mailText`、`timeText`、`specificationText`:`JTextField` 对象,分别对应机床名称、负责人电话、型号、使用日期、规格的文本输入框

    - `mode`:`JComboBox` 对象,用于选择工作状态

    - `yesBtn`、`noBtn`:`JButton` 对象,分别对应保存到数据库和保存到文件的按钮

  - 方法:

    - 构造方法:`MyDialog()` 和 `MyDialog(String title, Map<String, String> info)`

    - `actionPerformed(ActionEvent e)`:按钮监听器方法,根据按钮点击的不同执行不同的功能

    - `insertTool()`:检查输入的机床名称是否为空

    - `dbInsertTool()`:将新建的机床信息写入数据库的表中

    - `fileInsertTool()`:将新建的机床信息写入文件中

    - `updateTool()`:更新机床信息

    - `deleteTool()`:删除机床信息

2、功能描述:

- `MyDialog` 类是一个自定义的对话框,用于显示和处理机床信息的新建、修改和删除操作。根据不同的标题(title)展示不同的界面和功能。

- 在构造方法中,根据传入的标题和信息对象,初始化界面的各个组件,设置布局和样式,并添加按钮的监听器。

- `actionPerformed(ActionEvent e)` 方法是按钮的监听器方法,当点击按钮时会触发该方法。根据不同的按钮执行不同的功能,如新建、修改、删除机床信息。

- `insertTool()` 方法用于检查输入的机床名称是否为空,如果为空则弹出提示窗口。

- `dbInsertTool()` 方法将新建的机床信息写入数据库的表中。首先获取各个输入框的值,然后执行 SQL 语句将数据插入数据库。最后刷新显示数据库中的机床信息,更新界面的表格。

- `fileInsertTool()` 方法将新建的机床信息写入imformation.txt文件中。首先创建一个`StringBuffer` 对象,将各个输入框的值拼接成一行字符串,然后将字符串写入文件。最后刷新显示数据库中的机床信息,更新界面的表格。

- `updateTool()` 方法用于更新机床信息。首先获取各个输入框的值,然后执行 SQL 语句将数据更新到数据库中。最后刷新显示数据库中的机床信息,更新界面的表格。

若未选择更新信息的机床则弹出提示窗口。

- `deleteTool()` 方法用于删除机床信息。执行 SQL 语句将指定 ID 的机床信息从数据库中删除。最后刷新显示数据库中的机床信息,更新界面的表格。

模块二:数据模型

1、数据模型描述:

- `DefaultTableModel` 对象,用于存储机床信息的表格数据

  - 属性:

    - `info`:二维数组,表示表格的数据

    - `column`:一维数组,表示表格的列名

2、功能描述:

- 数据模型使用 `DefaultTableModel` 类实现,通过定义一个二维数组 `info` 来存储机床信息的表格数据,通过一个一维数组 `column` 来存储表格的列名。

模块三:数据库操作模型(DAO)

1、数据库操作模型描述:

- `Connect` 类,用于数据库的连接和关闭

  - 属性:无

  - 方法:

    - `getConnection()`:获取数据库连接对象

    - `closeConnection()`:关闭数据库连接

2、功能描述:

- `Connect` 类封装了数据库的连接和关闭操作,提供了 `getConnection()` 方法用于获取数据库连接对象,并在需要关闭连接时调用 `closeConnection()` 方法关闭数据库连接。

模块四:控制器

1、控制器描述:

- `MachineSystem` 类,用于控制机床信息的显示和更新

  - 属性:

    - `infoTable`:`JTable` 对象,用于显示机床信息的表格

  - 方法:

    - `flashInfo()`:刷新机床信息,从数据库中读取最新的数据,并更新到界面的表格中

2、功能描述:

- `MachineSystem` 类是控制器类,负责控制机床信息的显示和更新。

- `flashInfo()` 方法用于刷新机床信息,通过调用数据库操作模型的方法获取最新的数据,并更新到界面的表格中。首先执行 SQL 查询语句,获取数据库中的机床信息,然后根据数据构造数据模型,并设置给界面的表格。最后设置表格的列

宽,使得表格显示更加美观。

4 总结

4.1 系统工作总结

我们的团队成功地设计并实现了一个全面的机床管理系统。这个系统是基于C/S架构,使用Java作为开发语言,SQL数据库用于存储数据。我们的系统包括以下模块:

登录模块: 这个模块提供了安全的用户验证机制,确保只有授权的管理员可以登录系统。

机床数据录入:此模块允许管理员添加新的机床信息到系统中。

数据删除:此模块允许管理员从系统中删除不再需要的机床信息。

数据修改:此模块允许管理员更新系统中的机床信息。

数据查找:此模块允许管理员根据多种关键字搜索机床信息。

通过小组成员的努力,我们成功地完成了各模块的集成与测试,最终实现了一个功能强大、易于使用的机床管理系统。这个系统的主要特点是它的易用性和灵活性。管理员可以轻松地管理机床信息,无论是添加新的信息,删除旧的信息,还是更新现有的信息。此外,通过数据查找功能,管理员可以快速地找到他们需要的信息。我们的系统的创新之处在于它的设计理念。我们认为,一个好的机床管理系统应该是以用户为中心的,因此我们在设计每个模块时都充分考虑了用户的需求和体验。通过实现这个系统,我们达到了我们的目标:提供一个高效、可靠的工具,帮助工厂更好地管理他们的机床,从而提高生产效率。

4.2 存在的不足及改进

性能优化: 当处理大量数据时,系统的性能可能会受到影响。我们可以通过优化数据库查询,使用缓存技术来提高系统的性能。

扩展性: 随着工厂的发展,可能会有新的需求出现。我们的系统需要能够容易地添加新的功能。
 

代码如下:

Connect.java

package com.txl;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

public class Connect {
    private static String driverName = "com.mysql.cj.jdbc.Driver";
    private static String url = "jdbc:mysql://localhost:3306/jsp";
    private static String userName = "root";
    private static String password = "111111";
    private Connection conn;
    private Statement stmt;

    public Connect() {
        try {
            Class.forName(driverName);//加载数据库
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url, userName, password);//使用DriverManger获取数据库连接
    }

    public void dispose() {
        try {
            if (conn != null) {
                conn.close();
            }
            if (stmt != null) {
                stmt.close();
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

Login.java

package com.txl;

import java.awt.FlowLayout;
import java.awt.Dimension;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Random;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.JPasswordField;
//登录界面
public class Login {
    private String code;//保存生成的验证码
    public static void main(String args[]) {
        Login l=new Login();//实例化Login对象
        l.showUI();
    }

    public void showUI() {
        JFrame login=new JFrame();//创建一个JFrame容器窗口
        login.setTitle("登录系统");//设置标题
        login.setSize(340,280);//设置窗口大小
        login.setDefaultCloseOperation(3);//0-DO_NITHING窗口无法关闭;1-HIDE隐藏程序界面但没有关闭程序;2-DISPOSE自动隐藏释放窗体,继续运行应用程序;3-EXIT
        login.setLocationRelativeTo(null);//设置窗口位置相对于指定组件的位置
        login.setResizable(false);//设置窗口不可被调整大小,布尔值
        //FlowLayout fl=new FlowLayout(FlowLayout.CENTER,5,5);
        login.setLayout(new FlowLayout());//FloeLayout默认居中对齐,水平、垂直间距默认为5个单位
        login.setVisible(true);//窗体可见

        //用户名标签组件
        JLabel labname=new JLabel();
        labname.setText("用户名:");
        labname.setPreferredSize(new Dimension(60, 60));//设置最适合窗口的位置(setPreferredSize)和JLable标签组件的宽度和高度(Dimension)
        login.add(labname);//加入JFrame窗口
        JTextField textname=new JTextField();//创建一个JTextField文本框用于输入用户名
        textname.setPreferredSize(new Dimension(250, 30));
        login.add(textname);//加入到JFrame窗口中

        //密码标签组件
        JLabel labpassword=new JLabel();
        labpassword.setText("密    码:");
        labpassword.setPreferredSize(new Dimension(60, 60));
        login.add(labpassword);
        JPasswordField jp=new JPasswordField();
        jp.setPreferredSize(new Dimension(250, 30));
        login.add(jp);

        //验证码标签组件
        JLabel labcode=new JLabel();
        labcode.setText("验证码:");
        labcode.setPreferredSize(new Dimension(60, 60));
        login.add(labcode);
        JTextField textcode=new JTextField();//创建一个JTextField文本框用于输入验证码
        textcode.setPreferredSize(new Dimension(100, 30));
        login.add(textcode);

        //生成验证码
        code = generateCode();
        JLabel labImg = new JLabel();
        labImg.setText(code);
        labImg.setPreferredSize(new Dimension(100, 30));
        login.add(labImg);

        //登录按钮
        JButton button=new JButton();
        button.setText("登录");
        button.setPreferredSize(new Dimension(100, 40));
        login.add(button);
        login.setVisible(true);

        //为登录键添加鼠标事件监听器
        button.addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                Connect dbconn = new Connect();//实例化Connect对象
                Statement stmt = null;
                ResultSet rs = null;
                try {
                    //用于创建一个 Statement 对象,封装 SQL 语句发送给数据库,通常用来执行不带参数的 SQL 语句
                    stmt = dbconn.getConnection().createStatement();
                    //执行查询;用statement类的executeQuery()方法来下达select指令以查询数据库,把数据库响应的查询结果存放在ResultSet类对象中供我们使用
                    //select * from查询在数据库中表内信息
                    rs = stmt.executeQuery("select * from my_address_login where username='"+textname.getText()+"' and password='"+jp.getText()+"'");
                    if (rs.next() && textcode.getText().equalsIgnoreCase(code)) {
                        new MachineSystem();//主界面
                        login.dispose();//释放登录界面窗口占用的屏幕资源
                    }else{
                        JOptionPane.showMessageDialog(null, "用户名或密码或验证码不正确!!!","提示",2);//java弹窗JOptionPane.showMessageDialog(null, "提示内容" ,"标题", -1~3);
                        //刷新验证码
                        code = generateCode();
                        labImg.setText(code);
                    }
                    rs.close();
                } catch (SQLException e1) {
                    e1.printStackTrace();//在命令行打印异常信息在程序中出错的位置及原因,显示出更深的调用信息
                    //System.out.println(e1);
                } finally {
                    try {
                        if (stmt != null) {
                            stmt.close();
                        }
                        if (rs != null) {
                            rs.close();
                        }
                    } catch (SQLException e1) {
                        e1.printStackTrace();
                    }
                }
            }
        });
    }

    //生成随机验证码
    private String generateCode() {
        String chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
        StringBuilder sb = new StringBuilder();
        Random random = new Random();
        for (int i = 0; i < 4; i++) {
            int index = random.nextInt(chars.length());
            sb.append(chars.charAt(index));
        }
        return sb.toString();
    }
}
MachineSystem.java
package com.txl;

import java.awt.*;
import java.awt.event.*;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.*;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;

public class MachineSystem extends JFrame implements ActionListener {//继承自JFrame使得这个类成为一个窗体,可以对窗体的属性进行扩展并且可以定义自己需要的特殊操作方法
    private static final long serialVersionUID = 1L;//把java对象序列化而后进行保存
    private Map<String, String> ToolInfo;
    public static Vector<Vector<String>> info = new Vector<Vector<String>>();
    private JLabel keyLab;
    private JButton searchBtn, createBtn, updateBtn, deleteBtn, exitBtn;
    public static JTable infoTable;
    private JTextField keyText;
    public static Vector<String> column;

    public MachineSystem() {
        ToolInfo = new HashMap<String, String>();//数组和链表的结合体,HashMap底层就是一个数组结构,数组中的每一项又是一个链表。新建一个HashMap的时候,就会初始化一个数组
        Font font = new Font("宋体", Font.PLAIN, 15);//设置字体,类型和大小;Front.PLAIN普通,Front.BLOD加粗,Front.ITALIC斜体
        JPanel pNorth = new JPanel();
        pNorth.setLayout(new FlowLayout(FlowLayout.RIGHT));
        keyLab = new JLabel("请输入关键字:");
        keyText = new JTextField(10);//搜索文本框

        //创建系统功能按钮
        searchBtn = new JButton("搜索机床信息");
        createBtn = new JButton("新增机床信息");
        updateBtn = new JButton("修改机床信息");
        deleteBtn = new JButton("删除机床信息");
        exitBtn = new JButton("退出系统");

        //设置字体大小
        keyLab.setFont(font);
        searchBtn.setFont(font);
        createBtn.setFont(font);
        updateBtn.setFont(font);
        deleteBtn.setFont(font);
        exitBtn.setFont(font);

        //添加监听器
        searchBtn.addActionListener(this);
        createBtn.addActionListener(this);
        updateBtn.addActionListener(this);
        deleteBtn.addActionListener(this);
        exitBtn.addActionListener(this);

        //在JPanel面板的上方加入搜索功能所需的一系列组件
        pNorth.add(keyLab);
        pNorth.add(keyText);
        pNorth.add(searchBtn);

        //在JPanel面板下方加入系统功能组件
        JPanel pSouth = new JPanel();
        pSouth.add(createBtn);
        pSouth.add(updateBtn);
        pSouth.add(deleteBtn);
        pSouth.add(exitBtn);

        //表格数据
        column = new Vector<String>();
        column.add("编号");
        column.add("机床名称");
        column.add("状态");
        column.add("负责人电话");
        column.add("型号");
        column.add("使用日期");
        column.add("规格");
        flashInfo();//将数据存入数据库
        infoTable = new JTable(info, column);
        TableColumn column1 = infoTable.getColumnModel().getColumn(0);
        column1.setPreferredWidth(30);//自适应

        TableColumn column3 = infoTable.getColumnModel().getColumn(2);
        column3.setPreferredWidth(30);//自适应

        JScrollPane pCenter = new JScrollPane(infoTable);//创建垂直滚动面板
        this.add(pNorth, "North");
        this.add(pCenter, "Center");
        this.add(pSouth, "South");

        this.setTitle("机床信息管理系统");
        this.setSize(800, 450);
        this.setVisible(true);
        this.setLocationRelativeTo(null);
        this.setResizable(false);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
    }

    public static void flashInfo() {
        Connect dbconn = new Connect();
        Statement stmt = null;
        ResultSet rs = null;
        info.clear();
        try {
            stmt = dbconn.getConnection().createStatement();//创建一个 Statement 对象,封装 SQL 语句发送给数据库
            rs = stmt.executeQuery("select * from my_address_book");//下达命令执行查询语句并且存放在ResultSet对象中
            while (rs.next()) {
                Vector<String> row = new Vector<String>();
                row.add(rs.getString(1));
                row.add(rs.getString(2));
                row.add(rs.getString(3));
                row.add(rs.getString(4));
                row.add(rs.getString(5));
                row.add(rs.getString(6));
                row.add(rs.getString(7));
                info.add(row);
            }
            rs.close();
        } catch (SQLException e) {
            e.printStackTrace();//在命令行打印异常信息在程序中出错的位置及原因
        } finally {
            try {
                if (stmt != null) {
                    stmt.close();
                }
                if (rs != null) {
                    rs.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    public void actionPerformed(ActionEvent e) {
        int rowNum = infoTable.getSelectedRow();//返回第一个选定行的索引
        if (rowNum != -1) {
            ToolInfo = new HashMap<String, String>();
            //将值插入HasMap中
            ToolInfo.put("id", (String) infoTable.getValueAt(rowNum, 0));//返回表格row和column位置的单元格值
            ToolInfo.put("name", (String) infoTable.getValueAt(rowNum, 1));
            ToolInfo.put("mode", (String) infoTable.getValueAt(rowNum, 2));
            ToolInfo.put("telephone", (String) infoTable.getValueAt(rowNum, 3));
            ToolInfo.put("number", (String) infoTable.getValueAt(rowNum, 4));
            ToolInfo.put("time", (String) infoTable.getValueAt(rowNum, 5));
            ToolInfo.put("specification", (String) infoTable.getValueAt(rowNum, 6));
        }

        if (e.getSource() == searchBtn) {//搜索
            String keyStr = keyText.getText();
            searchInfo(keyStr);
        } else if (e.getSource() == createBtn) {//新建
            MyDialog InsertPane = new MyDialog("新建机床信息", new HashMap<String, String>());
            InsertPane.setVisible(true);
        } else if (e.getSource() == updateBtn) {//修改
            if (rowNum == -1) {
                JOptionPane.showMessageDialog(null, "请选择修改机床");//提示弹窗
                return; // 返回显示页面
            }
            MyDialog UpdatePane = new MyDialog("修改机床信息", ToolInfo);
            UpdatePane.setVisible(true);
        } else if (e.getSource() == deleteBtn) {//删除
            if (rowNum == -1) {
                JOptionPane.showMessageDialog(null, "请选择删除机床");//提示弹窗
                return; // 返回显示页面
            }
            MyDialog DeletePane = new MyDialog("删除机床信息", ToolInfo);
            DeletePane.setVisible(true);
        } else if (e.getSource() == exitBtn) {//退出
            this.setVisible(false);
        }
    }


    protected void searchInfo(String key) {//搜索
        Connect dbconn = new Connect();
        Statement stmt = null;
        ResultSet rs = null;
        try {
            stmt = dbconn.getConnection().createStatement();
            String sql = "select * from my_address_book where name like'%" + key + "%'" +
                    "or telephone like'%" + key + "%' or specification like'%" + key + "%'or mode like'%" + key + "%'";

            rs = stmt.executeQuery(sql);

            info.clear();
            while (rs.next()) {
                Vector<String> row = new Vector<String>();//创建自增长数组
                row.add(rs.getString(1));//向Vector中添加值
                row.add(rs.getString(2));
                row.add(rs.getString(3));
                row.add(rs.getString(4));
                row.add(rs.getString(5));
                row.add(rs.getString(6));
                row.add(rs.getString(7));
                info.add(row);
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                if (stmt != null) {
                    stmt.close();
                }
                if (rs != null) {
                    rs.close();
                }

            } catch (SQLException e) {
                e.printStackTrace();
            }
            DefaultTableModel model = new DefaultTableModel(MachineSystem.info, MachineSystem.column);//构造一个 DefaultTableModel,并通过将 data 和 columnNames 传递到 setDataVector 方法来初始化该表。
            MachineSystem.infoTable.setModel(model);//数据绑定
            TableColumn column1 = MachineSystem.infoTable.getColumnModel().getColumn(0);
            column1.setMaxWidth(40);
            column1.setMinWidth(40);

            TableColumn column3 = MachineSystem.infoTable.getColumnModel().getColumn(2);
            column3.setMaxWidth(40);
            column3.setMinWidth(40);
        }
    }

    public static void main(String[] args) {
        new MachineSystem();
    }

}

MyDialog.java

package com.txl;

import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Map;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableColumn;

public class MyDialog extends JDialog implements ActionListener {
    private Connect dbconn = new Connect();
    private static String id;
    private JPanel pCenter, pSouth;
    private JLabel nameLab, modeLab,phoneLab, mailLab, timeLab, specificationLab;
    private JTextField nameText,phoneText, mailText, timeText, specificationText;
    private JComboBox<String> mode;
    private JButton yesBtn, noBtn;

    public MyDialog() {}

    public MyDialog(String title, Map<String, String> info) {
        id = info.get("id");
        if("删除机床".equals(title)) {
            deleteTool();
        } else {
            Font font = new Font("宋体", Font.BOLD, 14);
            String[] modeType = { "-请选择-","开", "关" };//下拉列表组件添加内容
            pCenter = new JPanel();
            pCenter.setLayout(new GridLayout(5, 1));
            nameLab = new JLabel("机床名称:");
            modeLab = new JLabel("工作状态:");
            phoneLab = new JLabel("负责人电话:");
            timeLab = new JLabel("使用日期:");
            mailLab = new JLabel("型号:");
            specificationLab = new JLabel("规格:");
            nameLab.setFont(font);
            modeLab.setFont(font);
            mailLab.setFont(font);
            timeLab.setFont(font);
            phoneLab.setFont(font);
            specificationLab.setFont(font);
            nameText = new JTextField(10);
            mailText = new JTextField(10);
            timeText = new JTextField(10);
            phoneText = new JTextField(10);
            specificationText = new JTextField(10);
            mode = new JComboBox<String>(modeType);

            JPanel jp1 = new JPanel();
            jp1.setLayout(new FlowLayout(FlowLayout.LEFT));
            jp1.add(nameLab);
            jp1.add(nameText);

            JPanel jp5 = new JPanel();
            jp5.setLayout(new FlowLayout(FlowLayout.LEFT));
            jp5.add(modeLab);
            jp5.add(mode);
            nameText.setText(info.get("name"));
            mode.setSelectedItem(info.get("mode"));

            JPanel jp2 = new JPanel();
            jp2.setLayout(new FlowLayout(FlowLayout.LEFT));
            jp2.add(mailLab);
            jp2.add(mailText);
            mailText.setText(info.get("number"));

            JPanel jp3 = new JPanel();
            jp3.setLayout(new FlowLayout(FlowLayout.LEFT));
            jp3.add(timeLab);
            jp3.add(timeText);
            timeText.setText(info.get("time"));

            JPanel jp4 = new JPanel();
            jp4.setLayout(new FlowLayout(FlowLayout.LEFT));
            jp4.add(phoneLab);
            jp4.add(phoneText);
            phoneText.setText(info.get("telephone"));

            JPanel jp6 = new JPanel();
            jp6.setLayout(new FlowLayout(FlowLayout.LEFT));
            jp6.add(specificationLab);
            jp6.add(specificationText);
            specificationText.setText(info.get("specification"));

            pCenter.add(jp1);
            pCenter.add(jp5);
            pCenter.add(jp2);
            pCenter.add(jp3);
            pCenter.add(jp4);
            pCenter.add(jp6);

            pSouth = new JPanel();
            yesBtn = new JButton("以数据库保存");
            yesBtn.addActionListener(this);
            noBtn = new JButton("以文件保存");
            noBtn.addActionListener(this);
            pSouth.add(yesBtn);
            pSouth.add(noBtn);

            this.add(pCenter, "Center");
            this.add(pSouth, "South");

            this.setTitle(title);
            this.setSize(400, 450);
            this.setLocationRelativeTo(null);
            this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);

            if("修改机床信息".equals(title)){
                nameText.setEditable(false);
                mailText.setEditable(false);
                specificationText.setEditable(false);
            }

        }
    }

    public void actionPerformed(ActionEvent e) {//系统功能按钮监听器
        if (e.getSource() == yesBtn) {
            if (this.getTitle().equals("新建机床信息")) {
                InsertTool();
                dbInsertTool();
            } else if (this.getTitle().equals("修改机床信息")) {
                updateTool();
            } else if (this.getTitle().equals("删除机床信息")) {
                deleteTool();
            }
        } else if (e.getSource() == noBtn) {
            fileInsertTool();
        }
    }

    public boolean InsertTool() {
        if (nameText.getText().isEmpty()) {
            JOptionPane.showMessageDialog(null, "请输入机床名称!");//提示弹窗
            return false;
        }
        return true;
    }

    public void dbInsertTool(){//将新建的机床信息写入数据库的表中
        boolean flag=true;
        String sql = "insert into my_address_book(name, mode, telephone, time, number ,specification) values(?,?,?,?,?,?)";
        try {
            PreparedStatement pstmt = dbconn.getConnection().prepareStatement(sql);
            pstmt.setString(1, nameText.getText());
            pstmt.setString(2, (String) mode.getSelectedItem());
            pstmt.setString(3, phoneText.getText());
            pstmt.setString(4, timeText.getText());
            pstmt.setString(5, mailText.getText());
            pstmt.setString(6, specificationText.getText());
            pstmt.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
            JOptionPane.showMessageDialog(null, "新建机床失败!");
            flag = false;
        } finally {
            dispose();
            if (flag) {
                JOptionPane.showMessageDialog(null, "新建机床成功!");//提示弹窗
            }
            MachineSystem.flashInfo();//将数据写入数据库
            DefaultTableModel model = new DefaultTableModel(MachineSystem.info, MachineSystem.column);

            MachineSystem.infoTable.setModel(model);
            TableColumn column1 = MachineSystem.infoTable.getColumnModel().getColumn(0);
            column1.setMaxWidth(40);
            column1.setMinWidth(40);

            TableColumn column3 = MachineSystem.infoTable.getColumnModel().getColumn(2);
            column3.setMaxWidth(40);
            column3.setMinWidth(40);
        }
    }

    public void fileInsertTool(){//将新建的机床信息写入文件中
        boolean flag=true;
        try {
            StringBuffer sbf=new StringBuffer();
            sbf.append(nameText.getText()).append(" ")
                    .append((String) mode.getSelectedItem()).append(" ")
                    .append(phoneText.getText()).append(" ")
                    .append(mailText.getText()).append(" ")
                    .append(timeText.getText()).append(" ")
                    .append(specificationText.getText());
            File file = new File("information.txt");
            FileOutputStream fos = null;
            if(!file.exists()){
                file.createNewFile();//如果文件不存在,创建该文件
                fos = new FileOutputStream(file);//首次写入获取
            }else{
                //如果文件已存在,就在文件末尾追加写入
                fos = new FileOutputStream(file,true);
            }
            OutputStreamWriter osw = new OutputStreamWriter(fos, "gbk");//指定以GBK格式写入文件
            osw.write(sbf.toString());
            osw.write("\r\n");
            osw.close();
        } catch (Exception e) {
            e.printStackTrace();
            JOptionPane.showMessageDialog(null, "新建机床失败!");
            flag = false;

        } finally {
            dispose();
            if (flag) {
                JOptionPane.showMessageDialog(null, "新建机床成功!");//提示弹窗
            }
            MachineSystem.flashInfo();//将数据写入数据库
            DefaultTableModel model = new DefaultTableModel(MachineSystem.info, MachineSystem.column);

            MachineSystem.infoTable.setModel(model);
            TableColumn column1 = MachineSystem.infoTable.getColumnModel().getColumn(0);
            column1.setMaxWidth(40);
            column1.setMinWidth(40);

            TableColumn column3 = MachineSystem.infoTable.getColumnModel().getColumn(2);
            column3.setMaxWidth(40);
            column3.setMinWidth(40);
        }
    }

    public void updateTool() {//更新机床信息
        boolean flag=true;
        String sql = "update my_address_book set name=?, mode=?, telephone=?, number=?, time=?, specification=? where id=?";
        try {
            PreparedStatement pstmt = dbconn.getConnection().prepareStatement(sql);
            pstmt.setString(1, nameText.getText());
            pstmt.setString(2, (String) mode.getSelectedItem());
            pstmt.setString(3, phoneText.getText());
            pstmt.setString(4, mailText.getText());
            pstmt.setString(5, timeText.getText());
            pstmt.setString(6, specificationText.getText());
            pstmt.setString(7, id);
            pstmt.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
            JOptionPane.showMessageDialog(null, "修改机床失败!");//提示弹窗
            flag=false;
        } finally {
            dispose();
            if (flag) {
                JOptionPane.showMessageDialog(null, "修改机床成功!");//提示弹窗
            }
            MachineSystem.flashInfo();
            DefaultTableModel model = new DefaultTableModel(MachineSystem.info, MachineSystem.column);

            MachineSystem.infoTable.setModel(model);
            TableColumn column1 = MachineSystem.infoTable.getColumnModel().getColumn(0);
            column1.setMaxWidth(40);
            column1.setMinWidth(40);

            TableColumn column3 = MachineSystem.infoTable.getColumnModel().getColumn(2);
            column3.setMaxWidth(40);
            column3.setMinWidth(40);
        }
    }

    public void deleteTool() {//删除机床信息
        boolean flag=true;
        String sql = "delete from my_address_book where id=?";
        try {
            PreparedStatement pstmt = dbconn.getConnection().prepareStatement(sql);
            pstmt.setString(1, id);
            pstmt.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
            JOptionPane.showMessageDialog(null, "删除机床失败!");//提示弹窗
            flag=false;
        } finally {
            dispose();
            if (flag) {
                JOptionPane.showMessageDialog(null, "删除机床成功!");//提示弹窗
            }
            MachineSystem.flashInfo();
            DefaultTableModel model = new DefaultTableModel(MachineSystem.info, MachineSystem.column);

            MachineSystem.infoTable.setModel(model);
            TableColumn column1 = MachineSystem.infoTable.getColumnModel().getColumn(0);
            column1.setMaxWidth(40);
            column1.setMinWidth(40);

            TableColumn column3 = MachineSystem.infoTable.getColumnModel().getColumn(2);
            column3.setMaxWidth(40);
            column3.setMinWidth(40);
        }
    }
}

  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值