JDBC实验测试

一、语言和环境

实现语言:Java。

环境要求:IDEA2023.3、JDK 17 、MySQL8.0、Navicat 16 for MySQL。

二、技术要求

该系统采用 SWING 技术配合 JDBC 使用 JAVA 编程语言完成桌面应用开发。

三、功能要求

某电商公司为了方便客服查看用户的订单信息,需开发一个用户订单管理系统。要求本系统实现以下功能:

  1. 启动程序后进入主界面,显示所有订单信息,效果如图 1 所示:

  • 2.在订单编号文本框中输入正确订单号显示该订单信息,如图 2

  • 3.选中某个订单后点击删除按钮,提示是否真的要删除,确定后删除该数据。如图 3:

4.删除成功后显示删除后订单信息。如图 4:

四、数据库设计 

数据库名为 OrderDb,表结构如下。

表 1 订单表(tb_order)

列名

 

含义

 

数据类型

 

约束(描述)

 

id

 

编号

 

int

 

主键,自动增长

 

name

 

商品名称

 

varchar(20)

 

非空

 

price

 

价格

 

decimal(5,2)

 

非空

 

orderID

 

所属订单单号

 

varchar(20)

 

非空

 

descinfo

 

描述

 

varchar(100)

 

 

五、具体要求及推荐实现步骤

创建数据库和表

创建订单实体类

创建 BaseDAO 类完成数据库的连接和关闭

创建 OrderDAO 完成对订单的查询与删除功能

创建 MainFrame 类并添加相应组件,完成界面设计

在 MainFrame 中添加 JTable 完成数据展示。

在 MainFrame 中添加 Jbutton 完成数据删除

在 MainFrame 中添加文本框完成单条数据搜索

六、注意事项

题目:物流跟踪管理系统 

该程序的评分标准如下:(测试时间90分钟)

10

数据库和表

 

正确创建数据库和表 6 分,测试数据 4 分。必须以分离数据库或脚本方式提交, 否则该项不得分

5

正确创建和编写实体类,包含所有属性及方法

10

正确创建并编写 BaseDAO 完成数据库的连接(5 分)和关闭(5 分)。

30

正确创建并编写 OrderDAO 完成数据查询与删除

 

10

列表数据查询

 

10

单条数据查询

 

10

数据删除

40

创建并编写 MainFrame 类完成界面设计及功能调用

 

5

图 1 中各个组件的设计

 

10

图 1 中数据展示

 

10

图 2 中单条数据并正确展示在 JTable 中

 

5

图 3 中单条数据删除询问

 

10

图 4 中数据删除并展示新数据在 Jtable 中。

5

总体编程技术

 

2

编码规范

 

3

注释完善

总分 

100 分

七、参考答案

(一)新建数据库orderdb,表tb_order,并插入实验数据

