JDBC-MYSQL 图书商城系统-附源码

本文记录了一个使用JDBC实现的图书商城系统的开发过程,包括数据库连接、菜单显示、增删改查功能的实现,涉及Mysql数据库、IDEA集成环境及基本的Java编程操作。

JDBC-Book 图书商城系统

1.前言

刚刚学习完JDBC的一些基础,想记录一下自己的学习过程分享给大家。

此次我将要完成对如下数据库进行增删改查:
在这里插入图片描述

我用的开发工具是idea 2021.1.4旗舰版。

数据库是Mysql,此项目需要一个数据库的jar包,参考如下:

https://dev.mysql.com/downloads/

选择连接器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Omgr8quy-1649403360462)(F:\typora图\image-20220408113520513.png)]

不是最新版的话就选择 Archives

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UIibeJwF-1649403360462)(F:\typora图\image-20220408113638574.png)]

自行选择对应的版本,然后选中这个。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9oc8YhVh-1649403360463)(F:\typora图\image-20220408114004875.png)]

下载压缩包

在这里插入图片描述

解压缩,我们需要的是这个jar文件。

在这里插入图片描述

项目开始

1.在idea新建一个java项目(jdbc-book)

在这里插入图片描述

src文件可以删掉。

在根目录新建一个lib文件夹引入jar包,将上面下载的jar包复制到lib中

在这里插入图片描述

右键lib选择Add as Library

在这里插入图片描述

在这里插入图片描述

这样jar包就引入了。

2.新建一个Module(book-jdbc)

在这里插入图片描述

3.完成菜单显示

在src新建一个class (com.yk.book.controller.Menu)类

在这里插入图片描述

