图书管理系统--Java实现

Posted 小玄ks

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图书管理系统--Java实现相关的知识,希望对你有一定的参考价值。

声明:本项目不涉及web操作,但需要了解java的基本语法和mysql的基本语句运用。

一、项目分布

db.sql类:SQL语句,在控制台执行,用于建立图书管理库。

Book类: 定义了书的一些属性(书编号,书名,作者,价格,分类,状态)并且写了属性的get、set、toSting方法。

User类:定义了用户的一些属性(用户编号,用户名,密码和是否为管理员的标记),并且写了属性的get、set、toSting方法。
NormalUser类:描述普通用户,实现普通用户的构造方法,并打印普通用户的操作界面。

Admin类:描述管理员,实现管理员的构造方法并打印管理员的操作界面。

DBUtil类:封装与数据库建立连接的操作(主要用JDBC来编写)。

BookDao类:封装 对表的增删查改操作。

UserDao类:封装 识别用户的操作。

operations包中定义了IOperation(操作)接口,这个包中的下面这些类都实现了这个IOperation接口(完成增删查改等操作):

AddOperation类:增加书籍

BorrowOperation类:借阅书籍

DeleteOperation类:删除书籍

DisplayOperation类:查看书籍列表

ExitOperation类:退出系统

FindOperation类:查找书籍

ReturnOperation类:返还书籍

二、代码展示

1.SQL语句,在控制台执行,用于建立图书管理库(设置“张三”为普通用户,密码为321;“admin”为管理员,密码为123)
create database if not exists bookmanager;

use bookmanager;

-- 创建一个书籍表
drop table if exists book;
create table book(
    bookId int primary key auto_increment,
    name varchar(20),
    author varchar(20),
    -- 为了准确,价格以 分 为单位
    price int,
    type varchar(20),
    -- 如果isBorrowed为1,表示已经借出,为0,表示未借出
    isBorrowed int
);

-- 创建一个用户表(用户有管理员和普通用户两种)
drop table if exists user;
create table user(
    userId int primary key auto_increment,
    username varchar(20) unique,
    password varchar(20),
    -- 如果isAdmin 为1,表示是管理员,为0,表示是普通用户
    isAdmin int
);

-- 插入一些数据
insert into book values(null,'西游记','吴承恩',10000,'古典小说',0);
insert into book values(null, '三国演义', '罗贯中', 10000, '古典小说', 0);
insert into book values(null, '水浒传', '施耐庵', 10000, '古典小说', 0);
insert into book values(null, '金瓶梅', '兰陵笑笑生', 10000, '古典小说', 0);
insert into book values(null,'三体','刘慈欣',10000,'科幻小说',0);

-- 插入一些用户
insert into user values(null,'admin','123',1);
insert into user values(null,'张三','321',0);
2.Book类: 定义了书的一些属性(书编号,书名,作者,价格,分类,状态)并且写了属性的get、set、toSting方法
package Java100_1006;

//使用这个类来表示一本书
// +------------+-------------+------+-----+---------+----------------+
// | Field      | Type        | Null | Key | Default | Extra          |
// +------------+-------------+------+-----+---------+----------------+
// | bookId     | int(11)     | NO   | PRI | NULL    | auto_increment |
// | name       | varchar(20) | YES  |     | NULL    |                |
// | author     | varchar(20) | YES  |     | NULL    |                |
// | price      | int(11)     | YES  |     | NULL    |                |
// | type       | varchar(20) | YES  |     | NULL    |                |
// | isBorrowed | int(11)     | YES  |     | NULL    |                |
// +------------+-------------+------+-----+---------+----------------+

public class Book {
    private int bookId;
    private String name;
    private String author;
    private int price;
    private String type;
    private boolean isBorrowed;

    public int getBookId() {
        return bookId;
    }

    public void setBookId(int bookId) {
        this.bookId = bookId;
    }