-- ------------------------------ Table structure for tb_order-- ----------------------------DROP TABLE IF EXISTS `tb_order`;CREATE TABLE `tb_order` (`id` int(11) NOT NULL AUTO_INCREMENT,`name` varchar(20) NOT NULL,`price` decimal(10,2) NOT NULL,`orderid` varchar(20) DEFAULT NULL,`descinfo` varchar(100) DEFAULT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8; -- ------------------------------ Records of tb_order-- ----------------------------INSERT INTO `tb_order` VALUES ('1', 'iphones Max', '8999.00', '5325781', '刘公保的订单');INSERT INTO `tb_order` VALUES ('2', '小米10', '3655.00', '20240405', '梁思琪的订单');INSERT INTO `tb_order` VALUES ('3', '华为荣耀10', '3200.00', '20241102', '曾炳粮的订单');

(二)Java Swing

新建com.hnjt.Bean.tb_order.java,具体代码如下。

package com.hnjt.Bean;public class tb_order {private int id;private String name;private double price;private int orderID;private String descinfo;public tb_order() {super();}public tb_order(int id, String name, double price, int orderID, String descinfo) {super();this.id = id;this.name = name;this.price = price;this.orderID = orderID;this.descinfo = descinfo;}public int getId() {return id;}public void setId(int id) {this.id = id;}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 int getOrderID() {return orderID;}public void setOrderID(int orderID) {this.orderID = orderID;}public String getDescinfo() {return descinfo;}public void setDescinfo(String descinfo) {this.descinfo = descinfo;}}

新建com.hnjt.BaseDAO.DbConnection.java,具体代码如下。

package com.hnjt.BaseDAO;
import java.sql.*;
import javax.swing.JOptionPane;public class DbConnection {//驱动类的类名private static final String DRIVERNAME="com.mysql.cj.jdbc.Driver";//连接数据的URL路径private static final String URL="jdbc:mysql://localhost:3306/orderdb?serverTimezone=GMT";//数据库登录账号private static final String USER="root";//数据库登录密码private static final String PASSWORD="123456";//加载驱动static{try {Class.forName(DRIVERNAME);} catch (ClassNotFoundException e) {e.printStackTrace();}}//获取数据库连接public static Connection getConnection() {try {return DriverManager.getConnection(URL,USER,PASSWORD);} catch (SQLException e) {e.printStackTrace();}return null;}//查询public static ResultSet query(String sql) {System.out.println(sql);//获取连接Connection connection=getConnection();PreparedStatement psd;try {psd = connection.prepareStatement(sql);return psd.executeQuery();} catch (SQLException e) {JOptionPane.showMessageDialog(null,"执行语句出错\n"+e.toString());e.printStackTrace();}return null;}//增、删、改、查public static int updataInfo(String sql) {System.out.println(sql);//获取连接Connection connection=getConnection();try {PreparedStatement psd=connection.prepareStatement(sql);return psd.executeUpdate();} catch (SQLException e) {JOptionPane.showMessageDialog(null,"执行语句出错\n"+e.toString());e.printStackTrace();}return 0;}//关闭连接public static void colse(ResultSet rs, Statement stmt, Connection  conn) throws Exception{try {if (rs != null){rs.close();}if (stmt != null){stmt.cancel();}if (conn != null) { conn.close(); }} catch (Exception e) {e.printStackTrace(); throw new Exception();}}
}

新建com.hnjt.OrderDAO.Update.java,具体代码如下。

package com.hnjt.OrderDAO;import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import com.hnjt.Bean.tb_order;
import com.hnjt.BaseDAO.DbConnection;
public class Update {//查询主页信息public Object[][] getMainInfo(String id) {String sql;if (id.equals("")) {sql = "select * from tb_order";}else {sql = "select * from tb_order WHERE orderid LIKE '"+id+"%';";}ResultSet re = DbConnection.query(sql);ArrayList<tb_order> list = new ArrayList<tb_order>();try {while (re.next()) {tb_order tb = new tb_order();tb.setId(re.getInt(1));tb.setName(re.getString(2));tb.setPrice(re.getDouble(3));tb.setOrderID(re.getInt(4));tb.setDescinfo(re.getString(5));list.add(tb);}} catch (SQLException e) {e.printStackTrace();}Object[][] ob = new Object[list.size()][5];for (int i = 0; i < list.size(); i++) {ob[i][0] = list.get(i).getId();ob[i][1] = list.get(i).getName();ob[i][2] = list.get(i).getPrice();ob[i][3] = list.get(i).getOrderID();ob[i][4] = list.get(i).getDescinfo();}return ob;}//删除数据public int addData(int id) {String sql = "DELETE FROM tb_order WHERE id='"+id+"';";return DbConnection.updataInfo(sql);}}

新建com.hnjt.Vive.MainFrame.java,具体代码如下。

package com.hnjt.Vive;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import com.hnjt.OrderDAO.Update;
import javax.swing.JButton;
public class MainFrame extends JFrame {private JTextField orderid;Update update = new Update();Object[] header = {"编号","商品名称","商品价格","订单编号","订单描述"};Object[][] data = update.getMainInfo("");DefaultTableModel df = new DefaultTableModel(data, header);public MainFrame() {super("物流跟踪管理系统");this.setBounds(0, 0, 700, 500);getContentPane().setLayout(null);this.setLocationRelativeTo(null);this.setResizable(false);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);JLabel title = new JLabel("物流跟踪管理系统");title.setFont(new Font("宋体", Font.BOLD, 40));title.setBounds(182, 13, 336, 50);getContentPane().add(title);JLabel orderid_text = new JLabel("订单编号");orderid_text.setBounds(14, 70, 72, 18);getContentPane().add(orderid_text);orderid = new JTextField();orderid.setBounds(80, 67, 179, 24);getContentPane().add(orderid);orderid.setColumns(10);JButton seach = new JButton("搜索");seach.setBounds(273, 66, 90, 27);getContentPane().add(seach);seach.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {if (orderid.equals("")) {JOptionPane.showMessageDialog(null, "请输入要查询的订单编号!");} else {String id = orderid.getText();data = update.getMainInfo(id);df.setDataVector(data, header);}}});JTable jTable = new JTable(df);JScrollPane scrollPane = new JScrollPane(jTable);scrollPane.setBounds(14, 104, 666, 302);getContentPane().add(scrollPane);JButton delete = new JButton("删除");delete.setBounds(590, 425, 90, 27);getContentPane().add(delete);delete.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {if (jTable.getSelectedColumn()<0) {JOptionPane.showMessageDialog(null, "请选择要删除的数据!");} else {int num = JOptionPane.showConfirmDialog(null, "您真的真的要删除吗?","温馨提示", 0,1);int id = Integer.parseInt(jTable.getValueAt(jTable.getSelectedRow(), 0).toString());if(num == JOptionPane.OK_OPTION){int result = update.addData(id);if (result>0) {JOptionPane.showMessageDialog(null, "删除成功!");orderid.setText("");} else {JOptionPane.showMessageDialog(null, "删除失败!");}}}}});}

