网上书店管理系统项目【Java数据库编程实战】

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS PostgreSQL,高可用系列 2核4GB
简介: 网上书店管理系统项目【Java数据库编程实战】

最近学习完数据库系统,一直在写实战项目-网上书店管理系统。其功能一般包括:图书信息管理、用户信息管理、图书购买、图书订单查看、图书添加、图书维护等等。现在做一个总结。 **源码及搭建教程已经上传至资源!仅供下载学习。下载


@toc

1.效果展示

2.需求功能

用户可以进行注册登陆系统,在用户的界面上,其可以进行查看网上书店里的图书类别和所在类别下的图书,根据自己的需求可在订单项目里添加订单购买自己喜欢的图书;

管理员可以通过自己的账号登录到管理员系统对书店进行管理,其可实现对图书的添加,修改,查询,和删除功能,可以查看用户的订单,修改和维护订单。添家客户的信息用以统计数据。

在构造系统时,首先从需求出发构造数据库,然后再由数据库表结合需求划分系统功能模块。这样,就把一个大的系统解成了几个小系统。这里把系统划分为了三个模块:用户登录模块,管理员模块,用户购买模块。模块分别能够实现以下功能:

  1. 登录模块:实现登录,注册功能。
  2. 管理员模块:实现对图书的添加修改和删除以及对订单的添加修改和删除功能。
  3. 用户购买模块:实现对图书的查找以及对所需图书的下单功能。

3.系统总体设计及部分代码

3.1登录模块设计

用户正确输入用户名和密码,连接到数据库,登录成功!

private void loginActionPerformed(ActionEvent evt) {
       String userName=this.userNameTxt.getText();
    String password=new String(this.passwordTxt.getPassword());
    if(StringUtil.isEmpty(userName)){
      JOptionPane.showMessageDialog(null, "用户名不能为空!");
      return;
    }
    if(StringUtil.isEmpty(password)){
      JOptionPane.showMessageDialog(null, "密码不能为空!");
      return;
    }
    CUser cuser=new CUser(userName,password);
    Connection con=null;
    try {
      con=dbUtil.getCon();
      CUser currentCUser =cuserDao.login(con,cuser);
      if(currentCUser!=null){
        dispose();
        new CMainFrm().setVisible(true);
      }else{
        JOptionPane.showMessageDialog(null, "用户名或者密码错误!");
      }
    } catch (Exception e) {
      // TODO 自动生成的 catch 块
      e.printStackTrace();
    }

3.2新用户的注册

此模块的核心是创建实例化对象。

private void registrationActionPerformed(ActionEvent evt) {
    String userName=this.userNameTxt.getText();
    String password=this.passwordTxt.getText();
    if(StringUtil.isEmpty(userName)){
      JOptionPane.showMessageDialog(null, "用户名不能为空!");
      return;
    }
    if(StringUtil.isEmpty(password)){
      JOptionPane.showMessageDialog(null, "密码不能为空!");
      return;
    }
    Registration registration= new Registration(userName,password);
    Connection con= null;
    try {
      con=dbUtil.getCon();
      int n= registrationDao.add(con, registration);
      if(n==1){
        JOptionPane.showMessageDialog(null, "注册成功!");
        resetValue();
      }else{
        JOptionPane.showMessageDialog(null, "注册失败!");
      }
    }catch(Exception e) {
    }finally {
      try {
        dbUtil.closeCon(con);
      } catch (Exception e) {
        // TODO 自动生成的 catch 块
        e.printStackTrace();
        JOptionPane.showMessageDialog(null, "注册失败!");
      }
    }
  }

3.3图书添加模块

管理员在此界面上可对系统里的图书进行查询修改和删除。

public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
      public void run() {
        try {
          BookAddInterFrm frame = new BookAddInterFrm();
          frame.setVisible(true);
        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    });
  }

3.4图书添加事件

此界面主要实现图书的添加功能。