在类中输入:

	//显示菜单
    Scanner input = new Scanner(System.in);


    // 菜单
    /*
        return slt    返回用户的选择
     */
    public int showMenu(){
        System.out.println("============欢迎使用图书商城系统============");
        System.out.println("1.查看图书列表");
        System.out.println("2.添加图书库存信息");
        System.out.println("3.查看特定图书信息");
        System.out.println("4.图书下架");
        System.out.println("5.退出");
        System.out.println("========================================");
        System.out.print("请选择:");

        int slt = input.nextInt();

        return slt;

在同目录下新建一个main 调用Menu:(主函数)

package com.yk.book.controller;

public class Main {
    public static void main(String[] args) {
        Menu m = new Menu();
        boolean flag = true;    // 先死循环,后面通过判断用户是否退出。
        while(flag){
            //调用显示主菜单的方法
            int slt = m.showMenu();
            switch (slt){
                case 1:
                    break;
                case 2:
                    break;
                case 3:
                    break;
                case 4:
                    break;
                case 5:
                    break;
                default:
                    System.out.println("好好选,别调皮");
                    break;
            }
        }
        System.out.println("谢谢使用!");
    }
}

运行此文件可以看到:

在这里插入图片描述

4.退出程序功能

当用户选择功能5时,即退出此程序

在Menu文件中写入 exit方法

equalsIgnoreCase: 忽略大小写比较。 返回值是一个布尔类型,若用户决定退出,则将flag修改为false,退出程序。

	// 退出
    public boolean exit(){
        System.out.print("是否确认退出?(Y/N) ");
        String slt = input.next();
        return !"Y".equalsIgnoreCase(slt);
    }

在Main函数中调用exit()

case 5:
     flag = m.exit();
     break;

进行测试,运行程序,输入5,将会得到如下画面,说明这一步已经完成了

在这里插入图片描述

5.书写图书类

在src.com.book新建一个pojo.Book

在这里插入图片描述

引入get/set方法,我这里的快捷键是 alt+fn+insert.

package com.yk.book.pojo;

public class Book {
	// 私有属性
    private Integer id;
    private String name;
    private Integer price;
    private Integer count;
    private String publisher;

    public Book() {
    }
	
	
    public Book(Integer id, String name, String publisher) {
        this.id = id;
        this.name = name;
        this.publisher = publisher;
    }

    public Book(Integer id, String name, Integer price, Integer count, String publisher) {
        this.id = id;
        this.name = name;
        this.price = price;
        this.count = count;
        this.publisher = publisher;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getPrice() {
        return price;
    }

    public void setPrice(Integer price) {
        this.price = price;
    }

    public Integer getCount() {
        return count;
    }

    public void setCount(Integer count) {
        this.count = count;
    }

    public String getPublisher() {
        return publisher;
    }

    public void setPublisher(String publisher) {
        this.publisher = publisher;
    }

    @Override
    public String toString() {
        return id +"\t\t" + name +"\t\t" + price + "\t\t" + count + "\t\t" + publisher ;
    }
}

6.接口

在scr.yk.com.DAO.impl见一个接口文件BookDAO

接口(Interface)从本质上讲是一个抽象类

在这里插入图片描述

完成各个功能的接口

package com.yk.book.DAO.impl;

import com.yk.book.pojo.Book;

import java.util.List;

public interface BookDAO {
    // 查询库存列表
    List<Book> getBookList();

    // 新增库存
    boolean addBook(Book book);

    // 修改库存
    boolean updateBook(Book book);

    // 根据名称查询特定排序
    Book getBookByName(String name);

    // 删除特定库存记录
    boolean delBook(String name);
}

然后在同目录下新建一个BookDAOImpl,在这里完成增删改查。

在这里插入图片描述

7.功能实现

1.展示图书列表

1.连接驱动 Class.forName(“com.mysql.cj.jdbc.Driver”);

在这里插入图片描述

2.创建驱动管理器 (数据库url,用户名,密码)

​ Connection conn = DriverManager.getConnection(URL,‘root’,‘p123456’);

3.编写sql语句查询 String sql = “selec * from t_book”;

4.创建预处理命令 PreparedStatement psmt = conn.prepareStatement(sql);

5.执行查询 ResultSet rs = psmt.executeQuery(); 返回查询的行数

6.数据解析

在BookDAOImpl中写入,返回值是一个list

	
	ResultSet rs;
    PreparedStatement psmt;
    Connection conn;

    final String URL = "jdbc:mysql://localhost:3306/book?useSSL=false";


    @Override
    public List<Book> getBookList() {
        List<Book> bookList = new ArrayList<>();
        try {
            // 1.连接驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            // 2.创建驱动管理器
            conn = DriverManager.getConnection(URL,"root","p123456");
            // 3.编写SQL语句(查询)
            String sql = "select * from t_book";
            // 4.创建预处理命令
            psmt = conn.prepareStatement(sql);
            // 5.执行查询
            rs = psmt.executeQuery();

            // 6.数据解析
            while(rs.next()){
                int id = rs.getInt(1);
                String name = rs.getString(2);
                int price = rs.getInt(3);
                int count = rs.getInt(4);
                String publisher = rs.getString(5);

                Book book = new Book(id,name,price,count,publisher);
                bookList.add(book);
            }
            return bookList;
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {    //关闭
            try {
                if (rs != null) {
                    rs.close();
                }
                if(psmt!=null){
                    psmt.close();
                }
                if(conn!=null && !conn.isClosed()){
                    conn.close();
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        return null;
    }

7.在Menu菜单中完成showBookList()方法

	BookDAO bookDAO = new BookDAOImpl();

    // 查看图书列表
    public void showBookList(){
    	// 获取所有的图书
        List<Book> bookList = bookDAO.getBookList();
        System.out.println("===========================================");
        System.out.println("编号\t\t名称\t\t单价\t\t库存\t\t出版社");
        // 判断是否有数据
        if(bookList == null || bookList.size() <=0 ){
            System.out.println("对不起,库存为空");
        }else{
            for (int i = 0; i < bookList.size(); i++) {
                Book book = bookList.get(i);
                System.out.println(book);   //默认调用Book里面的String方法,
            }
        }
        System.out.println("===========================================");
        System.out.print("任意键继续:");
        input.next();
    }

8.在主函数中调用

case 1:
	m.showBookList();
	break;

9.运行程序,测试,输入1:

在这里插入图片描述

看到此结果,说明查看图书列表功能已经完成。

2.添加图书

添加图书的时候,我们需要用到查询单个图书的功能,如果该图书存在,则追加库存量;若不存在,则添加该图书。

在bookDAOImpl中书写代码

1.添加

@Override
public boolean addBook(Book book) {
    try {
        Class.forName("com.mysql.cj.jdbc.Driver");
        Connection conn = DriverManager.getConnection(URL,"root","p123456");
        // 插入 语句
        String sql = "insert into t_book values(0,?,?,?,?)";
        PreparedStatement psmt = conn.prepareStatement(sql);
        // 赋值
        psmt.setString(1,book.getName());
        psmt.setInt(2,book.getPrice());
        psmt.setInt(3,book.getCount());
        psmt.setString(4,book.getPublisher());

        return psmt.executeUpdate()>0;
    } catch (ClassNotFoundException | SQLException e) {
        e.printStackTrace();
    }finally {   // 关闭
        try {
            if(psmt!=null){
                psmt.close();
            }
            if(conn!=null && !conn.isClosed()){
                conn.close();
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
    return false;
}
	@Override
    public boolean updateBook(Book book) {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            conn = DriverManager.getConnection(URL,"root","p123456");
            // 更新的sql语句
            String sql = "update t_book set count = ? where id = ?";
            // 赋值
            psmt = conn.prepareStatement(sql);
            psmt.setInt(1,book.getCount());
            psmt.setInt(2,book.getId());
            return psmt.executeUpdate()>0;

        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }finally {  // 关闭
            try {
                if(psmt!=null){
                    psmt.close();
                }
                if(conn!=null && !conn.isClosed()){
                    conn.close();
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        return false;
    }
 	@Override
    public Book getBookByName(String name) {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            conn = DriverManager.getConnection(URL,"root","p123456");
            // 查询单本图书
            String sql = "select * from t_book where name like ?";
            // 赋值
            psmt = conn.prepareStatement(sql);
            psmt.setString(1,name);
            // 数据解析
            rs = psmt.executeQuery();
            if(rs.next()){
                int id = rs.getInt(1);
                int price = rs.getInt(3);
                int count = rs.getInt(4);
                String publisher = rs.getString(5);
				// 返回一个book对象
                return new Book(id,name,price,count,publisher);
            }
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }finally {   // 关闭
            try {
                if (rs != null) {
                    rs.close();
                }
                if(psmt!=null){
                    psmt.close();
                }
                if(conn!=null && !conn.isClosed()){
                    conn.close();
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        return null;
    }

接着在Menu菜单中写添加图书代码

	// 添加图书
    public void addBook(){
        System.out.print("请输入图书名称:");
        String name = input.next();
        Book book = bookDAO.getBookByName(name);
        // 图书不存在时,新建一个
        if (book == null){
            System.out.print("请输入图书单价:");
            int price = input.nextInt();
            System.out.print("请输入图书库存量:");
            int count = input.nextInt();
            System.out.print("请输入图书出版社:");
            String publisher = input.next();
	
            // 封装一个图书对象
            book = new Book(0,name,price,count,publisher);
            // 调用添加接口
            bookDAO.addBook(book);  
        }else{  // 图书存在,则追加库存量
            System.out.print("请输入追加的库存量:");
            int count = input.nextInt();
            book.setCount(book.getCount()+count);
            // 调用DAO的修改方法
            bookDAO.updateBook(book);
        }
    }

最后在主函数中调用:

case 2:
	m.addBook();
	break;

代码写完了,接着我们进行测试,输入2:

在这里插入图片描述

可以看到,高等数学这本书已经被添加了。、

3.查看特定图书信息

这功能的接口在添加图书已经写过了

我们通过一个图书名称去数据查询,返回值是一个book对象

如果图书存在,则打印图书信息,若不存在,则告诉用户没有这本书。

我们直接在Menu菜单中书写代码

	// 查看特定图书
    public void viewOneBook(){
        System.out.print("请输入图书名称:");
        String name = input.next() ;
        // 调用查询单个图书接口
        Book book =bookDAO.getBookByName(name);
        // 如果图书不存在
        if(book == null){
            System.out.println("对不起,没有找到指定的图书记录!");
        }else{
            System.out.println("=======================================");
            System.out.println("编号\t\t名称\t\t单价\t\t库存\t\t出版社");
            System.out.println(book);
            System.out.println("=======================================");
        }
        System.out.print("任意键继续:");
        input.next();
    }

接着我们在主函数调用

case 3:
	m.viewOneBook();
	break;

输入3:

在这里插入图片描述

看到这样的结果,我们就还是顺利的。

4.图书下架
	@Override
    public boolean delBook(String name) {
        try {
            Class.forName("com.mysql.cj.jdbc.Driver");
            conn = DriverManager.getConnection(URL,"root","p123456");
            // 删除的sql语句
            String sql = "delete from t_book where name like ?";
            psmt = conn.prepareStatement(sql);
            psmt.setString(1,name);
            return psmt.executeUpdate()>0;
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }finally {
            try {
                if (rs != null) {
                    rs.close();
                }
                if(psmt!=null){
                    psmt.close();
                }
                if(conn!=null && !conn.isClosed()){
                    conn.close();
                }
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }

在Menu菜单中书写删除代码:

	// 删除
    public void delBook(){
        System.out.print("请输入要删除图书名称:");
        String name = input.next();
        Book book = bookDAO.getBookByName(name);
        if(book==null) {
            System.out.println("对不起,没有找到需要删除的图书信息!");
        }else{
            System.out.print("是否确认删除(Y/N):");
            String slt = input.next();
            if("y".equalsIgnoreCase(slt)){
                // 调用删除接口
                bookDAO.delBook(name);
                System.out.println("删除成功");
            }
        }
    }

在主函数调用:

case 4:
	m.delBook();
	break;

最后,我们测试一下功能,输出4:

在这里插入图片描述

可以看到,计算机网络已经被删除了。

3.结语

到此,这个项目就结束了。生命不息,学习不止。

最后看一下项目的目录吧

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9ivWy26f-1649403360476)(F:\typora图\image-20220408153403964.png)]

源码链接

链接:https://pan.baidu.com/s/12Tc2BYbdUY1nG5DHh2mvJw?pwd=tysm
提取码:tysm

侵删致歉!

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值