新建com.hnjt.Test.Test.java,测试运行,具体代码如下。

package com.hnjt.Test;
import com.hnjt.Vive.MainFrame;
public class Test {public static void main(String[] args) {new MainFrame().setVisible(true);}
}

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/68765.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

外包公司名单一览表(成都)

大家好&#xff0c;我是苍何。 之前写了一篇武汉的外包公司名单&#xff0c;评论区做了个简单统计&#xff0c;很多人说&#xff0c;在外包的日子很煎熬&#xff0c;不再想去了。 有小伙伴留言说有些外包会强制离职&#xff0c;不行就转岗&#xff0c;让人极度没有安全感。 这…

一些硬件知识【2025/1/21】

小米2K摄像头拆解&#xff1a; 这种小转接板空余部分一般全部打上过孔&#xff1a; 摄像头下面的SENSOR,这一部分才是摄像头的核心&#xff1a; 干硬件多久跳槽一次比较合适&#xff1f;3年跳一次可以吗&#xff1f; eMCC存储芯片外面那一圈焊盘是做什么用的&#xff1f; 没有…

WPF实战案例 | C# WPF实现计算器源码

WPF实战案例 | C# WPF实现计算器源码 一、设计来源计算器应用程序讲解1.1 主界面1.2 计算界面 二、效果和源码2.1 界面设计&#xff08;XAML&#xff09;2.2 代码逻辑&#xff08;C#&#xff09;2.3 实现步骤总结 源码下载更多优质源码分享 作者&#xff1a;xcLeigh 文章地址&a…

如何在 Pytest 中使用命令行界面和标记运行测试

关注开源优测不迷路 大数据测试过程、策略及挑战 测试框架原理&#xff0c;构建成功的基石 在自动化测试工作之前&#xff0c;你应该知道的10条建议 在自动化测试中&#xff0c;重要的不是工具 在前文你已经初步尝试编写了代码和单元测试&#xff0c;并且想要确保它能正常运行。…

【HBuilderX 中 Git 的使用】

目录&#xff1a; 一&#xff1a;安装必要的版本控制工具二&#xff1a;把Github上的项目克隆到本地三&#xff1a;将本地的项目上传到Github上 一&#xff1a;安装必要的版本控制工具 1️⃣ 安装 TortoiseGit 工具&#xff0c;下载地址&#xff1a;https://tortoisegit.org/do…

浅谈 JVM

JVM 内存划分 JVM 内存划分为 四个区域&#xff0c;分别为 程序计数器、元数据区、栈、堆 程序计数器是记录当前指令执行到哪个地址 元数据区存储存储的是当前类加载好的数据&#xff0c;包括常量池和类对象的信息&#xff0c;.java 编译之后产生 .class 文件&#xff0c;运…

嵌入式学习(24)-STM32F407 Hal库IAP升级

一、概述 IAP是用户自己的程序在运行过程中对 User Flash的部分区域进行烧写&#xff0c;目的是为了在产品发布后可以方便地通过预留的通信口对产品中的固件程序进行更新升级。 通常 实现 IAP功能时&#xff0c;即用户程序运行中作自身的更新操作&#xff0c;需要在设计固件程序…

头歌实训作业 算法设计与分析-贪心算法(第1关:部分背包问题)

部分背包问题 设有编号为1、2、…、n的n个物品&#xff0c;它们的重量分别为w1、w2、…、wn&#xff0c;价值分别为v1、v2、…、vn&#xff0c;其中wi、vi&#xff08;1≤i≤n&#xff09;均为正数。 有一个背包可以携带的最大重量不超过W。求解目标&#xff1a;在不超过背包负…

第17章:Python TDD回顾与总结货币类开发