    public String getName() {
        return name;
    }

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

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public int getPrice() {
        return price;
    }

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

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }

    public boolean isBorrowed() {
        return isBorrowed;
    }

    public void setBorrowed(boolean borrowed) {
        isBorrowed = borrowed;
    }

    @Override
    public String toString() {
        return "Book{" +
                "bookId=" + bookId +
                ", name='" + name + '\\'' +
                ", author='" + author + '\\'' +
                ", price=" + price +
                ", type='" + type + '\\'' +
                ", isBorrowed=" + isBorrowed +
                '}';
    }
}
3.User类:定义了用户的一些属性(用户编号,用户名,密码和是否为管理员的标记),并且写了属性的get、set、toSting方法
package Java100_1006;

import Java100_1006.operations.IOperation;

abstract public class User {
    // 使用这个 User 类来表示一个用户
// +----------+-------------+------+-----+---------+----------------+
// | Field    | Type        | Null | Key | Default | Extra          |
// +----------+-------------+------+-----+---------+----------------+
// | userId   | int(11)     | NO   | PRI | NULL    | auto_increment |
// | username | varchar(20) | YES  |     | NULL    |                |
// | password | varchar(20) | YES  |     | NULL    |                |
// | isAdmin  | int(11)     | YES  |     | NULL    |                |
// +----------+-------------+------+-----+---------+----------------+
    // 针对此处的 isAdmin, 并不是直接使用一个 boolean 变量来区分, 而是使用两个不同的子类.
    // 原因是, 管理员和普通用户支持的方法, 是不一样的.
    private int userId;
    private String userName;
    private String passWord;

    // 包含了一个数组, 数组里面就是该用户支持的哪些操作.
    // 针对普通用户, 和管理员, 分别设置不同的操作.
    IOperation[] operations;

    //普通用户和管理员看到的菜单也不同
    abstract public int menu();

    public int getUserId() {
        return userId;
    }

    public void setUserId(int userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassWord() {
        return passWord;
    }

    public void setPassWord(String passWord) {
        this.passWord = passWord;
    }

    @Override
    public String toString() {
        return "User{" +
                "userId=" + userId +
                ", userName='" + userName + '\\'' +
                ", passWord='" + passWord + '\\'' +
                '}';
    }
}

4.用户分为两种:普通用户和管理员,所以应该分别建立两个类来描述这两个用户。

**4.1NormalUser类:**描述普通用户,实现普通用户的构造方法,并打印普通用户的操作界面。

package Java100_1006;

import Java100_1006.operations.*;

import java.util.Scanner;

//普通用户
public class NormalUser extends User{
    //普通用户的构造方法
    public NormalUser(){
        this.operations = new IOperation[]{
            	//0.退出
                new ExitOperation(),
            	//1.查看书籍列表
                new DisplayOperation(),
            	//2. 查找指定书籍
                new FindOperation(),
            	//3.借阅书籍
                new BorrowOperation(),
            	//4. 归还书籍
                new ReturnOperation()
        };
    }

    //打印普通用户的菜单
    @Override
    public int menu() {
        System.out.println("=============================");
        System.out.println("欢迎您"+this.getUserName()+"!");
        System.out.println("1. 查看书籍列表");
        System.out.println("2. 查找指定书籍");
        System.out.println("3. 借阅书籍");
        System.out.println("4. 归还书籍");
        System.out.println("0. 退出系统");
        System.out.println("=============================");
        System.out.println("请输入您的选项:");
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;
    }
}

4.2Admin类:描述管理员,实现管理员的构造方法并打印管理员的操作界面

package Java100_1006;

import Java100_1006.operations.*;

import java.util.Scanner;

//管理员
public class Admin extends User{
    //管理员的构造方法
    public Admin(){
        //初始化operation
        //继承与User类,所以可以使用父类的中的数组
        this.operations = new IOperation[]{
            	//0. 退出系统
                new ExitOperation(),
           	 	//1. 查看书籍列表
                new DisplayOperation(),
            	//2. 查找指定书籍
                new FindOperation(),
            	//3. 新增书籍
                new AddOperation(),
            	//4. 删除书籍
                new DeleteOperation()
        };
    }
    //打印管理员的菜单
    @Override
    public int menu() {
        System.out.println("================================");
        System.out.println("欢迎您, " + this.getUserName() + "! 您是管理员! ");
        System.out.println("1. 查看书籍列表");
        System.out.println("2. 查找指定书籍");
        System.out.println("3. 新增书籍");
        System.out.println("4. 删除书籍");
        System.out.println("0. 退出系统");
        System.out.println("================================");
        System.out.println("请输入选项: ");
        Scanner scanner = new Scanner(System.in);
        int choice = scanner.nextInt();
        return choice;
    }
}

5.DBUtil类:封装与数据库建立连接的操作(主要用JDBC来编写)
package Java100_1006;

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

//先建立这个类来 封装 数据库建立连接的操作
//具体步骤:
//1.创建DataSouse实例
//2.根据DataSouse创建对应的Connection
public class DBUtil {
    private static final String URL = "jdbc:mysql://127.0.0.1:3306/bookmanager?characterEncoding=utf8&useSSL=false";
    private static final String USERNAME = "root";
    private static final String PASSWORD = "1234";

