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

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 网上书店管理系统项目【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学习任重而道远,一个人走的更快,一群人走的更远,共勉!

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
1月前
|
XML Java 数据库连接
性能提升秘籍:如何高效使用Java连接池管理数据库连接
在Java应用中,数据库连接管理至关重要。随着访问量增加,频繁创建和关闭连接会影响性能。为此,Java连接池技术应运而生,如HikariCP。本文通过代码示例介绍如何引入HikariCP依赖、配置连接池参数及使用连接池高效管理数据库连接,提升系统性能。
59 5
|
1月前
|
监控 Java API
如何使用Java语言快速开发一套智慧工地系统
使用Java开发智慧工地系统,采用Spring Cloud微服务架构和前后端分离设计,结合MySQL、MongoDB数据库及RESTful API,集成人脸识别、视频监控、设备与环境监测等功能模块,运用Spark/Flink处理大数据,ECharts/AntV G2实现数据可视化,确保系统安全与性能,采用敏捷开发模式,提供详尽文档与用户培训,支持云部署与容器化管理,快速构建高效、灵活的智慧工地解决方案。
|
2天前
|
Java
Java基础却常被忽略:全面讲解this的实战技巧!
本次分享来自于一道Java基础的面试试题,对this的各种妙用进行了深度讲解,并分析了一些关于this的常见面试陷阱,主要包括以下几方面内容: 1.什么是this 2.this的场景化使用案例 3.关于this的误区 4.总结与练习
|
28天前
|
JSON Java 关系型数据库
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
在Java中,使用mybatis-plus更新实体类对象到mysql,其中一个字段对应数据库中json数据类型,更新时报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
41 4
Java更新数据库报错:Data truncation: Cannot create a JSON value from a string with CHARACTER SET 'binary'.
|
21天前
|
设计模式 消息中间件 搜索推荐
Java 设计模式——观察者模式:从优衣库不使用新疆棉事件看系统的动态响应
【11月更文挑战第17天】观察者模式是一种行为设计模式,定义了一对多的依赖关系,使多个观察者对象能直接监听并响应某一主题对象的状态变化。本文介绍了观察者模式的基本概念、商业系统中的应用实例,如优衣库事件中各相关方的动态响应,以及模式的优势和实际系统设计中的应用建议,包括事件驱动架构和消息队列的使用。
|
18天前
|
Java 程序员
Java基础却常被忽略:全面讲解this的实战技巧!
小米,29岁程序员,分享Java中`this`关键字的用法。`this`代表当前对象引用,用于区分成员变量与局部变量、构造方法间调用、支持链式调用及作为参数传递。文章还探讨了`this`在静态方法和匿名内部类中的使用误区,并提供了练习题。
20 1
|
29天前
|
安全 Java 开发者
Java 多线程并发控制:深入理解与实战应用
《Java多线程并发控制:深入理解与实战应用》一书详细解析了Java多线程编程的核心概念、并发控制技术及其实战技巧,适合Java开发者深入学习和实践参考。
52 6
|
28天前
|
存储 安全 Java
Java多线程编程中的并发容器:深入解析与实战应用####
在本文中,我们将探讨Java多线程编程中的一个核心话题——并发容器。不同于传统单一线程环境下的数据结构,并发容器专为多线程场景设计,确保数据访问的线程安全性和高效性。我们将从基础概念出发,逐步深入到`java.util.concurrent`包下的核心并发容器实现,如`ConcurrentHashMap`、`CopyOnWriteArrayList`以及`BlockingQueue`等,通过实例代码演示其使用方法,并分析它们背后的设计原理与适用场景。无论你是Java并发编程的初学者还是希望深化理解的开发者,本文都将为你提供有价值的见解与实践指导。 --- ####
|
29天前
|
数据库连接 Go 数据库
Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性
本文探讨了Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性;防御编程则强调在编码时考虑各种错误情况,确保程序健壮性。文章详细介绍了这两种技术在Go语言中的实现方法及其重要性,旨在提升软件质量和可靠性。
29 1
|
1月前
|
运维 自然语言处理 供应链
Java云HIS医院管理系统源码 病案管理、医保业务、门诊、住院、电子病历编辑器
通过门诊的申请,或者直接住院登记,通过”护士工作站“分配患者,完成后,进入医生患者列表,医生对应开具”长期医嘱“和”临时医嘱“,并在电子病历中,记录病情。病人出院时,停止长期医嘱,开具出院医嘱。进入出院审核,审核医嘱与住院通过后,病人结清缴费,完成出院。
90 3
下一篇
DataWorks