/**
*图书添加事件
*/
private void bookAddActionPerformed(ActionEvent evt) {
    String bookName=this.bookNameTxt.getText();
    String author=this.authorTxt.getText();
    String price=this.priceTxt.getText();
    String bookDesc=this.bookDescTxt.getText();
    if(StringUtil.isEmpty(bookName)){
      JOptionPane.showMessageDialog(null, "图书名称不能为空!");
      return;
    }
    if(StringUtil.isEmpty(author)){
      JOptionPane.showMessageDialog(null, "图书作者不能为空!");
      return;
    }
    if(StringUtil.isEmpty(price)){
      JOptionPane.showMessageDialog(null, "图书价格不能为空!");
      return;
    }
    String sex="";
    if(manJrb.isSelected()){
      sex="男";
    }else if(femaleJrb.isSelected()){
      sex="女";
    }
    BookType bookType=(BookType) bookTypeJcb.getSelectedItem();
    int bookTypeId=bookType.getId();
    Book book=new Book(bookName,author, sex, Float.parseFloat(price) , bookTypeId,  bookDesc);
    Connection con=null;
    try{
      con=dbUtil.getCon();
      int addNum=bookDao.add(con, book);
      if(addNum==1){
        JOptionPane.showMessageDialog(null, "图书添加成功!");
        resetValue();
      }else{
        JOptionPane.showMessageDialog(null, "图书添加失败!");
      }
    }catch(Exception e){
      e.printStackTrace();
      JOptionPane.showMessageDialog(null, "图书添加失败!");
    }finally{
      try {
        dbUtil.closeCon(con);
      } catch (Exception e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
      }
    }
  }
  /**
   * 重置表单
   */
  private void resetValue(){
    this.bookNameTxt.setText("");
    this.authorTxt.setText("");
    this.priceTxt.setText("");
    this.manJrb.setSelected(true);
    this.bookDescTxt.setText("");
    if(this.bookTypeJcb.getItemCount()>0){
      this.bookTypeJcb.setSelectedIndex(0);
    }
  }
  /**
   * 初始化图书类别下拉框
   */
  private void fillBookType(){
    Connection con=null;
    BookType bookType=null;
    try{
      con=dbUtil.getCon();
      ResultSet rs=bookTypeDao.list(con, new BookType());
      while(rs.next()){
        bookType=new BookType();
        bookType.setId(rs.getInt("id"));
        bookType.setBookTypeName(rs.getString("bookTypeName"));
        this.bookTypeJcb.addItem(bookType);
      }
    }catch(Exception e){
      e.printStackTrace();
    }finally{
    }
  }
}

3.5买家信息维护

此模块主要用于对买家信息的查找和维护。

/**
   * 买家信息搜索事件处理
   */
  protected void consumerSerachActionPerformed(ActionEvent evt) {
    String s_consumerName= this.s_consumerNameTxt.getText();
    Consumer consumer=new Consumer();
    consumer.setConsumerName(s_consumerName);
    this.fillTable(consumer);
  }
  private void fillTable(Consumer consumer){
    DefaultTableModel dtm=(DefaultTableModel) consumerTable.getModel();
    dtm.setRowCount(0); // 设置成0行
    Connection con=null;
    try{
      con=dbUtil.getCon();
      ResultSet rs=consumerDao.list(con, consumer);
      while(rs.next()){
        Vector v=new Vector();
        v.add(rs.getString("id"));
        v.add(rs.getString("consumerName"));
        v.add(rs.getString("sex"));
        v.add(rs.getString("age"));
        v.add(rs.getString("number"));
        v.add(rs.getString("bookName"));
        dtm.addRow(v);
      }
    }catch(Exception e){
      e.printStackTrace();
    }finally {
      try {
        dbUtil.closeCon(con);
      } catch (Exception e) {
        // TODO 自动生成的 catch 块
        e.printStackTrace();
      }
    }
  }
  /**
   * 买家信息修改
   */
  private void consumerUpdateActionEvet(ActionEvent evt) {
    String id=idTxt.getText();
    String consumerName=consumerNameTxt.getText();
    String sex=sexTxt.getText();
    String age=ageTxt.getText();
    String number=numberTxt.getText();
    String bookName=bookNameTxt.getText();
    if(StringUtil.isEmpty(id)){
      JOptionPane.showMessageDialog(null, "请选择要修改的记录");
      return;
    }
    if(StringUtil.isEmpty(consumerName)){
      JOptionPane.showMessageDialog(null, "购书者名称不能为空");
      return;
    }
    if(StringUtil.isEmpty(age)){
      JOptionPane.showMessageDialog(null, "年龄不能为空");
      return;
    }
    if(StringUtil.isEmpty(number)){
      JOptionPane.showMessageDialog(null, "联系方式不能为空");
      return;
    }
    if(StringUtil.isEmpty(bookName)){
      JOptionPane.showMessageDialog(null, "图书名称不能为空");
      return;
    }
    if(StringUtil.isEmpty(sex)){
      JOptionPane.showMessageDialog(null, "性别不能为空");
      return;
    }
    Consumer consumer=new Consumer(Integer.parseInt(id),consumerName,sex,age,number,bookName);
    Connection con=null;
    try {
      con=dbUtil.getCon();
      con=dbUtil.getCon();
      int modifyNum=consumerDao.update(con, consumer);
      if(modifyNum==1){
        JOptionPane.showMessageDialog(null, "修改成功");
        this.resetValue();
        this.fillTable(new Consumer());
      }else{
        JOptionPane.showMessageDialog(null, "修改失败");
      }
    }catch(Exception e) {
      e.printStackTrace();
      JOptionPane.showMessageDialog(null, "修改失败");
    }finally {
      try {
        dbUtil.closeCon(con);
      } catch (Exception e) {
        // TODO 自动生成的 catch 块
        e.printStackTrace();
      }
    }
  }

