JDBC和GUI实现图书管理系统

news2024/11/24 14:53:35

1.介绍

        主要通过gui页面实现了与mysql数据库实现交互,跟以前写的图书管理系统相比就是从存在集合中变成了存在数据库中.

下面我来介绍一下主要功能吧:        

1.1.通过基本信息添加图书:

1.2.通过ID修改图书

1.3.通过ID查询图书

1.4.通过ID删除图书

2.构建数据库

2.1建库

create database wjq default charset utf8mb4;

2.2建表

create table books
(
    book_id int auto_increment
        primary key,
    title   varchar(100)   not null,
    author  varchar(100)   not null,
    price   decimal(10, 2) not null
);

3.java代码

主要是代码简单,我就没必要高内聚了,我就全部写在同一个代码了

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.sql.*;

public class BookManagementSystem extends JFrame {

    private JTextField tfBookID;
    private JTextField tfTitle;
    private JTextField tfAuthor;
    private JTextField tfPrice;
    private JTextArea taResult;

    public BookManagementSystem() {
        setTitle("图书管理系统");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setSize(400, 400);
        setLayout(new FlowLayout());

        JLabel lblBookID = new JLabel("图书ID:");
        tfBookID = new JTextField(10);
        JLabel lblTitle = new JLabel("书名:");
        tfTitle = new JTextField(10);
        JLabel lblAuthor = new JLabel("作者:");
        tfAuthor = new JTextField(10);
        JLabel lblPrice = new JLabel("价格:");
        tfPrice = new JTextField(10);
        JButton btnAdd = new JButton("增加");
        JButton btnDelete = new JButton("删除");
        JButton btnUpdate = new JButton("修改");
        JButton btnSearch = new JButton("查询");
        taResult = new JTextArea(10, 30);
        taResult.setEditable(false);

        add(lblBookID);
        add(tfBookID);
        add(lblTitle);
        add(tfTitle);
        add(lblAuthor);
        add(tfAuthor);
        add(lblPrice);
        add(tfPrice);
        add(btnAdd);
        add(btnDelete);
        add(btnUpdate);
        add(btnSearch);
        add(new JScrollPane(taResult));

        btnAdd.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String bookID = tfBookID.getText();
                String title = tfTitle.getText();
                String author = tfAuthor.getText();
                String price = tfPrice.getText();
                if (!bookID.isEmpty() && !title.isEmpty() && !author.isEmpty() && !price.isEmpty()) {
                    addBook(bookID, title, author, price);
                }
                // 清除文本框内容
                tfBookID.setText("");
                tfTitle.setText("");
                tfAuthor.setText("");
                tfPrice.setText("");
            }
        });

        btnDelete.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String bookID = tfBookID.getText();
                if (!bookID.isEmpty()) {
                    deleteBook(bookID);
                }
                // 清除文本框内容
                tfBookID.setText("");
            }
        });

        btnUpdate.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String bookID = tfBookID.getText();
                String title = tfTitle.getText();
                String author = tfAuthor.getText();
                String price = tfPrice.getText();
                if (!bookID.isEmpty() && !title.isEmpty() && !author.isEmpty() && !price.isEmpty()) {
                    updateBook(bookID, title, author, price);
                }
                // 清除文本框内容
                tfBookID.setText("");
                tfTitle.setText("");
                tfAuthor.setText("");
                tfPrice.setText("");
            }
        });

        btnSearch.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String bookID = tfBookID.getText();
                String title = tfTitle.getText();
                String author = tfAuthor.getText();
                searchBooks(bookID, title, author);
                // 清除文本框内容
                tfBookID.setText("");
                tfTitle.setText("");
                tfAuthor.setText("");
            }
        });
    }

    private void addBook(String bookID, String title, String author, String price) {
        try {
            //注册JDBC的驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            // 连接数据库
            Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/wjq", "root", "1234");

            // 插入语句
            String insert = "INSERT INTO books (book_id, title, author, price) VALUES (?, ?, ?, ?)";

            // 创建PreparedStatement对象
            PreparedStatement pstmt = conn.prepareStatement(insert);
            pstmt.setString(1, bookID);
            pstmt.setString(2, title);
            pstmt.setString(3, author);
            pstmt.setString(4, price);

            // 执行插入
            int rowsAffected = pstmt.executeUpdate();

            if (rowsAffected > 0) {
                taResult.setText("添加成功!");
            } else {
                taResult.setText("添加失败!");
            }

            // 关闭连接
            pstmt.close();
            conn.close();
        } catch (SQLException ex) {
            ex.printStackTrace();
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }

    private void deleteBook(String bookID) {
        try {
            // 连接数据库
            Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/wjq", "root", "1234");

            // 删除语句
            String delete = "DELETE FROM books WHERE book_id = ?";

            // 创建PreparedStatement对象
            PreparedStatement pstmt = conn.prepareStatement(delete);
            pstmt.setString(1, bookID);

            // 执行删除
            int rowsAffected = pstmt.executeUpdate();

            if (rowsAffected > 0) {
                taResult.setText("删除成功!");
            } else {
                taResult.setText("删除失败!");
            }

            // 关闭连接
            pstmt.close();
            conn.close();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }

    private void updateBook(String bookID, String title, String author, String price) {
        try {
            // 连接数据库
            Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/wjq", "root", "1234");

            // 更新语句
            String update = "UPDATE books SET title = ?, author = ?, price = ? WHERE book_id = ?";

            // 创建PreparedStatement对象
            PreparedStatement pstmt = conn.prepareStatement(update);
            pstmt.setString(1, title);
            pstmt.setString(2, author);
            pstmt.setString(3, price);
            pstmt.setString(4, bookID);

            // 执行更新
            int rowsAffected = pstmt.executeUpdate();

            if (rowsAffected > 0) {
                taResult.setText("修改成功!");
            } else {
                taResult.setText("修改失败!");
            }

            // 关闭连接
            pstmt.close();
            conn.close();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }

    private void searchBooks(String bookID, String title, String author) {
        try {
            // 连接数据库
            Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/wjq", "root", "1234");

            // 查询语句
            String query = "SELECT * FROM books WHERE (book_id = ? OR ? IS NULL) AND (title LIKE ? OR ? IS NULL) AND (author LIKE ? OR ? IS NULL)";

            // 创建PreparedStatement对象
            PreparedStatement pstmt = conn.prepareStatement(query);
            pstmt.setString(1, bookID);
            pstmt.setString(2, bookID);
            pstmt.setString(3, "%" + title + "%");
            pstmt.setString(4, title);
            pstmt.setString(5, "%" + author + "%");
            pstmt.setString(6, author);

            // 执行查询
            ResultSet rs = pstmt.executeQuery();

            // 处理查询结果
            StringBuilder sb = new StringBuilder();
            while (rs.next()) {
                String result = "图书ID: " + rs.getString("book_id") +
                        "\t书名: " + rs.getString("title") +
                        "\t作者: " + rs.getString("author") +
                        "\t价格: " + rs.getString("price");
                sb.append(result).append("\n");
            }
            if (sb.length() > 0) {
                taResult.setText(sb.toString());
            } else {
                taResult.setText("未找到符合条件的图书!");
            }

            // 关闭连接
            rs.close();
            pstmt.close();
            conn.close();
        } catch (SQLException ex) {
            ex.printStackTrace();
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new BookManagementSystem().setVisible(true);
            }
        });
    }
}

