Java+SVNCloud+Mysql课程设计

文章目录

  • 1、主要内容
  • 2、所需准备
  • 3、与sql访问的中间类:SqlMessage
  • 4、窗口界面
  • 5、main方法

1、主要内容

课程设计,主要通过Javas wing创建窗口,jdbc连接云端mysql数据库进行基本操作,支持随机生成数据并用动态展示数据结果。

先来看一下实现效果:
在这里插入图片描述
在这里插入图片描述

2、所需准备

  1. 在SVNCloud上部署MySQL
  2. 下载所需Java包并导入到IDEA

请访问: SVNCloud 官网、JfreeChart下载、Mysql jar下载部署
等内容,形成类似以下的目录结构,若是代码建构过程发现错误,请仔细检查环境问题。
目录结构

3、与sql访问的中间类:SqlMessage

package Course_Design;
import java.sql.*;

class DataStruct{   //数据结构体根据数据库内容依次定义
    String tim;     //时间
    String tmp;     //温度
    String hum;     //湿度
    String lit;     //光强
}
public class SqlMessage {
    static DataStruct selected;     //选中的数据存储到这里
    static DataStruct prepared;     //即将改写的数据存到这里
    
    //查询语句等结构
    static Connection connection;
    static Statement statement;
    static PreparedStatement st;
    static ResultSet result;
    SqlMessage(){
        selected = new DataStruct();
        prepared = new DataStruct();
    }

    void SqlInit() throws SQLException, ClassNotFoundException{
        //  1.加载驱动
        Class.forName("com.mysql.cj.jdbc.Driver");
        //  2.用户信息和url,请注意加上useSSL = false,否则连接失败
        String url = "jdbc:mysql://sql.wsfdb.cn:3306/ Database(请改为你的数据库名称) ?useSSL=false";
        //url: jdbc:mysql:// + 目的地址 + 端口号 + 数据库名称? + 其他,这里请确保你在SVNCloud建立了数据库且可以通过navicat等工具正常连接
        String username="username";	//用户名
        String password="******";	//密码
        
        //  3.连接成功,数据库对象 Connection
        connection = DriverManager.getConnection(url,username,password);
        //  4.绑定
        statement = connection.createStatement();
    }

    void SendMessage(String sql)throws SQLException {       //发送sql语句(有结果集版本)
        result = statement.executeQuery(sql);
    }
    void upDate(String sql) throws SQLException {           //发送sql语句(无结果集版本)
        st = connection.prepareStatement(sql);
        System.out.println("execute:"+sql);
        int res = st.executeUpdate();
        if(res > 0){
            System.out.println("数据更新成功:"+res);
        }
        st.close();
    }
    void CloseAll()throws SQLException {		//关闭数据库
        statement.close();
        connection.close();
    }
}

4、窗口界面

package Course_Design;

import org.jfree.chart.ChartFactory;
import org.jfree.chart.ChartFrame;
import org.jfree.chart.JFreeChart;
import org.jfree.chart.plot.PlotOrientation;
import org.jfree.data.category.DefaultCategoryDataset;


import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import java.awt.*;
import java.awt.event.*;
import java.sql.SQLException;
import java.text.DecimalFormat;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Random;


public class MyWindow {
    static SqlMessage sys = new SqlMessage();
    static int connect_flag = 0;//是否连接数据库的标识,当连接数据库时,生成数据失效
    static JTextField Edit_tim; //时间文本区域
    static JTextField Edit_tmp; //温度文本区域
    static JTextField Edit_hum; //湿度文本区域
    static JTextField Edit_lit; //光强文本区域