写在前面 这本书是我们老板推荐过的&#xff0c;我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后&#xff0c;我突然思考&#xff0c;对于测试开发工程师来说&#xff0c;什么才更有价值呢&#xff1f;如何让 AI 工具更好地辅助自己写代码&#xff0c;或许…

MyBatis 注解开发详解

MyBatis 注解开发详解 MyBatis 支持使用注解来进行数据库操作。注解方式将 SQL 语句直接写在 Java 接口中&#xff0c;通过注解来完成 CRUD&#xff08;增删改查&#xff09;操作&#xff0c;省去了使用 XML 配置的繁琐步骤。这种方式适合简单项目或快速原型开发&#xff0c;因…

OpenCV简介、OpenCV安装

OpenCV简介、OpenCV安装 本文目录&#xff1a; 零、时光宝盒 一、OpenCV简介 二、OpenCV图像处理基础知识 三、OpenCV-Python环境安装 2.1、纯python环境下安装OpenCV 2.2、Anaconda管理环境下安装 OpenCV 四、如何用OpenCV 中进行读取展示图像 五、OpenCV读取图像、显…

使用Chrome和Selenium实现对Superset等私域网站的截图

最近遇到了一个问题&#xff0c;因为一些原因&#xff0c;我搭建的一个 Superset 的 Report 功能由于节假日期间不好控制邮件的发送&#xff0c;所以急需一个方案来替换掉 Superset 的 Report 功能 首先我们需要 Chrome 浏览器和 Chrome Driver&#xff0c;这是执行数据抓取的…

react19新API之use()用法总结

React use() Hook 使用指南 概述 use() 是 React 19 引入的新 Hook&#xff0c;它允许你在组件内部直接使用 Promise、Context 和其他可订阅的值。它是一个更通用的数据获取和订阅机制。 基本语法 const value use(resource);主要用途 1. Promise 处理 function UserDet…

Netty到底是什么,解决了什么问题,Netty为什么会火,Netty有什么特性

Netty是一个高性能、异步事件驱动的网络应用框架&#xff0c;它基于Java NIO&#xff08;New Input/Output&#xff09;开发&#xff0c;并对Java NIO进行了封装和扩展。Netty的特性及其解决的问题可以归纳如下&#xff1a; 一、Netty的主要特性 优雅的设计&#xff1a;Netty…

算法专题(三):二分查找

本篇还是像之前一样&#xff0c;以举例子的形式向大家讲解&#xff01;每道题的题目均是传送门&#xff01;点击跳转对应题&#xff01; 目录 一、二分查找 1.1 题目 1.2 思路 1.3 代码实现 总结&#xff08;模版&#xff09; 朴素版&#xff1a; 二、在排序数组中查找…

EXCEL的一些用法记录

按某个分隔符进行拆分多列 【数据】- 【分列】 多列调整成多行 复制 - 粘贴 - 选择【转置】 部分内容替换 SUBSTITUTE()函数 &#xff0c;固定内容 加“”

在k8s中部署一个可外部访问的Redis Sentinel

1.前提条件&#xff1a; 1.部署了multus 想要k8s外部能访问k8s内部的redis&#xff0c;redis-server启动时必须使用multus的IP 2.helm客户端安装 2.开始安装 准备3个multus ip 10.10.10.130 10.10.10.131 10.10.10.132 apiVersion: k8s.cni.cncf.io/v1 kind: NetworkAttac…

使用tritonserver完成clip-vit-large-patch14图像特征提取模型的工程化。

1、关于clip-vit-large-patch14模型 关于openapi开源的clip-vit-large-patch14模型的特征提取&#xff0c;可以参考之前的文章&#xff1a;Elasticsearch向量检索需要的数据集以及768维向量生成这篇文章详细介绍了模型的下载地址、使用方式、测试脚本&#xff0c;可以让你一步…

偏序关系.

一、偏序&#xff08;半序&#xff09;关系 偏序关系 自反反对称传递性 二、全序&#xff08;线序、链&#xff09;关系 三、偏序集中的重要元素 1. 极大元与极小元 极大元找所在集合的一个或几个最高点&#xff1b; 极小元找所在集合的一个或几个最低点。 2. 最大元与最小…

2024嵌入式系统的未来发展与技术洞察分享

时间如白驹过隙&#xff0c;不知不觉又是一年&#xff0c;这一年收获满满。接下来&#xff0c;将本年度对技术的感悟和洞察分析如下&#xff0c;希望对大家有所帮助。 在过去几十年里&#xff0c;嵌入式系统技术迅速发展&#xff0c;成为现代电子设备和智能硬件的核心组成部分。…