Tianjin TianShi College |
Java课程设计
(综合项目文档)
水果超市系统
院 别: 信息科学与工程学院 专 业: 计算机科学与技术 班 级: 2018级计科3班 学生姓名: 赵新宇刘增涛王子竞 指导老师: 李小红 |
二〇二〇年七月
目 录
1 绪论................................................................. 1
1.1 项目概述........................................................ 1
1.2 项目意义........................................................ 1
2 开发工具和相关技术简介............................................... 1
2.1 Eclipse简介(或者MyEclipse或者IEDA简介)..................... 1
2.2 Java语言介绍................................................... 2
2.3 MySQL简介...................................................... 2
2.4 JDBC技术简介................................................... 2
3 系统需求分析......................................................... 4
3.1 系统可行性分析.................................................. 4
3.2 系统需求分析.................................................... 4
3.3 组内成员分工.................................................... 5
3.4 项目进度安排.................................................... 5
4 系统设计............................................................. 7
4.1 系统设计........................................................ 7
4.2 数据库设计...................................................... 7
5 系统实现............................................................. 8
5.1 系统代码实现.................................................... 8
5.2 系统界面实现................................................... 30
6 系统测试............................................................ 34
7 结论和心得.......................................................... 36
1 绪论
1.1 项目概述
水果超市管理系统共包括系统欢迎界面和超市货物管理界面两个界面,在系统欢迎界面通过单击“进入系统”按钮,进入超市货物管理界面,在货物管理界面就可以对水果信息实现具体的操作。例如每当有新水果运送到超市时,就需要系统管理人员在系统中增加新水果的信息,如果超市中的水果没有了就删除该水果信息,或者数量价格等需要变更时进行修改,这些操作都可以在管理系统中完成。
1.2 项目意义
随着现在水果超市的日益增多,规模不断的壮大,水果数量以及种类急剧增加,很多水果超市的进出货已经处于疲态,不仅满足不了客户的需求,也降低了超市的运营效率。所以结合社会环境所需开发了水果超市管理系统,来方便加快超市的运营。这个题目做出来的系统还是比较实用的,所以我们选择了水果超市管理系统这个题目。
完成此系统,需要综合运用课程中的多个知识点,自行实现一个较为完整的应用系统的设计与开发。通过课程设计,自己通过系统分析、系统设计、编程调试,写课程设计说明书等环节,进一步掌握应用系统设计的方法和步骤,灵活运用并深刻理解面向对象程序设计在软件开发中的应用。学会将知识应用于实际的方法,提高分析和解决问题的能力,增加综合能力。
2 开发工具和相关技术简介
本项目是水果超市系统。开发环境:Ecplise MySQL;开发语言:Java;开发技术:JDBC GUI等。本章将对开发工具和相关技术进行简单介绍。
2.1 Eclipse 简介
Eclipse是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。Eclipse的设计思想:一切皆为插件。其底层封装了一个核心,其他功能都基于此核心写成插件。从而扩展整个Eclipse的功能。
2.2 Java语言介绍
Java语言是一款面向对象的一款高级语言是由Sun Microsystems公司(现已被Oracle公司收购)。由James Gosling和同事们共同研发,并在1995年正式推出,据Oracle官方数据指数,目前全球已有上亿的系统是使用Java开发的。Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。
Java语言的优点:
(1)跨平台性:跨平台性是指软件可以不受计算机硬件和操作系统的约束而在任意计算机环境下正常运行。Java自带的虚拟机很好地实现了跨平台性。
(2)简单:Java语言是一种相当简洁的“面向对象”程序设计语言。
(3)面向对象:面向对象技术使得应用程序的开发变得简单易用,节省代码。
(4)安全性:Java编译时要进行Java语言和语义的检查,保证每个变量对应一个相应的值,编译后生成Java类。
(5)多线程:是一种轻量级进程,是现代程序设计中必不可少的一种特性。多线程处理能力使得程序能够具有更好的交互性、实时性。
因此,在进行后台系统开发时采用了Java语言。
2.3 MySQL简介
MySQL是一种DBMS,而且是一种一个小型的开源的关系型数据库管理系统。2008年1月16日MySQL AB被Sun公司收购。而2009年,SUN又被Oracle收购。就这样如同一个轮回,MySQL成为了Oracle公司的另一个数据库项目。
MySQL它在世界范围内得到了广泛的安装和使用,应该是使用人数最多的数据库软件了,因为它有着这样的特性:
成本——MySQL是开源软件,可以免费使用和修改。
性能——MySQL性能很好处理速度很快。
简单——MySQL很容易安装和使用,对新手友好。
MySQL数据库软件也是使用最常用的数据库管理语言:结构化查询语言(SQL)进行数据库管理和操作。
2.4 JDBC技术简介
JDBC是一种用于SQL语句的Java API,由一组类和接口组成,通过调用这些类和接口所提供的方法,可以使用标准的SQL语言来存取数据库中的数据。
SUN公司为了简化、统一对数据库的操作,定义了一套Java操作数据库的规范,称之为 ,JDBC不能直接操作数据库,JDBC通过接口加载数据库的驱动,然后操作数据库。JDBC:Java Data Base Connectivity,它主要由接口组成。组成JDBC的2个包为java.sql和javax.sql。开发JDBC应用需要这2个包的支持外,还需要导入相应JDBC的数据库实现(即数据库驱动)。
3 系统需求分析
3.1 系统可行性分析
(1)技术可行性
该程序使用Ecplise编辑器,采用Java语言,Java面向对象,GUI图形界面,MySQL数据库,技术上可行。
(2)操作可行性
该程序只需要用户安装Ecplise编译器并且配置环境变量就可以使用,GUI也在Ecplise编译器上安装了Windou Builder 插件,操作简单便捷。符合大部分用户的使用习惯。操作上是可行的。
(3)经济可行性
该程序使用的Ecplise和MySQl是免费的,可以满足项目的所有需求。所以经济上可行。
(4)法律可行性
法律上是合法的。
3.2 系统需求分析
1.用户进入系统
2.水果列表:增加水果,修改水果,删除水果
3.可以修改和添加水果编号,名称,单价,价格,删除水果通过删除编号完成
.数据保存在数据库中。
进入系统 |
水果列表 |
添加水果 |
修改水果 |
删除水果 |
水果编号 |
水果名称 |
计价单位 |
水果单价 |
水果编号 |
计价单位 |
水果单价 |
水果名称 |
水果编号 |
图3-1 管理功能模块图
3.3 组内成员分工
表3-1 组内成员分工情况表
序号 |
姓名 |
组内角色 |
小组分工 |
备注 |
1 |
赵新宇 |
项目经理 |
欢迎界面,操作界面,数据库 |
|
2 |
王子竞 |
编码师 |
界面测试,删除操作 |
|
3 |
刘增涛 |
架构师 |
添加和修改操作 |
|
说明:组内角色:组长为项目经理;其他人分别为编码、测试、架构师等。
3.4 进度安排
进度安排如表3-2所示。
表3-2 进度安排表
阶段 |
持续时间 |
阶段描述 |
输出 |
构思阶段 |
3h |
需求分析 |
需求说明,功能模块图 |
设计阶段 |
1天 |
系统设计 |
设计说明-可以画流程图;数据库设计 |
是现阶段 |
3天 |
编写代码 |
项目工程源代码 |
1天 |
系统测试 |
进行黑盒测试(功能测试)-测试说明 |
|
运行阶段 |
1天 |
部署、运行 |
系统使用说明、运维报告-答辩 |
4 系统设计
4.1 系统设计
(1)超市欢迎窗口实现后,接下来需要实现超市货物管理窗口的界面展示。该窗口可以通过JDialog组件来实现,这里可以定义一个继承自JDialog的抽象类,在类中需要使用JTable组件创建表格来显示水果列表,表格可以放在JScrollPane组件中。在表格下方需要定义标签、文本框以及按钮等组件。
(2)完成了货物管理窗口类的定义后,也可以定义一个测试类来查看显示效果。
(3)当系统的两个窗口界面都能够显示出后,接下来就要实现两个窗口中的具体功能。由于弹出窗口的功能实现比较简单,这里可以先实现货物管理的窗口中增删改的功能。水果信息中包含编号、名称等信息,所以可以定义一个类,来专门封装水果信息。在添加水果信息时,所添加的数据可以存储在集合中,所以可以定义一个用于存储数据的类,类中使用集合来存储数据。
(4)有了存储数据功能的类后,就需要实现在货物管理窗口中对水果数据的查询、添加和删除等操作。这里可以将实现这些操作功能的类通过包来分为3层,这3层分别用于存放数据操作的类、存放实现业务逻辑的服务类和实现管理员操作的控制类。
(5)实现了货物管理窗口中的功能后,接下来就可以实现单击“进入系统”按钮后,弹出货物管理界面功能了,此处可以创建一个类来处理单击按钮的监听事件。
(6)最后定义主函数,运行程序并输入数据进行测试。
4.2 数据库设计
根据系统需求分析设计了1张表,为水果信息表。具体信息如表4-1所示。
表4-1 管理员信息表
序号 |
字段名 |
数据类型 |
约束 |
是否为空 |
说明 |
1 |
Number |
varchar(10) |
主键 |
否 |
水果编号 |
2 |
Name |
varchar(10) |
|
否 |
水果名字 |
3 |
Price |
varchar(110) |
|
否 |
水果单价 |
4 |
Unit |
varchar(10) |
|
否 |
计价单位 |
5 系统实现
5.1 系统代码实现
//AbstractMainFrame.java
package cn.itcaseruitstore.view;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import cn.itcasefruitstore.tools.GUITools;
/*
* 欢迎界面的抽象类
*/
@SuppressWarnings("serial")
public abstract class AbstractMainFrame extends JFrame{
//组件
private JLabel titleLable=new JLabel(new ImageIcon("FruitStore.jpg"));
private JButton btn=new JButton("进入系统");//顾客按钮
//构造方法
public AbstractMainFrame(){
//初始化界面操作
this.init();
//添加组件
this.addComponent();
//添加事件监听器
this.addListener();
}
//初始化操作
private void init(){
this.setTitle("水果超市欢迎您!");//标题
this.setSize(600, 400);//窗口的大小
GUITools.center(this);//窗口的位置,在屏幕中央显示//调用GUITools//居中用类名,在GUITools中的center用静态方法,静态方法被调用时用的类名而不是方法名
GUITools.setTileImage(this, "title.png");//设置窗口的小图标
this.setResizable(false);//窗口大小固定
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
//添加组件
private void addComponent(){
//窗体使用的默认的边界布局,北区放入图片
this.add(titleLable,BorderLayout.NORTH);
//创建JPanel面板对象
JPanel btnPanel=new JPanel();
//设置面板的布局方式为没有布局管理器
btnPanel.setLayout(null);
//设置按钮的位置与大小
btn.setBounds(240, 20, 120, 50);
//添加按钮到面板中
btnPanel.add(btn);
//添加面板到窗体中
this.add(btnPanel);
}
//添加事件监听器
private void addListener(){
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {//重写actionPerformed
// 展示管理员的界面
showAdminDialog();//调用showAdminDialog
}
});
}
// 展示管理员的界面
public abstract void showAdminDialog();//管理对话框定义为抽象方法
}
//AbstractMainFrameTest.java
package cn.itcase.fruitstore.test;
import cn.itcase.fruitstore.view.AbstractMainFrame;
/**
* 主界面的测试类
*
*/
@SuppressWarnings("serial")
public class AbstractMainFrameTest extends AbstractMainFrame {//抽象类,继承于AbstractMainFrame
//定义主函数
public static void main(String[] args) {
new AbstractMainFrameTest().setVisible(true);//生成对象,setVisible(true)显示窗体
}
//覆盖父类中展示管理员界面的方法
@Override
public void showAdminDialog() {
System.out.println("进入到管理员界面");
}
}
// GUITools.java
package cn.itcase.fruitstore.tools;
import java.awt.Component;
import java.awt.Toolkit;
import javax.swing.JFrame;
/**
* 工具类
*
*/
public class GUITools {
//Java提供的GUI默认工具类对象
public static Toolkit kit=Toolkit.getDefaultToolkit();
//指定组件屏幕居中
public static void center(Component c){//center用的静态方法,在AbstractMainFrame中被调用时用类名
int x=(kit.getScreenSize().width-c.getWidth())/2;
int y=(kit.getScreenSize().height-c.getHeight())/2;
c.setLocation(x, y);
}
//为指定窗体设置小图标
public static void setTileImage(JFrame frame,String titleIconPath){//为JFrame frame设置图标,在String titleIconPath中
frame.setIconImage(kit.createImage(titleIconPath));//为窗体创建了图标
}
}
//JDBCUtils.java
package cn.itcase.fruitstore.tools;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 工具类
*/
public class JDBCUtils {
// 加载驱动,并建立数据库连接
public static Connection getConnection() throws SQLException,//静态的,不需要生成对象//抛出SQL异常
ClassNotFoundException {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/jdbc";
String username = "root";
String password = "yyb123456";
Connection conn = DriverManager.getConnection(url, username, password);//驱动管理器DriverManager.getConnection加载
return conn;
}
// 关闭数据库连接,释放资源
public static void release(Statement stmt, Connection conn) {
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt = null;
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
public static void release(ResultSet rs, Statement stmt, Connection conn) {//方法的重载
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
release(stmt, conn);
}
}
// AbstractAdminDialog.java
package cn.itcase.fruitstore.view;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import cn.itcase.fruitstore.tools.GUITools;
@SuppressWarnings("serial")
public abstract class AbstractAdminDialog extends JDialog{
//定义界面使用到的组件,作为成员变量
private JLabel tableLabel=new JLabel("水果列表");//水果列表表格标题//private仅限类内调用
private JScrollPane tablePanel=new JScrollPane();//表格滚动面板
protected JTable table=new JTable();//水果列表表格
private JLabel numberLabel=new JLabel("水果编号");//水果编号标题
private JLabel nameLabel=new JLabel("水果名称");//水果名称标题
private JLabel priceLabel=new JLabel("水果单价");//水果单价标题
private JLabel unitLabel=new JLabel("计价单位");//计价单位标题
//添加功能组件
protected JTextField addNumberText=new JTextField(6);//添加编号文本框
protected JTextField addNameText=new JTextField(6);//添加名称文本框
protected JTextField addPriceText=new JTextField(6);//添加单价文本框
protected JTextField addUnitText=new JTextField(6);//添加计价单位文本框
private JButton addBtn =new JButton("添加水果");//添加按钮
//修改功能组件
protected JTextField updateNumberText=new JTextField(6);//修改编号文本框
protected JTextField updateNameText=new JTextField(6);//修改名称文本框
protected JTextField updatePriceText=new JTextField(6);//修改单价文本框
protected JTextField updateUnitText=new JTextField(6);//修改计价单位文本框
private JButton updateBtn =new JButton("修改水果");//修改按钮
//删除功能组件
protected JTextField delNumberText=new JTextField(6);//删除编号文本框
private JButton delBtn =new JButton("删除水果");//删除按钮
//构造方法
public AbstractAdminDialog() {
this(null,true);
}
public AbstractAdminDialog(Frame owner, boolean modal) {
super(owner, modal);
this.init();//初始化操作
this.addComponent();//添加组件
this.addListener();//添加监听器
}
//初始化方法
private void init(){
this.setTitle("超市货物管理");//标题
this.setSize(600,400);//窗体大小
GUITools.center(this);//窗体居中显示
this.setResizable(false);//窗体大小固定
}
//添加组件
private void addComponent(){
//取消布局管理器
this.setLayout(null);
//表格标题
tableLabel.setBounds(265, 20, 70, 25);
this.add(tableLabel);
//表格
table.getTableHeader().setReorderingAllowed(false);//列不能移动
table.getTableHeader().setResizingAllowed(false);//不可拉动表格
table.setEnabled(false);//不可更改数据
tablePanel.setBounds(50, 50,500, 200);
tablePanel.setViewportView(table);//滚动面板显示表格数据
this.add(tablePanel);
//字段标题
numberLabel.setBounds(50, 250, 70, 25);
nameLabel.setBounds(150, 250, 70, 25);
priceLabel.setBounds(250, 250, 70, 25);
unitLabel.setBounds(350, 250, 70, 25);
this.add(numberLabel);
this.add(nameLabel);
this.add(priceLabel);
this.add(unitLabel);
//增加组件
addNumberText.setBounds(50, 280, 80,25);
addNameText.setBounds(150, 280, 80,25);
addPriceText.setBounds(250, 280, 80,25);
addUnitText.setBounds(350, 280, 80,25);
addBtn.setBounds(460, 280, 90,25);
this.add(addNumberText);
this.add(addNameText);
this.add(addPriceText);
this.add(addUnitText);
this.add(addBtn);
//修改组件
updateNumberText.setBounds(50, 310, 80,25);
updateNameText.setBounds(150, 310, 80,25);
updatePriceText.setBounds(250, 310, 80,25);
updateUnitText.setBounds(350, 310, 80,25);
updateBtn.setBounds(460, 310, 90,25);
this.add(updateNumberText);
this.add(updateNameText);
this.add(updatePriceText);
this.add(updateUnitText);
this.add(updateBtn);
//删除组件
delNumberText.setBounds(50, 340, 80,25);
delBtn.setBounds(460, 340,90,25);
this.add(delNumberText);
this.add(delBtn);
}
//添加监听器
private void addListener(){
//添加按钮
addBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {//重写actionPerformed
//调用添加方法
addFruitItem();
}
});
//修改按钮
updateBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//调用修改方法
updateFruitItem();
}
});
//删除按钮
delBtn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//调用删除方法
delFruitItem();
}
});
}
//查询方法 //具体实现定义为抽象,只有界面,没有实现方法,在AbstractAdminDialogTest中实现
public abstract void queryFruitItem();
//添加方法
public abstract void addFruitItem();
//修改方法
public abstract void updateFruitItem();
//删除方法
public abstract void delFruitItem();
}
//AbstractAdminDialogTest.java
package cn.itcase.fruitstore.test;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import cn.itcase.fruitstore.view.AbstractAdminDialog;
/*
* 管理界面的测试类
*/
@SuppressWarnings("serial")
public class AbstractAdminDialogTest extends AbstractAdminDialog {
//定义构造函数初始化数据
public AbstractAdminDialogTest() {
super () ;
queryFruitItem();//测试数据
}
//加入测试table数据
@Override
public void queryFruitItem() {
String[] thead={"水果编号","水果名称","水果单价(/元)","计数单位"};
String[][] tbody={
{"1","苹果","5.0","kg"},
{"2","葡萄","3.2","kg"},
{"3","雪梨","3.8","斤"},
{"4","泰国大榴莲","120","个"}
};
TableModel dataModel=new DefaultTableModel(tbody, thead);
table.setModel(dataModel);
}
//空方法,实现了抽象方法
@Override
public void addFruitItem() {
}
@Override
public void updateFruitItem() {
}
@Override
public void delFruitItem() {
}
}
//Fruitltem.java
package cn.itcase.fruitstore.domain;
/**
* 水果项数据模型
*/
public class FruitItem {
//属性
private String number;//编号
private String name;//名称
private double price;//单价
private String unit;//计价单位
//构造方法
public FruitItem() {//空构造方法
}
public FruitItem(String number, String name,double price, String unit) {
super();//无效,调用object
//参数初始化,给成员变量赋值
this.number = number;//this表示当前变量的成员变量
this.name = name;
this.price = price;
this.unit = unit;
}
//get set 方法
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public String getUnit() {
return unit;
}
public void setUnit(String unit) {
this.unit = unit;
}
}
//DataBase.java
package cn.itcase.fruitstore.data;
import java.util.ArrayList;
import cn.itcase.fruitstore.domain.FruitItem;
/**
* 存储数据的仓库(数据库)
*/
public class DataBase {
public static ArrayList<FruitItem> data=new ArrayList<FruitItem> ();
//初始数据
static{
data.add(new FruitItem("1","苹果",5.0,"kg"));//调用了带参的构造方法
}
}
//AdminDao.java
/*package cn.itcase.fruitstore.dao;
import java.util.ArrayList;
import cn.itcast.fruitstore.data.DataBase;
import cn.itcast.fruitstore.domain.FruitItem;
/**
* 管理员界面按钮操作,数据访问类
*/
public class AdminDao{
//获取所有数据
public ArrayList<FruitItem> queryAllData(){
return DataBase.data;
}
//添加数据
public void addFruitItem(FruitItem number){
DataBase.data.add(number);
}
//删除数据
public void delFruitItem(Object delNumber){
//查询集合中数据
for(int i=0;i<DataBase.data.size();i++){
FruitItem thisFruitItem=DataBase.data.get(i);
//如果有水果项的编号与传入编号相同,则从集合中删除
if(thisFruitItem.getName().equals(delNumber)){
DataBase.data.remove(i);
}
}
}
}
*/
package cn.itcast.fruitstore.dao;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
//import cn.itcast.fruitstore.data.DataBase;
import cn.itcast.fruitstore.domain.FruitItem;
import cn.itcast.fruitstore.tools.JDBCUtils;
/*
* 管理员数据访问类
*/
public class AdminDao {
// 获取所有数据
public ArrayList<FruitItem> queryAllData() {//返回值类型不变:集合
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
ArrayList<FruitItem> list = new ArrayList<FruitItem>();
try {
// 获得数据的连接
conn = JDBCUtils.getConnection();
// 获得Statement对象
stmt = conn.createStatement();
// 发送SQL语句
String sql = "SELECT * FROM fruit";
rs = stmt.executeQuery(sql);
// 处理结果集
while (rs.next()) {//定位到第一条记录
FruitItem fruitItem = new FruitItem();//生成水果对象
fruitItem.setNumber(rs.getString("number"));//赋值//把数据表的记录变成了集合中的一个元素
fruitItem.setName(rs.getString("name"));
fruitItem.setPrice(rs.getDouble("price"));
fruitItem.setUnit(rs.getString("unit"));
list.add(fruitItem);
}
return list;
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.release(rs, stmt, conn);
}
return null;
}
//添加数据
public void addFruitItem(FruitItem fruitItem) {//无返回值=数据返回到数据表
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
// 获得数据的连接
conn = JDBCUtils.getConnection();
// 获得Statement对象
stmt = conn.createStatement();
// 发送SQL语句
String sql = "INSERT INTO fruit(number,name,price,unit)"
+ "VALUES(" + fruitItem.getNumber() + ",'" + fruitItem.getName()
+ "','" + fruitItem.getPrice() + "','" + fruitItem.getUnit()+ "')";
int num = stmt.executeUpdate(sql);//更新
if (num > 0) {
System.out.println("插入数据成功!");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.release(rs, stmt, conn);
}
}
//删除数据
public void delFruitItem(String delNumber) {
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
// 获得数据的连接
conn = JDBCUtils.getConnection();
// 获得Statement对象
stmt = conn.createStatement();
// 发送SQL语句
String sql = "DELETE FROM fruit WHERE number=" + delNumber;
int num = stmt.executeUpdate(sql);
if (num > 0) {
System.out.println("删除数据成功!");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
JDBCUtils.release(rs, stmt, conn);//资源释放
}
}
}
//JDBCUtils.java
package cn.itcase.fruitstore.tools;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* 工具类
*/
public class JDBCUtils {
// 加载驱动,并建立数据库连接
public static Connection getConnection() throws SQLException,//静态的,不需要生成对象//抛出SQL异常
ClassNotFoundException {
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/jdbc?useUnicode=true&characterEncoding=utf8";
String username = "root";
String password = "root”
Connection conn = DriverManager.getConnection(url, username, password);//驱动管理器DriverManager.getConnection加载
return conn;
}
// 关闭数据库连接,释放资源
public static void release(Statement stmt, Connection conn) {
if (stmt != null) {
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt = null;
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn = null;
}
}
public static void release(ResultSet rs, Statement stmt, Connection conn) {//方法的重载
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
release(stmt, conn);
}
}
//AdminService.java
package cn.itcase.fruitstore.service;
import java.util.ArrayList;
import cn.itcase.fruitstore.dao.AdminDao;
import cn.itcase.fruitstore.domain.FruitItem;
/**
* 管理界面的按钮所对应功能的服务类
*/
public class AdminService {
private AdminDao adminDao =new AdminDao();
//查询功能服务
public ArrayList<FruitItem> queryFruitItem(){
//调用dao包中的获取所有数据方法的queryAllData()
ArrayList<FruitItem> data=adminDao.queryAllData();
//返回数值
return data;
}
//添加功能服务
public boolean addFruitItem(String number,String name,String price,String unit){
//调用dao中的获取所有数据的方法queryAllData()
ArrayList<FruitItem> data=queryFruitItem();
//使用输入的编号与所有的数据对比
for(int i=0;i<data.size();i++){
FruitItem fruitItem=data.get(i);
//如果存在重复编号数据,则添加不成功
if(number.equals(fruitItem.getNumber())){
return false;
}
}
//说明没有重复编号,将数据封装为FruitItem 对象
FruitItem thisFruitItem = new FruitItem(number, name,
Double.parseDouble(price), unit);
//调用dao中的添加数据方法addFruitItem
adminDao.addFruitItem(thisFruitItem);
//在添加数据之后,返回添加成功
return true;
}
//修改功能服务//修改后添加
public boolean updateFruitItem(String number,String name,String price,String unit){
//调用dao中的获取所有数据的方法queryAllData()
ArrayList<FruitItem> data=queryFruitItem();
for(int i=0;i<data.size();i++){
FruitItem fruitItem=data.get(i);
//如果存在相同编号数据,则可以更新
if(number.equals(fruitItem.getNumber())){
//调用dao的删除指定编号数据的方法delFruitItem()
adminDao.delFruitItem(number);
//封装新的FruitItem对象
FruitItem thisFruitItem=new FruitItem(number, name,
Double.parseDouble(price), unit);
//调用调用dao中的添加数据的方法addFruitItem
adminDao.addFruitItem(thisFruitItem);
//在修改数据后,返回添加成功
return true;
}
}
//如果不存在相同编号数据,则不可以更新
return false;
}
//删除功能服务
public boolean delFruitItem(String delNumber){
//调用dao中的获取所有数据的方法queryAllData()
ArrayList<FruitItem> data= queryFruitItem();
//使用输入的编号与所有的数据对比
for(int i=0;i<data.size();i++){
FruitItem fruitItem=data.get(i);
//如果存储相同编号地址,则可以删除
if(delNumber.equals(fruitItem.getNumber())){
//调用ado中删除指定数据的方法delFruitItem
adminDao.delFruitItem(delNumber);
//在删除数据之后,返回删除成功
return true ;
}
}
//如果存在重复编号数据,则不可以删除
return false;
}
}
//AdminDialogController.java
package cn.itcase.fruitstore.controller;
import java.awt.Frame;
import java.util.ArrayList;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
import cn.itcase.fruitstore.domain.FruitItem;
import cn.itcase.fruitstore.service.AdminService;
import cn.itcase.fruitstore.view.AbstractAdminDialog;
/**
* 管理员界面按钮操作类(界面抽象类的实现类)
*/
@SuppressWarnings("serial")
public class AdminDialogController extends AbstractAdminDialog {
//定义服务类,提供完整功能服务
private AdminService adminService=new AdminService();
//构造方法
public AdminDialogController() {//空
super();
}
public AdminDialogController(Frame owner, boolean modal) {//有参数的。数据框来自的地方,模态的
super(owner, modal);
//调用查询方法
queryFruitItem();
}
//查询方法
@Override//覆写父类抽象的方法(AbstractAdminDialog)
public void queryFruitItem() {
//定义表格头
String[] thead ={"水果编号","水果名称","水果单价(/元)","计价单位"};
//查询所有水果的查询服务 的方法queryFruitItem()
ArrayList<FruitItem>dataList=adminService.queryFruitItem();
//将集合转换为二维数组
String[][]tbody=list2Array(dataList);
//把查询到的结果放到表格中
TableModel dataModel=new DefaultTableModel(tbody,thead);
table.setModel(dataModel);
}
//集合数据转为二维数组方法
public String[][] list2Array(ArrayList<FruitItem>list){
//根据FruitItem的Model与集合数据定义Jtable的二维数组
String[][] tbody=new String[list.size()][4];
for(int i=0;i<list.size();i++){
FruitItem fruitItem=list.get(i);
tbody[i][0]=fruitItem.getNumber();
tbody[i][1]=fruitItem.getName();
tbody[i][2]=fruitItem.getPrice()+"";
tbody[i][3]=fruitItem.getUnit();
}
return tbody;
}
//添加方法
@Override//覆写父类抽象的方法(AbstractAdminDialog)
public void addFruitItem() {
//获取界面文本框输入的数据
String addNumber=addNumberText.getText();//文本框的名称addNumberText
String addName=addNameText.getText();
String addprice=addPriceText.getText();
String addUnit=addUnitText.getText();
//调用adminService的添加服务方法
boolean addSuccess=adminService.addFruitItem(addNumber,addName,addprice,addUnit);
//根据添加是否成功
if(addSuccess){
//添加成功,刷新表格
queryFruitItem();
}else{
//添加失败,弹出窗口错误提醒
JOptionPane.showMessageDialog(this, "水果编号不能重复,请监测数据!");
}
}
//修改方法
@Override
public void updateFruitItem() {
//获取界面文本框输入的数据
String updateNumber=updateNumberText.getText();
String updateName=updateNameText.getText();
String updateprice=updatePriceText.getText();
String updateUnit=updateUnitText.getText();
//调用adminService的修改服务方法
boolean updateSuccess=adminService.updateFruitItem(updateNumber, updateName, updateprice, updateUnit);
//根据修改是否成功
if(updateSuccess){
//修改成功,刷新表格
queryFruitItem();
}else{
//修改失败,弹出窗口错误提醒
JOptionPane.showMessageDialog(this, "没有这个编号的水果,请检查数据!");
}
}
//删除方法
@Override
public void delFruitItem() {
//获取界面文本框输入的数据
String delNumber= delNumberText.getText();
//调用adminService的删除服务方法
boolean delSuccess=adminService.delFruitItem(delNumber);
//根据删除是否成功
if(delSuccess){
//删除成功,刷新表格
queryFruitItem();
}else{
//删除失败,弹出窗口错误提醒
JOptionPane.showMessageDialog(this, "没有这个编号的水果,请检查数据!");
}
}
}
// MainFrameController.java
package cn.itcase.fruitstore.controller;
import cn.itcase.fruitstore.view.AbstractMainFrame;
/**
* 欢迎界面按钮操作界面类(抽象类界面的实现类)
*/
@SuppressWarnings("serial")
public class MainFrameController extends AbstractMainFrame {
@Override
public void showAdminDialog() {
//在该方法中进入管理员界面并显示
//this为父窗口(主界面) true:设置为模态窗口展示
new AdminDialogController(this,true).setVisible(true);//第二个界面
}
}
//MainApp.java
package cn.itcase.fruitstore.app;
import cn.itcase.fruitstore.controller.MainFrameController;
/**
* 项目运行入口
*/
public class MainApp {
public static void main(String[] args) {
//进入欢迎界面
new MainFrameController().setVisible(true);//通过MainFrameController调用主界面
}
}
5.2 系统界面实现
进入系统后对水果进行相关操作
图5-1进入系统界面
图5-2功能模块
图5-3添加水果模块
图5-4数据库显示模块
图5-5修改水果模块
图5-5 数据库修改显示
图5-6删除错误显示
图5-6数据库删除成功
6 系统测试
。
表6-1 模块测试表
编号 |
测试功能 |
输入描述 |
预期结果 |
运行结果 |
01 |
添加功能 |
添加名字,编号,单价,计价单位 |
数据库中有 |
正常,与预期结果一致 |
02 |
修改功能 |
修改名字,编号,单价,计价单位 |
从数据库中修改 |
正常,与预期结果一致 |
03 |
删除功能 |
删除编号 |
可以从数据库中删除 |
正常,预期结果一致 |
管理员模块测试主要是针对用户的操作,从测试结果中可以看出该模块的所有功能均能正常实现,且测试结果与预期结果一致。
下面这部分是总结
主要是对该课题设计并实现的所有功能模块进行测试,并给出测试表格和验证结果。结果表明本课题经过测试,所有功能都符合需求分析并且均能正常实现。
7 结论和心得
学生1姓名:赵新宇
心得:作为新分出来的一个组,因为一开始大家基础都很差,做一个系统其实是很艰难的。虽然大家都是第一次合作,但是都很积极配合,不会的东西也会积极地去学习,真正的体会到了小组合作的力量。做项目的时候有许多的磕磕绊绊,比如GUI,都是去新学的,还有数据库调试了好多个小时才调试好。还得感谢其他组的同学帮助我调试数据库。在今后的学习中也会继续努力,提升自己的知识水平。最后非常感谢老老师对我们的指导和帮助。
学生2姓名:刘增涛
心得:这次项目需要小组成员的紧密配合,尽管分配的任务不完全相同,但是在项目开发中都是平等的。通过本项目地开发,我对软件工程有了基本的了解、在这次项目完成中,我了解到遇到困难一定要迎难而上,不畏惧,不逃避,才能得到真正的锻炼,也要时刻和小组的成员保持交流。
学生3姓名:王子竞
心得:当我第一次听说要做综合项目的时候,我的内心是抗拒的。老实说,我不适应疫情期间的看视频上课的学习方式,也是自控能力的不足吧,所以java的学习并不是很好,基础不牢固,但是必须要做综合项目课程设计,没有办法,只能自己多花时间把落下的补回来,和另外两个同学新组成的小组,挑战开始了。一个java项目是需要我们通力合作的,各司其职,充分发挥自己所学,遇到困难解决困难,才能最终完成项目。通过这次课程设计,我懂得了团队协作的重要性,毕竟一个人的力量是有限的,只有通过大家集思广益,才能更快更好的解决问题