JDBC 实例分享——简易图书管理系统

目录

前言

数据表的建立

操作包各个类的实现

增加类

删除类

展示类

借阅与归还类


前言

书接上文

JDBC编程的学习——MYsql版本-CSDN博客

本期我们通过对先前图书管理系统进行改造,是它的数据能保存在数据库中

完整代码我已经保存在github中,能不能给个星呢!!!!

calljsh/Mylibrary (github.com)

这是先前的图书管理系统,这篇博客里面也有完整代码

图书管理系统(java) 代码展示和思路介绍 (9000字小长文)_图书管理系统关键代码展示-CSDN博客

数据表的建立

即为简易图书管理系统,我只用了一张表来储存书的信息,包括书名,作者名,价格,类型,以及是否借出 的State.

这是我们表的结构

mysql> desc lib;
+--------+-------------+------+-----+--------------+-------+
| Field  | Type        | Null | Key | Default      | Extra |
+--------+-------------+------+-----+--------------+-------+
| name   | varchar(20) | YES  |     | NULL         |       |
| author | varchar(20) | YES  |     | NULL         |       |
| price  | int         | YES  |     | NULL         |       |
| type   | varchar(20) | YES  |     | NULL         |       |
| state  | varchar(20) | YES  |     | 未被借出     |       |
+--------+-------------+------+-----+--------------+-------+

具体创建的代码如下

create table lib (name varchar(20),author varchar(20),price int,type varchar(20),state varchar(20) default '未被借出');

我们给我们的状态列设置默认值——未被借出 

好的现在我们的表建好了

操作包各个类的实现

整个图书管理系统的逻辑在之前的博客中已经详细介绍过,只要操作包中的各个类有区别,这也是我需要介绍的实例.

增加类

增加类就是写好我们需要增加书籍的信息,然后通过SQL语句使数据库执行

还是基础的五步,大致为:

创建数据源

建立链接

写好sql语句并执行

处理结果集

释放资源

package Operation;
import Book.BOOK;
import Book.BookList;
import com.mysql.cj.jdbc.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Scanner;
public class Add implements WORK
{
    @Override
    public void work(BookList bookList)throws SQLException
    {
        //1 创建
        DataSource dataSource=new MysqlDataSource();
        ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/jsh?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("你的密码");

        //2 建立链接
      Connection connection=dataSource.getConnection();

      //3 创建sql语句
        System.out.println("增加图书");
        Scanner scanner=new Scanner(System.in);
        System.out.println("请输入您要添加的图书的书名:");
        String name= scanner.nextLine();
        System.out.println("请输入您要添加的图书的作者名:");
        String author = scanner.nextLine();
        System.out.println("请输入您要添加的图书的类型:");
        String type = scanner.nextLine();
        System.out.println("请输入您要添加的图书的价格:");
        int price = scanner.nextInt();
        String sql="insert into lib (name,author,price,type,state)values(?,?,?,?,default)";
        PreparedStatement preparedStatement=connection.prepareStatement(sql);
         preparedStatement.setString(1,name);
        preparedStatement.setString(2,author);
        preparedStatement.setInt(3,price);
        preparedStatement.setString(4,type);
        //4 发送给服务器
        int n=preparedStatement.executeUpdate();
        //5 释放资源
        preparedStatement.close();
        connection.close();
    }
}

 有一个要点需要注意,为了能够让状态(state)能够是我们设置好的默认值,我指定了列,如果有更好的写法欢迎分享

删除类

删除类其实和增加类是一样的,但是我用了try-catch-finally结构写给读者们看