3.6订单管理模块

此模块用于图书订单管理,查找,修改,删除等功能的实现。

/**
   * 订单修改事件
   */
  protected void orderUpdateActionPerformed(ActionEvent evt) {
    String id=this.idTxt.getText();
    if(StringUtil.isEmpty(id)){
      JOptionPane.showMessageDialog(null, "请选择要修改的记录");
      return;
    }
    String addressee=this.addresseeTxt.getText();
    String number=this.numberTxt.getText();
    String deliveryMent=this.deliveryMentTxt.getText();
    String paymentMethod=this.paymentMethodTxt.getText();
    String shippingAddress=this.shippingAddressTxt.getText();
    if(StringUtil.isEmpty(addressee)){
      JOptionPane.showMessageDialog(null, "收件人不能为空!");
      return;
    }
    if(StringUtil.isEmpty(number)){
      JOptionPane.showMessageDialog(null, "购买数量不能为空!");
      return;
    }
    if(StringUtil.isEmpty(deliveryMent)){
      JOptionPane.showMessageDialog(null, "运送方式不能为空!");
      return;
    }
    if(StringUtil.isEmpty(paymentMethod)){
      JOptionPane.showMessageDialog(null, "支付方式不能为空!");
      return;
    }
    if(StringUtil.isEmpty(paymentMethod)){
      JOptionPane.showMessageDialog(null, "收件地址不能为空!");
      return;
    }
    Book book=(Book) this.bookNameJcb.getSelectedItem();
    int bookId=book.getId();
    Order order =new Order(Integer.parseInt(id), addressee, number, deliveryMent, paymentMethod, shippingAddress,
        bookId);
    Connection con =null;
    try {
      con=dbUtil.getCon();
      int addNum=orderDao.update(con, order);
      if(addNum==1) {
        JOptionPane.showMessageDialog(null, "订单修改成功!");
        resetValue();
        this.fillTable(new Order());
      }else {
        JOptionPane.showMessageDialog(null, "订单修改失败!");
      }
    }catch(Exception e) {
      e.printStackTrace();
    }finally {
      try {
        dbUtil.closeCon(con);
      } catch (Exception e) {
        // TODO 自动生成的 catch 块
        e.printStackTrace();
        JOptionPane.showMessageDialog(null, "订单添加失败!");
      }
    }
  }

4.数据库设计

4.1系统数据库设计

使用sql语句查询项目存储数据用到的数据库表格:

1.管理员信息表

列名 数据类型 长度 主键 非空 自增
Id Int 11
usename varchar 20
password varchar 20

2.图书类型信息表

列名 数据类型 长度 主键 非空 自增
id Int 11
BookTypeName Varchar 20
bookTypeDes Varchar 20

3.图书信息表

列名 数据类型 长度 主键 非空 自增
Bookname Int 11
Author Varchar 20
Sex Varchar 10
Price Float 10
bookTypeId Int 11
bookDesc Varchar 1000

4.订单信息表

列名 数据类型 长度 主键 非空 自增
Buyid Int 11
Name Varchar 20
Sex Varchar 20
Buybooknamtel Varchar 20
Way Varchar 20
Address Varchar 20

5.买家信息表

列名 数据类型 长度 主键 非空 自增
Id Int 11
Consumername Varchar 50
Sex Varchar 50
Age Varchar 50
Number Varchar 50
Bookname Varchar 50

4.2系统E-R图设计


5.JDBC连接数据库

一定要安装数据库jdbc驱动包!

代码展示:

package com.util;
import java.sql.Connection;
import java.sql.DriverManager;
/**
 * 数据库工具类
 */