有什么不懂的,错误的欢迎私信和评论区指正和提问,谢谢大家 

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

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

相关文章

深圳市重点实验室申报要求-华夏泰科

深圳市重点实验室,以开展基础研究、应用基础研究、前沿技术研究,培养人才、支撑产业和社会发展为目标而建立。它为研究人员提供了一个独特的平台,提供了一个展示他们创新性研究的舞台。本文将深入探讨如何申报深圳市重点实验室,为…

VS2022配置Opencv

配置环境变量 配置路径 由于新版本VS属性管理器没有Microsoft.cpp.x64.user文件,可以选择直接在Debug x64进行配置 配置包含目录和库目录 配置链接器

SpringCloud(三)Sentinel、Seata、多级缓存

文章目录 Sentinel雪崩问题Sentinel与Hystrixsentinel使用案例限流规则流控模式流控效果热点参数限流 隔离和降级Feign整合Sentinel线程隔离熔断降级 授权规则与规则持续化自定义异常结果规则管理模式 Seata分布式事务问题理论基础CAP定理BASE理论 Seata架构部署TC服务微服务集…

KylinOSv10系统k8s集群启动mysql5.7占用内存高的问题

问题现象 麒麟系统搭建k8s集群 mysql的pod启动失败 describe查看ommkill,放大limit资源限制到30G依旧启动失败 系统 报错信息 原因 内存占用太高 open_files_limit初始化太高 解决: 1、更换镜像 链接: https://pan.baidu.com/s/1b9uJLcc5Os0uDqD1e…

使用vue-cli创建vue3工程

PS:创建前先查看 vue/cli 版本,确保 vue/cli 版本在4.5.0以上 如果不是4.5.0以上版本,可以通过如下命令进行 安装/升级: npm install -g vue/cli 创建vue3工程步骤如下: 1. 创建项目: ①选择存放项目的…

3DShape2VecSet主题论文集

一、3DShape2VecSet 1、论文信息 2、开源情况:已开源 3DShape2VecSet: A 3D Shape Representation for Neural Fields and Generative Diffusion Modelsg3DShape2VecSet: A 3D Shape Representation for Neural Fields and Generative Diffusion Modelshttps://1z…

车载网络诊断应如何测试?

文章目录 一、前言二、测试内容三、测试设备和台架方案四、测试脚本及工程五、其他一、前言 目前车上主流的网络有CAN、LIN、ETH(以太网)。 按照测试环境可以划分为单件测试,系统测试,整车测试。 我们来看下CAN和以太网的分层图: CAN的分层图: 以太网的分层图: 最好的…