try {
    // 建立连接
    connection = dataSource.getConnection();
    // 获取用户输入
    Scanner sc = new Scanner(System.in);
    System.out.println("输入你要删除图书的名字:");
    String name = sc.nextLine();

    // 创建SQL语句
    String sql = "DELETE FROM lib WHERE name = ?";
    preparedStatement = connection.prepareStatement(sql);
    preparedStatement.setString(1, name);

    // 执行删除操作
    int rowsAffected = preparedStatement.executeUpdate();
    if (rowsAffected > 0) {
        System.out.println("图书删除成功");
    } else {
        System.out.println("没有找到要删除的图书");
    }

} catch (SQLException e) {
    e.printStackTrace();
} finally {
    // 关闭资源
    if (preparedStatement != null) {
        try {
            preparedStatement.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
    if (connection != null) {
        try {
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

 下面是大致的解释

  1. try 块:

    • try 块中的代码是你希望正常执行的代码。在代码中,try 块包含建立数据库连接、获取用户输入、准备和执行SQL语句等操作。
    • connection = dataSource.getConnection(); 尝试建立与数据库的连接。
    • preparedStatement = connection.prepareStatement(sql); 准备SQL语句。
    • preparedStatement.executeUpdate(); 执行SQL语句。
  2. catch 块:

    • catch 块捕获在 try 块中发生的异常。在代码中,捕获的异常类型是 SQLException,这是处理SQL操作时可能抛出的异常类型。
    • catch (SQLException e) 表示捕获 SQLException 异常。
    • e.printStackTrace(); 打印异常的堆栈跟踪信息,帮助我们了解错误发生的具体位置和原因。
  3. finally 块:

    • finally 块中的代码无论是否发生异常都会执行,通常用于清理资源。在你的代码中,finally 块用于关闭 PreparedStatementConnection 对象,以防止资源泄漏。
    • if (preparedStatement != null) { preparedStatement.close(); } 关闭 PreparedStatement 对象。
    • if (connection != null) { connection.close(); } 关闭 Connection 对象。

使用tyr-catch-finally结构去写,能够捕获到异常,也让代码更具"健壮性" 

展示类

展示类中,我们就能看见结果集了,本质上来说,展示就是查询,然后打印出查询的结果

所以代码如下

package Operation;
import Book.BOOK;
import Book.BookList;
import com.mysql.cj.jdbc.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
public class Show  implements WORK
{
    @Override
    public void work(BookList bookList) throws SQLException
    {

        // 1 创建
        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/jsh?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("454284665");

        // 2 建立链接
        Connection connection = dataSource.getConnection();

        // 3 创建sql语句
        String sql = "SELECT * FROM lib";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);

        // 4 发送给服务器并获取结果
        ResultSet resultSet = preparedStatement.executeQuery();

        // 5 处理结果
        while (resultSet.next())
        {
            String name = resultSet.getString("name");
            String author = resultSet.getString("author");
            int price = resultSet.getInt("price");
            String type = resultSet.getString("type");
            String state=resultSet.getString("state");
            System.out.println("书名: " + name + " 作者: " + author + " 价格: " + price + " 类型: " + type + " 状态: "+state);
        }
        // 6 释放资源
        resultSet.close();
        preparedStatement.close();
        connection.close();
    }
}

结果集中它通过一套getXXX方法来获取数据,通过next()方法来读取给个查询的字段

我们通过这两种方法获得数据库的数据,然后打印出来

最后释放资源

借阅与归还类

借阅也是先通过查询,如果有查询的书,就把state修改为 '已借出' 即可

package Operation;
import Book.BOOK;
import Book.BookList;
import com.mysql.cj.jdbc.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
public class Borrow  implements WORK
{
    @Override
    public void work(BookList bookList) throws SQLException
    {
        DataSource dataSource=new MysqlDataSource();
        ((MysqlDataSource)dataSource).setURL("jdbc:mysql://127.0.0.1:3306/jsh?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource)dataSource).setUser("root");
        ((MysqlDataSource)dataSource).setPassword("454284665");
        //2 建立链接
        Connection connection=dataSource.getConnection();
        Scanner sc=new Scanner(System.in);
        System.out.println("请输入你要借的书的名字");
        String name=sc.nextLine();
        //3
        String sql = "select * from lib where name= ?and state ='未被借出'";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);
        preparedStatement.setString(1, name);
        // 4 发送给服务器并获取结果
        ResultSet resultSet = preparedStatement.executeQuery();
        if(resultSet.next())
        {
            String sql1="update lib set state ='已借出' where name=?";
            PreparedStatement preparedStatement1=connection.prepareStatement(sql1);
            preparedStatement1.setString(1,name);
           int n= preparedStatement1.executeUpdate();
           if(n>0)
           {
               System.out.println("借阅成功");
               preparedStatement1.close();
           }
        }
        else
        {
            System.out.println("没有找到这本书,借阅失败");
        }
        //5 释放资源
        resultSet.close();
        preparedStatement.close();
        connection.close();

归还和借阅正好相反,这里我同样用try-catch-finally结构去写

package Operation;
import Book.BOOK;
import Book.BookList;
import com.mysql.cj.jdbc.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;
public class  Return  implements WORK
{
    @Override
    public void work(BookList bookList) {

        DataSource dataSource = new MysqlDataSource();
        ((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/jsh?characterEncoding=utf8&useSSL=false");
        ((MysqlDataSource) dataSource).setUser("root");
        ((MysqlDataSource) dataSource).setPassword("454284665");

        Connection connection = null;
        PreparedStatement preparedStatement = null;
        PreparedStatement preparedStatement1 = null;
        ResultSet resultSet = null;

        try {
            connection = dataSource.getConnection();
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入你要归还的书的名字:");
            String name = sc.nextLine();

            String sql = "SELECT * FROM lib WHERE name = ? AND state = '已借出'";
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setString(1, name);

            resultSet = preparedStatement.executeQuery();
            if (resultSet.next()) {
                String sql1 = "UPDATE lib SET state = '未被借出' WHERE name = ?";
                preparedStatement1 = connection.prepareStatement(sql1);
                preparedStatement1.setString(1, name);
                int n = preparedStatement1.executeUpdate();
                if (n > 0) {
                    System.out.println("归还成功");
                }
            } else {
                System.out.println("没有找到这本书或这本书未被借出, 归还失败");
            }
        } catch (SQLException e) {
            System.out.println("数据库操作失败: " + e.getMessage());
        } finally {
            // 按正确顺序关闭资源
            if (resultSet != null) {
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (preparedStatement != null) {
                try {
                    preparedStatement.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (preparedStatement1 != null) {
                try {
                    preparedStatement1.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (connection != null) {
                try {
                    connection.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
        }

 这样我们就可以实现将数据写入数据库中,当然这是简易版本的,可以扩展的内容还有很多,例如可以建一张表存储用户的信息,可以建表存储已经借走的书等

就留给读者们自己去写了,这只是一个练习的实例

完整代码我已经分享

相关推荐

  1. JDBC 实例分享——简易图书管理系统

    2024-07-12 06:00:04       25 阅读
  2. C语言实战三:图书管理系统

    2024-07-12 06:00:04       51 阅读
  3. 使用Python构建一个简单图书管理系统

    2024-07-12 06:00:04       30 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-12 06:00:04       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-12 06:00:04       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-12 06:00:04       58 阅读
  4. Python语言-面向对象

    2024-07-12 06:00:04       69 阅读

热门阅读

  1. 工作理念分享

    2024-07-12 06:00:04       25 阅读
  2. 如何安装和管理RabbitMQ

    2024-07-12 06:00:04       28 阅读
  3. 微信小程序连接阿里云IOT物联网平台

    2024-07-12 06:00:04       27 阅读
  4. [Linux][Shell][Shell函数]详细讲解

    2024-07-12 06:00:04       25 阅读
  5. vivado EQUIVALENT_DRIVER_OPT、EXCLUDE_PLACEMENT

    2024-07-12 06:00:04       24 阅读
  6. 四大内网穿透利器对比

    2024-07-12 06:00:04       26 阅读
  7. ORM Bee,如何使用Oracle的TO_DATE函数?

    2024-07-12 06:00:04       28 阅读
  8. HTTP1.0和HTTP1.1的区别

    2024-07-12 06:00:04       26 阅读
  9. 5 Better ways to code in Rust

    2024-07-12 06:00:04       22 阅读
  10. SVN 标签的使用与优势

    2024-07-12 06:00:04       24 阅读
  11. 白骑士的C++教学进阶篇 2.3 模板

    2024-07-12 06:00:04       29 阅读