    static JButton BTN_add = new JButton("添加数据"); //添加
    static JButton BTN_del = new JButton("删除数据"); //删除
    static JButton BTN_mod = new JButton("修改数据"); //修改
    static JButton BTN_sum = new JButton("生成数据"); //生成
    static JButton BTN_con = new JButton("连接/断开");//连接与断开SQL
    static JButton BTN_lad = new JButton("刷新");     //刷新数据
    static JFrame window = new JFrame("传感器信息操作系统");
    static JTable table;
    static MyTableModel model;
    private Box getPanel() { //绘制所有小控件
		//建议panel内部使用GridLayout布局,Panel之间使用Box布局更加美观

        Box Vbox1 = Box.createVerticalBox();
        Box Vbox2 = Box.createVerticalBox();
        Panel Vbox3 = new Panel(new GridLayout(3,2));
        Box Vbox4 = Box.createVerticalBox();
        Box Hbox  = Box.createHorizontalBox();

        JLabel label1 = new JLabel("时间:");
        Edit_tim = new JTextField(10);
        JLabel label2 = new JLabel("温度:");
        Edit_tmp = new JTextField(10);
        JLabel label3 = new JLabel("湿度:");
        Edit_hum = new JTextField(10);
        JLabel label4 = new JLabel(" 光强:");
        Edit_lit = new JTextField(10);

        //label 与 text edit 加入窗体
        Vbox1.add(label1);
        Vbox2.add(Edit_tim);
        Vbox1.add(label2);
        Vbox2.add(Edit_tmp);
        Vbox1.add(label3);
        Vbox2.add(Edit_hum);
        Vbox1.add(label4);
        Vbox2.add(Edit_lit);

        // 按键加入窗体,创建消息映射
        Vbox3.add(BTN_add); BTN_add.addActionListener(e -> On_BTN_add());
        Vbox3.add(BTN_del); BTN_del.addActionListener(e -> On_BTN_del());
        Vbox3.add(BTN_mod); BTN_mod.addActionListener(e -> On_BTN_mod());
        Vbox3.add(BTN_sum); BTN_sum.addActionListener(e -> On_BTN_sum());
        Vbox3.add(BTN_con); BTN_con.addActionListener(e -> On_BTN_con());
        Vbox3.add(BTN_lad); BTN_lad.addActionListener(e -> On_BTN_lad());

        Hbox.add(Vbox1);
        Hbox.add(Vbox2);

        Panel func = new Panel(new GridLayout(1,0));
        func.add(BTN_Func_Summon);BTN_Func_Summon.addActionListener(e -> On_BTN_Func_Summon());
        func.add(BTN_Func_Drawer);BTN_Func_Drawer.addActionListener(e -> On_BTN_Func_Drawer());
        Vbox4.add(func);
        Vbox4.add(Box.createVerticalStrut(70));
        Vbox4.add(Hbox);
        Vbox4.add(Box.createVerticalStrut(40));
        Vbox4.add(Vbox3);


        return Vbox4;
    }
    public void InitWindow(){   //初始化table主窗体
        window.setSize(600,400);
        window.setResizable(false);
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        // 初始化表格形式,选择信号为行选
        Object[][] tableData = new Object[0][4];    //表格内容
        String[] names = {"时间","温度","湿度","光强"};  //设置表头
        model = new MyTableModel(tableData,names);
        table = new JTable(model);
        table.getSelectionModel().setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        //设置table点击事件,点击即选中单行
        table.addMouseListener(new MouseListener() {
            @Override public void mouseClicked(MouseEvent e) {
                On_Table_clicked();
            }
            @Override public void mousePressed(MouseEvent e) {}
            @Override public void mouseReleased(MouseEvent e) {}
            @Override public void mouseEntered(MouseEvent e) {}
            @Override public void mouseExited(MouseEvent e) {}
        });

        //将table放入JScrollPane以便于滚动表格
        JScrollPane scrollPane = new JScrollPane(table);
        //开始布局控件
        JPanel panel1 = new JPanel();
        panel1.add(scrollPane);
        JPanel panel2 = new JPanel();
        panel2.add(getPanel());
        JPanel total = new JPanel();
        total.add(panel1);
        total.add(panel2);
        //加入控件
        window.add(total);
        window.pack();
        window.setVisible(true);
    }
    void On_BTN_add(){
        if (connect_flag == 0){
            Update_Field();
            model.addRow(GetObject());
        }
        else{
            String sql = "Insert Into visual_sensor values('"
                    +SqlMessage.prepared.tim+"',"
                    +SqlMessage.prepared.tmp+","
                    +SqlMessage.prepared.hum+","
                    +SqlMessage.prepared.lit+");";
            try {
                sys.upDate(sql);
                Update_Field();
                model.addRow(GetObject());
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }
    void On_BTN_del(){
        if(connect_flag == 0){
            int flag = table.getSelectedRow();
            if(flag == -1) {
                JOptionPane.showMessageDialog(null, "未选择删除元素", "错误",JOptionPane.ERROR_MESSAGE);
            }else{
                model.removeRow(table.getSelectedRow());
            }
        }else{
            String sql = "Delete from visual_sensor Where time='"
                    + SqlMessage.selected.tim + "' and temperature = "
                    + SqlMessage.selected.tmp + " and humidity = "
                    + SqlMessage.selected.hum + " and light = "
                    + SqlMessage.selected.lit + ";";
            try {
                sys.upDate(sql);
                model.removeRow(table.getSelectedRow());
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }
    void On_BTN_mod(){
        if (connect_flag == 0){
            On_BTN_del();
            On_BTN_add();
        }else{
            String sql = "Update visual_sensor set time = '"
            +SqlMessage.prepared.tim+ "', temperature = "
            +SqlMessage.prepared.tmp+ ", humidity = "
            +SqlMessage.prepared.hum+ ",light = "
            +SqlMessage.prepared.lit+ " where time = '"
            +SqlMessage.selected.tim+ "' AND temperature = "
            +SqlMessage.selected.tmp+ " AND humidity = "
            +SqlMessage.selected.hum+ " AND light = "
            +SqlMessage.selected.lit+ ";";
            try {
                sys.upDate(sql);
                //避免重复执行sql节约资源
                connect_flag = 0;
                On_BTN_del();
                On_BTN_add();
                connect_flag = 1;
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
    }
    void On_BTN_sum(){
        //生成数据并填入缓冲区
		//数据均采用两位小数
        //格式化时间 时:分:秒
        LocalTime time = LocalTime.now();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss");
        String tm = time.format(formatter);
        SqlMessage.prepared.tim = tm;
        //格式化湿度 0-1
        double rand1=Math.random();
        String hum="0";
        hum += new DecimalFormat(".00").format(rand1);
        SqlMessage.prepared.hum = hum;
        //格式化光强 0-600
        double rand21=Math.random();
        Random random = new Random();
        int rand22 = random.nextInt(600);
        String light = rand22 + new DecimalFormat(".00").format(rand21);
        SqlMessage.prepared.lit = light;
        //格式化温度 18-34
        double rand31=Math.random();
        int rand32 = random.nextInt(16)+18;
        String tmp = rand32 + new DecimalFormat(".00").format(rand31);
        SqlMessage.prepared.tmp = tmp;
        //打印提示信息
        System.out.println("Summon column as\t"+tm+"\t"+tmp+"\t"+hum+"\t"+light);
        ShowInfo();
    }
    void On_BTN_con(){
        //切换sql连接状态,默认关闭,点击开启后直接读取DB table信息并加载
        if(connect_flag == 0){
            try {
                sys.SqlInit();
                System.out.println("Connect sql successfully!");
                connect_flag =1;
            } catch (SQLException | ClassNotFoundException e) {
                System.out.println("Connect sql failed!");
                throw new RuntimeException(e);
            }
        }else{
            try {
                sys.CloseAll();
                System.out.println("Close sql successfully!");
                connect_flag = 0;
            } catch (SQLException e) {
                System.out.println("Close sql failed!");
                throw new RuntimeException(e);
            }
        }
    }
    void On_BTN_lad(){
        if(connect_flag == 1){
        String sql = "select * from visual_sensor;";
        try {
            sys.SendMessage(sql);
            model.setRowCount(0);
            while(SqlMessage.result.next()){
                //改为在窗口上显示
                Object[] ob = new Object[4];
                ob[0] = SqlMessage.result.getString("time");
                ob[1] = SqlMessage.result.getString("temperature");
                ob[2] = SqlMessage.result.getString("humidity");
                ob[3] = SqlMessage.result.getString("light");
                model.addRow(ob);
            }
            SqlMessage.result.close();
        }
        catch (SQLException e) {
            System.out.println("加载数据异常");
            throw new RuntimeException(e);
        }}else{
            JOptionPane.showMessageDialog(null, "请连接数据库后刷新", "错误",JOptionPane.ERROR_MESSAGE);
        }

    }
    void On_Table_clicked(){
        int flag = table.getSelectedRow();
        if (flag!= -1){
            SqlMessage.prepared.tim = table.getValueAt(flag,0).toString();
            SqlMessage.prepared.tmp = table.getValueAt(flag,1).toString();
            SqlMessage.prepared.hum = table.getValueAt(flag,2).toString();
            SqlMessage.prepared.lit = table.getValueAt(flag,3).toString();

            SqlMessage.selected.tim = SqlMessage.prepared.tim;
            SqlMessage.selected.tmp = SqlMessage.prepared.tmp;
            SqlMessage.selected.hum = SqlMessage.prepared.hum;
            SqlMessage.selected.lit = SqlMessage.prepared.lit;
            ShowInfo();
        }
    }
    void ShowInfo(){
        Edit_lit.setText(SqlMessage.prepared.lit);
        Edit_tmp.setText(SqlMessage.prepared.tmp);
        Edit_hum.setText(SqlMessage.prepared.hum);
        Edit_tim.setText(SqlMessage.prepared.tim);
    }
    Object[] GetObject(){
        Object[] ob = new Object[4];
        ob[0] = SqlMessage.prepared.tim;
        ob[1] = SqlMessage.prepared.tmp;
        ob[2] = SqlMessage.prepared.hum;
        ob[3] = SqlMessage.prepared.lit;
        return ob;
    }
    void Update_Field(){
        SqlMessage.prepared.tim = Edit_tim.getText();
        SqlMessage.prepared.tmp = Edit_tmp.getText();
        SqlMessage.prepared.hum = Edit_hum.getText();
        SqlMessage.prepared.lit = Edit_lit.getText();
    }

    //***********************************************生成与绘制功能模块主要内容**********************************************
    Timer timer = new Timer(1000, e -> {
        //1秒生成一个数据,通过模拟按键实现
        On_BTN_sum();
        Insert_DataSet();
        On_BTN_add();
    });
    static JButton BTN_Func_Summon = new JButton("生成器");
    static JButton BTN_Func_Drawer = new JButton("制表器");
    void On_BTN_Func_Summon(){
        if(!timer.isRunning()){
            timer.start();
            System.out.println("Timer running ... ...");
        }else{
            timer.stop();
            System.out.println("Timer stopped ... ...");
        }
    }

    DefaultCategoryDataset dataset = new DefaultCategoryDataset();
    void On_BTN_Func_Drawer(){
        JFreeChart chart = ChartFactory.createLineChart(
                "DataSet",
                "Collected Time",
                "Values(%)",
                dataset,
                PlotOrientation.VERTICAL,
                true,false,false
                );
        ChartFrame chartFrame = new ChartFrame("Course Design",chart);
        chartFrame.pack();
        chartFrame.setVisible(true);
    }
    void Insert_DataSet(){
        dataset.addValue((Double.parseDouble(SqlMessage.prepared.tmp)-18)/0.16,"temperature",SqlMessage.prepared.tim);
        dataset.addValue(Double.parseDouble(SqlMessage.prepared.hum)*100,"humidity",SqlMessage.prepared.tim);
        dataset.addValue(Double.parseDouble(SqlMessage.prepared.lit)/6,"light",SqlMessage.prepared.tim);
    }
}

class MyTableModel extends DefaultTableModel{
    //自己构建表格模型,删除表格内编辑属性
    @Override
    public boolean isCellEditable(int row, int column) {
        return false;
    }
    public MyTableModel(Object[][] data, Object[] columnNames) {
        setDataVector(data, columnNames);
    }
}

5、main方法

package Course_Design;
import java.sql.*;

public class Conn {
    public static void main(String[] args) throws SQLException, ClassNotFoundException {
        MyWindow window = new MyWindow();
        window.InitWindow();
    }
}
//请注意将上面三个类放在一个软件包里,并用packge 包名;

看到最后,如果觉得对你有帮助,不妨点个关注,到主页看看我的其他作品,欢迎下次光临。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机毕业设计 | springboot+vue会议室管理系统(附源码)

1,绪论 1.1 项目背景 随着企业规模的不断扩大,会议室管理愈加复杂。传统的手工预约会议室的方式已经无法满足现代企业的需求,因此,开发一套会议室系统方案变得尤为重要。会议室系统可以实现会议室的在线预约、会议室资源的有效利…

[SQL-SERVER:数据库安全及维护]:MSSM工具进行附加还原备份等操作

文章目录 目的介绍一、完整备份与还原(20分)1.将教师提供的TeachingDB数据库附加到个人使用的服务器上,并更名为TeachingDB_***(***为个人姓名)1.1 操作流程:将docker容器sqlserver数据库已有的mdf镜像文件…

C语言之旅:探索单链表

目录 一、前言 二、实现链表的功能: 打印 创建节点 尾插 尾删 头插 头删 查找 在指定位置之前插入数据 指定位置删除 在指定位置之后插入数据 打印 销毁 三、全部源码: 四、结语 一、前言 链表是一个强大且基础的数据结构。对于很多初…

Mac连接虚拟机(Linux系统)

1.确定虚拟机的IP地址 ifconfig //终端命令,查询ip地址 sudo apt install net-tools 安装完成后再次执行 ifconfig: 2.安装SSH(加密远程登录协议) (1).安装OpenSSH服务器软件包: sudo apt-get install openssh-ser…

Linux开发

建议大家使用 Linux 做开发 Linux 能用吗? 我身边还有些朋友对 linux 的印象似乎还停留在黑乎乎的命令行界面上。当我告诉他或者建议他使用 linux 时,会一脸惊讶的问我,那个怎么用(来开发或者日常使用)? …

鸿蒙开发接口资源管理:【@ohos.intl (国际化-Intl)】

国际化-Intl 说明:开发前请熟悉鸿蒙开发指导文档:gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。 本模块首批接口从API version 6开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。Intl模块…

LabVIEW如何确保步进电机的长期稳定运行

步进电机因其良好的定位精度和控制性,在自动化设备中得到了广泛应用。然而,长期稳定运行对于任何电机系统都是一个重要的挑战。LabVIEW作为一款强大的图形化编程语言,通过其灵活的控制算法和实时监控能力,为步进电机的稳定运行提供…

慢SQL的治理思路

慢SQL的治理思路 什么是慢SQL慢SQL产生的原因查看慢 SQL 是否开启开启慢 SQL 记录开启慢查询日志分析慢 SQL解决和优化慢SQL的方法 什么是慢SQL 慢 SQL 指的是 MySQL 中执行比较慢的 SQL,排查慢 SQL 最常用的方法是通过慢查询日志来查找慢 SQL。 MySQL 的慢查询日志…

【并发程序设计】14.消息队列

14.消息队列 消息队列(Message Queue)是一种通信机制,用于在分布式系统中传递和管理消息的队列型数据结构。 消息队列通常是一个先进先出(FIFO)的数据结构,它允许多个进程或线程之间以异步方式进行通信。…

Google力作 | Infini-attention无限长序列处理Transformer

更多文章,请关注微信公众号:NLP分享汇 原文链接:Google力作 | Infini-attention无限长序列处理Transformerhttps://mp.weixin.qq.com/s?__bizMzU1ODk1NDUzMw&mid2247485000&idx1&sne44a7256bcb178df0d2cc9b33c6882a1&chksm…

OpenCV 的几种查找图像中轮廓边缘的方法

原始图片: 1、Sobel() Sobel 算子结合了高斯平滑和微分,用于计算图像的梯度,从而突出显示边缘。 import cv2# 读取图像 image cv2.imread(image.png, cv2.IMREAD_GRAYSCALE)# 使用 Sobel 算子查找水平和垂直边缘 sobel_x cv2.Sobel(image…

浅谈旧项目如何添加新依赖

Spring项目创建之后,还想添加新的依赖(如Spring框架内置的依赖),可以安装插件: 装完该插件之后,就可以在pom.xml文件里,右键选择 Generate即可出现下述界面: 点击ok即可添加新的…

服务器硬件基础知识学习

服务器硬件基础知识涵盖了从CPU到存储,再到网络连接和总线技术等关键组件。 1. 处理器 - 两大流派:我们常用的处理器主要分为Intel和AMD两大阵营。Intel的Xeon系列和AMD的EPYC系列都是专为服务器设计的,它们支持多核处理,能够应对…

最新一站式AI创作中文系统网站源码+系统部署+支持GPT对话、Midjourney绘画、Suno音乐、GPT-4o文档分析等大模型

一、系统简介 本文将介绍最新的一站式AI创作中文系统(集成ChatGPTMidjourneySunoStable Diffusion)——星河易创AI系统,该系统基于ChatGPT的核心技术,融合了自然语言问答、绘画、音乐、文档分享、图片识别等创作功能,…

统信UOS桌面操作系统1070上使用notepad--文本编辑器

原文链接:统信UOS桌面操作系统1070上使用notepad–文本编辑器 Hello,大家好啊!今天我要向大家推荐一款在统信UOS桌面操作系统1070上非常好用的文本编辑器软件——“notepad–”。这款软件功能强大、操作简便,特别适合开发人员和日…

enum4linux一键查询SMB信息(KALI工具系列十六)

目录 1、KALI LINUX简介 2、enum4linux工具简介 3、在KALI中使用enum4linux 3.1 目标主机IP(win) ​编辑 3.2 KALI的IP 4、操作示例 4.1 运行工具 4.2 列出用户名 4.3 提取用户名 4.4 使用自定义RID范围 4.5 列出组 4.6 列出共享文件夹 4.7…

自动评论自动私信引流系统,自动化时代的挑战与机遇

随着科技的飞速发展,自动化技术已经渗透到我们生活的方方面面。从工业生产线上的机械臂到家庭中的智能助手,自动化不仅改变了我们的工作方式,也在重塑着社会的面貌。然而,在享受自动化带来的便利和效率的同时,我们也必…

时间序列的谱分解pt.2

16.dvi (berkeley.edu)https://www.stat.berkeley.edu/~bartlett/courses/153-fall2010/lectures/16.pdfpt1 时间序列的谱分解-CSDN博客

Linux--Socket编程基础

一、Socket简介 套接字( socket )是 Linux 下的一种进程间通信机制( socket IPC ), 使用 socket IPC 可以使得在不同主机上的应用程序之间进行通信(网络通信),当然也可以是同一台…

深度学习之加宽全连接

1.Functional API 搭建神经网络模型 1.1.利用Functional API编写宽深神经网络模型进行手写数字识别 import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.datasets import load_iris from sklearn.model_selection import train_test_spli…