    //懒汉模式:
    private static DataSource dataSource = null;

    //初始情况下,dataSource为null,没有被实例化
    //首次调用getDataSource()时才会被实例化
    private static DataSource getDataSource(){
        if(dataSource == null){
            dataSource = new MysqlDataSource();
            ((MysqlDataSource)dataSource).setUrl(URL);
            ((MysqlDataSource)dataSource).setUser(USERNAME);
            ((MysqlDataSource)dataSource).setPassword(PASSWORD);
        }
        return dataSource;
    }

    //提供一个方法来建立连接
    //用static来修饰,那么就无需实例化DBUtil实例就能调用这个方法,更加方便
    public static Connection getConnection() throws SQLException {
        return getDataSource().getConnection();
    }

    //释放资源
    public static void close(Connection connection, PreparedStatement statement, ResultSet resultSet){
        try{
            if(resultSet != null){
                resultSet.close();
            }
            if(statement != null){
                statement.close();
            }
            if(connection != null){
                connection.close();
            }
        }catch (SQLException e){
            e.printStackTrace();
        }

    }
}

6.BookDao类:封装 对表的增删查改操作
package Java100_1006;

import Java100_1006.Book;
import Java100_1006.DBUtil;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

//封装 对Book表的增删查改操作
public class BookDao {

    //1.新增书籍(插入)
    public boolean add(Book book){
        //把book对象插入数据库的书籍表中
        Connection connection = null;
        PreparedStatement statement = null;
        try {
            //1.和数据库建立连接
            connection = DBUtil.getConnection();

            //2.拼装sql语句
            String sql = "insert into book values(null,?,?,?,?,?)";
            statement = connection.prepareStatement(sql);
            statement.setString(1,book.getName());
            statement.setString(2,book.getAuthor());
            statement.setInt(3,book.getPrice());
            statement.setString(4,book.getType());
            statement.setInt(5,book.isBorrowed()?1:0);

            //3.执行SQL
            int ret = statement.executeUpdate();
            if(ret == 1)
                return true;
            return false;

        }catch (SQLException e){
            e.printStackTrace();
        }finally {
            DBUtil.close(connection,statement,null);
        }
        return false;
    }
    //2.查找所有书籍(查找)
    public List<Book> selectAll() {
        List<Book> list = new ArrayList<>();
        Connection connection = null;
        PreparedStatement statement = null;
        ResultSet resultSet = null;

        try {
            //1.与数

以上是关于图书管理系统--Java实现的主要内容,如果未能解决你的问题,请参考以下文章

Java——面向对象练习(图书管理系统的实现)

IDEA+Java+SSM+JSP+Mysql实现Web图书管理系统

java+swing实现书店管理系统

JAVA实现简易的图书管理系统(含过程)

基于java springboot的图书管理系统设计和实现《建议收藏》

基于java springboot的图书管理系统设计和实现《建议收藏》