public class DbUtil {
  private String jdbcName="com.mysql.cj.jdbc.Driver";      // 驱动名称
  ////数据库连接地址   由于数据库为最新版本  导致驱动名称已改为com.mysql.cj.jdbc.Driver
  //由于时区错乱  执行命令给MySQL服务器设置时区为东八区    serverTimezone=GMT%2B8
  private String dbUrl="jdbc:mysql://localhost:3306/db_book?serverTimezone=GMT%2B8";// 数据库连接地址
  private String dbuserName = "root";                         // 用户名
  private String dbpassWord = "abc123";                         // 密码
  /**
   * 获取数据库连接
   */
  public Connection getCon()throws Exception{
    Class.forName(jdbcName);
    Connection con=DriverManager.getConnection(dbUrl, dbuserName, dbpassWord);
    return con;
  }
  /**
   * 关闭数据库连接
   */
  public void closeCon(Connection con)throws Exception{
    if(con!=null){
      con.close();
    }
  }
  public static void main(String[] args) {
    DbUtil dbUtil=new DbUtil();
    try {
      dbUtil.getCon();
      System.out.println("数据库连接成功!");
    } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
      System.out.println("数据库连接失败");
    }
  }
}

6.总结

两周的课程设计圆满结束,在整个项目搭建的过程中也解决了很多的问题,对整体的思路有了把握,进一步理解了Java数据库编程,GUI图形用户界面,JDBC技术。虽然项目设计的时间匆忙,但是Java学习任重而道远,一个人走的更快,一群人走的更远,共勉!

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
27天前
|
SQL 关系型数据库 数据库
Python SQLAlchemy模块:从入门到实战的数据库操作指南
免费提供Python+PyCharm编程环境,结合SQLAlchemy ORM框架详解数据库开发。涵盖连接配置、模型定义、CRUD操作、事务控制及Alembic迁移工具,以电商订单系统为例,深入讲解高并发场景下的性能优化与最佳实践,助你高效构建数据驱动应用。
239 7
|
1月前
|
Java
如何在Java中进行多线程编程
Java多线程编程常用方式包括:继承Thread类、实现Runnable接口、Callable接口(可返回结果)及使用线程池。推荐线程池以提升性能,避免频繁创建线程。结合同步与通信机制,可有效管理并发任务。
139 6
|
1月前
|
IDE Java 编译器
java编程最基础学习
Java入门需掌握:环境搭建、基础语法、面向对象、数组集合与异常处理。通过实践编写简单程序,逐步深入学习,打牢编程基础。
173 0
|
2月前
|
SQL Java 数据库
2025 年 Java 从零基础小白到编程高手的详细学习路线攻略
2025年Java学习路线涵盖基础语法、面向对象、数据库、JavaWeb、Spring全家桶、分布式、云原生与高并发技术,结合实战项目与源码分析,助力零基础学员系统掌握Java开发技能,从入门到精通,全面提升竞争力,顺利进阶编程高手。
500 1
|
1月前
|
安全 前端开发 Java
从反射到方法句柄:深入探索Java动态编程的终极解决方案
从反射到方法句柄,Java 动态编程不断演进。方法句柄以强类型、低开销、易优化的特性,解决反射性能差、类型弱、安全性低等问题,结合 `invokedynamic` 成为支撑 Lambda 与动态语言的终极方案。
143 0
|
人工智能 关系型数据库 OLAP
聚光灯已就位!阿里云瑶池数据库邀你征战Cursor首届实战征文大赛
阿里云AnalyticDB携手Cursor中文社区,正式发起首届实战征文大赛!我们诚邀开发者融合Cursor的智能编程能力与AnalyticDB PostgreSQL提供的Supabase服务进行项目开发,让优秀项目被专家看见、被机遇拥抱!
|
2月前
|
Java 开发者
Java并发编程:CountDownLatch实战解析
Java并发编程:CountDownLatch实战解析
427 100
|
2月前
|
算法 Java
Java多线程编程:实现线程间数据共享机制
以上就是Java中几种主要处理多线程序列化资源以及协调各自独立运行但需相互配合以完成任务threads 的技术手段与策略。正确应用上述技术将大大增强你程序稳定性与效率同时也降低bug出现率因此深刻理解每项技术背后理论至关重要.
212 16
|
2月前
|
NoSQL Java 关系型数据库
超全 Java 学习路线,帮你系统掌握编程的超详细 Java 学习路线
本文为超全Java学习路线,涵盖基础语法、面向对象编程、数据结构与算法、多线程、JVM原理、主流框架(如Spring Boot)、数据库(MySQL、Redis)及项目实战等内容,助力从零基础到企业级开发高手的进阶之路。
255 1
|
2月前
|
安全 关系型数据库 数据管理
阿里云数据库:构建高性能与安全的数据管理系统
阿里云数据库提供RDS、PolarDB、Tair等核心产品,具备高可用、弹性扩展、安全合规及智能运维等技术优势,广泛应用于电商、游戏、金融等行业,助力企业高效管理数据,提升业务连续性与竞争力。