《第一行代码Andorid》阅读笔记-第十三章(最终章)

这一部分是天气API的笔记,这本书最后会让你做一个天气的app程序 其他的无关紧要的部分我就不写了,这是因为我原本的笔记是在飞书上面的,同步到CSDN上的流程稍显复杂 天气API 1. 项目结构 类: MainActivity:主活动Wea…

Echarts热力/散点/面积地图和高德amap不得不说的故事

简单封装高德amap 只要涉及到地图开发,我们都需要依赖地图工具,常见的有谷歌地图、百度地图、高德地图。我们的项目里依赖高德地图JS API 2.0。 npm i amap/amap-jsapi-loader -s 在项目里,我们需要一个预加载好的地图loader方便我们随调随…

【消费战略】解读100个食品品牌|速溶咖啡精品化,“三顿半”承接强势需求!

可可,咖啡、茶饮,作为世 界三大饮料,被人们所熟知。一直以来,咖啡都被人们认定为是舶来。其实,中国的咖啡市场经过这么多年的培育和发展,已不同往昔。就拿上海来说,根据2021年《上海咖啡消费指数…

【算法】算法设计与分析 课程笔记 第三章 动态规划

1.1 动态规划简介 1.1.1 引例 动态规划算法和分治法类似,基本思想也是将待求解问题分解成若干个子问题,子问题可以以继续拆分,直到问题规模达到临界条件即可。多说无益,举个例子来解释一下: 这其实是一个多阶段图求最…

python 打包可执行文件-Nuitka详解

python 打包可执行文件-Nuitka详解 引言一、参数详解二、与pyinstaller对比三、打包总结 引言 Nuitka是用Python编写的优化Python编译器,它可以创建运行时不需要单独安装程序的可执行文件。简单易使用,与Python2(2.6、2.7)和Pyth…

3d环形图开发(vue3+vite+ts)

开发效果&#xff08;待完善&#xff09;&#xff1a; 技术支持&#xff1a; Echarts echarts-gl 安装&#xff1a; 注&#xff1a;echarts与echarts-gl版本需对应&#xff0c;可参考官网 pnpm add echarts4.9.0 echarts-gl1.1.2 组件封装&#xff1a; <template><…

unity操作_Camera c#

观察场景中Main Camera 的清除背景Clear Flags 第一种&#xff1a;Skybox天空盒渲染 制作3D游戏使用 第二种&#xff1a;Solid Color 制作2D游戏 第三种&#xff1a;Depth only 多个摄像机叠加渲染 相对重点学会多个摄像机设置Depth only使…

鸿蒙手表开发之使用adb命令安装线上包

#国庆发生的那些事儿# 鸿蒙手表开发之使用adb命令安装线上包 前言&#xff1a; 由于之前的哥们匆忙离职了&#xff0c;所以鸿蒙手表项目的新版本我临时接过来打包发布&#xff0c;基本上之前没有啥鸿蒙经验&#xff0c;但是一直是做Android开发的&#xff0c;在工作人员的指…

【FPGA零基础学习之旅#14】串口发送字符串

&#x1f389;欢迎来到FPGA专栏~串口发送字符串 ☆* o(≧▽≦)o *☆嗨~我是小夏与酒&#x1f379; ✨博客主页&#xff1a;小夏与酒的博客 &#x1f388;该系列文章专栏&#xff1a;FPGA学习之旅 文章作者技术和水平有限&#xff0c;如果文中出现错误&#xff0c;希望大家能指正…

DNSlog 注入简单笔记

无回显的盲注可以想办法回显到 dns 日志上&#xff1a; 1、打开 http://www.dnslog.cn 获取域名 2、注入&#xff1a; ?id1 and (select load_file(concat(//,(select database()),.3.mw0gxd.dnslog.cn/a)))-- 3、点击刷新得到回显&#xff1a;

机器学习笔记 - 两个静态手势识别的简单示例

一、关于手势识别 手势识别方法通常分为两类:静态或动态。 静态手势是那些只需要在分类器的输入处处理单个图像的手势,这种方法的优点是计算成本较低。动态手势需要处理图像序列和更复杂的手势识别方法。 进一步了解可以参考下面链接。 静态手势识别和动态手势识别的区别和技…

jpype 调用jar时,返回结果的中文乱码

解决方法&#xff1a; 在启动java虚拟机的参数上&#xff0c;加上 "-Dfile.encodingUTF-8"

MongoDB集群管理

1、副本集-Replica Sets 1.1、简介 MongoDB中的副本集&#xff08;Replica Set&#xff09;是一组维护相同数据集的mongod服务。 副本集可提供冗余和高 可用性&#xff0c;是所有生产部署的基础。 也可以说&#xff0c;副本集类似于有自动故障恢复功能的主从集群。通俗的讲就…