写在开头,这篇博客其实就是课设报告改的,在此特别感谢一位大佬:大帅不想当程序猿(实习ing版(解析+源码)基于JAVA Swing+MySQL实现学生信息管理系统(增、删、改、查)数据库/文件存储_学生信息管理系统实现增删改查-CSDN博客
代码差不多完全照着他的改的,只改动了一些细节,很快就搞定了,找资源的时间甚至比改代码的时间还长。
1 课题简介
-
- 背景及研究现状
随着工业生产的发展,机床的管理变得越来越重要。然而,传统的机床管理方式效率不高,无法满足现代生产的需求。因此,我们需要一个能够有效管理机床信息的系统。
-
- 设计内容与设计思路
设计的内容主要包括管理员登录、机床信息的增删改查等功能。设计思路是使用Java作为开发语言,SQL数据库用于存储数据。
-
- 设计目的及意义
设计的目的是提高机床管理的效率和准确性。这个系统的意义在于,它可以帮助工厂更好地管理机床,从而提高生产效率。
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);
}
}
}