JDBC编程相关知识(实现图书管理系统进阶版)

news2024/9/22 19:42:48

目录

一、配置MySQL数据库驱动包

 二、JDBC常规操作

1、创建数据源

2、建立连接

3、操作数据库,执行sql语句

4、关闭资源 

三、JDBC实现图书管理系统 

1、建表

2、连接数据库

3、创建实体类

a、Book类

b、BookShelf类

c、User类

d、Administrator类

e、RegularUser类

4、实现操作类 

a、Operate接口

b、 添加图书方法

c、删除图书 

d、显示图书 

e、查找图书 

f、借阅图书 

g、归还图书 

h、退出系统

5、Main

6、效果演示


一、配置MySQL数据库驱动包

进入maven的中央仓库https://mvnrepository.com/在搜索框中输入mysql,找到与自己电脑上MySQL版本相关的jar包进行下载,如MySQL为5.x版本,那jar包也选择5.x版本:

点击对应版本后,点击jar进行下载:

 在idea中创建一个项目,并创建一个lib文件夹,将下载好的jar包放到文件夹lib下,然后双击lib选择Add as...完成配置。

 二、JDBC常规操作

1、创建数据源

DataSource dataSource=new MysqlDataSource();
//设置数据库所在地址
((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/library?characterEncoding=utf8&useSSL=false");
//设置数据库用户名
((MysqlDataSource) dataSource).setUser("root");
//设置数据库的登录密码
((MysqlDataSource) dataSource).setPassword("1789");

url的格式为:jdbc:mysql://服务器地址:端口/数据库名?参数名=参数值

2、建立连接

Connection connection = (Connection) dataSource.getConnection();

3、操作数据库,执行sql语句

以删除数据为例:

String sql="delete from book where name=?";
PreparedStatement statement=connection.prepareStatement(sql);
statement.setString(1,name);
statement.executeUpdate()

在sql语句中有些数据是不确定的需要用户输入,就暂时用?替代,然后再使用statement.setxx()进行替换,最后对语句进行执行,对于插入、修改、删除操作利用 executeUpdate()执行,返回值为一个整数表示多少行受影响,而对于查询操作使用executeQuery()执行,返回的是一张表,需要使用ResultSet结果集接收,并利用其next()方法对得到的结果集进行遍历,例如:对于book表查找得到的内容进行输出:

  String sql="select * from book";
        PreparedStatement statement=connection.prepareStatement(sql);
        ResultSet resultSet = statement.executeQuery();
        while(resultSet.next()){
            int id=resultSet.getInt("id");
            String name=resultSet.getString("name");
            String author=resultSet.getString("author");
            Double price=resultSet.getDouble("price");
            String theme=resultSet.getString("theme");
            boolean isBorrowed=resultSet.getBoolean("statue");
            Date borrowTime=resultSet.getDate("borrow_time");
            Date returnTime=resultSet.getDate("return_time");
            System.out.println("Book{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    ", author='" + author + '\'' +
                    ", price=" + price +
                    ", theme='" + theme + '\'' +
                    ", isBorrowed=" + isBorrowed +
                    ", borrowTime=" + borrowTime +
                    ", returnTime=" + returnTime +
                    '}');
        }

4、关闭资源 

对于JDBC中资源使用完毕后要进行关闭,对于先使用的资源后关闭,对于后使用的资源先关闭,以上述的查找操作为例:

 resultSet.close();
 statement.close();
 connection.close();

三、JDBC实现图书管理系统 

之前在JavaSE实现了图书管理系统,但是每次运行结束后数据也随之丢失,也不符合实际应用,那么使用JDBC连接MySQL数据库就可以实现。

1、建表

针对图书管理的需求,需要建立存放书的表、管理员表和普通用户表。

create table book(id int primary key,name varchar(50) not null,
price double(3,1) not null,theme varchar(20) not null,
statue boolean default false,borrow_time datetime,return_time datetime);
create table administrator(id int primary key auto_increment,name varchar(20),password varchar(20));
create table regularuser(id int primary key auto_increment,name varchar(20),password varchar(20));

三个表的结构分别为:

  

2、连接数据库

创建DBUtil类,其中定义了一个静态方法返回数据库的连接,在之后的操作数据库时进行使用。

import com.mysql.jdbc.Connection;
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import javax.sql.DataSource;
import java.sql.SQLException;

public class DBUtil {
    public static Connection getConnection() throws SQLException {
        //1.创建数据源
        DataSource dataSource =new MysqlDataSource();
        //设置数据库所在地址
        ((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/library?characterEncoding=utf8&useSSL=false");
        //设置数据库用户名
        ((MysqlDataSource) dataSource).setUser("root");
        //设置数据库的登录密码
        ((MysqlDataSource) dataSource).setPassword("gsy20021014");
        //2.建立连接
        Connection connection = (Connection) dataSource.getConnection();
        return connection;
    }

}

3、创建实体类

实体可以分为两类:书和用户,书包含书类和书架类,用户包含管理员类和普通用户类

为什么还要定义类?直接操作表不就行

当时这个问题也是困惑了我很久,但是在写代码时就会发现整个项目之间没有联系,没有封装性,比如在后面登录时选择身份时如果没有类就很难完成,有了类使整个项目联系密切,逻辑性强。

a、Book类

表示书类,相对于se版本的图书系统,增加了借书时间和还书时间两个属性,并且书类和创建的book表的内容几乎一致。 定义了两个构造方法,一个包含所有的属性,另一个没有包含是否借出、借书时间和还书时间。

import java.util.Date;
import java.util.Objects;

public class Book {
    private int id;//图书编号
    private String name;//图书名称
    private String author;//图书作者
    private double price;//图书价格
    private String theme;//图书主题
    private boolean isBorrowed;//图书是否被借出
    private Date borrowTime;//借阅时间
    private Date returnTime;//归还时间
    public int getId() {
        return id;
    }

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


    public Date getBorrowTime() {
        return borrowTime;
    }

    public void setBorrowTime(Date borrowTime) {
        this.borrowTime = borrowTime;
    }

    public Date getReturnTime() {
        return returnTime;
    }

    public void setReturnTime(Date returnTime) {
        this.returnTime = returnTime;
    }

    public Book(int id,String name, String author, double price, String theme) {
        this.id=id;
        this.name = name;
        this.price=price;
        this.author = author;
        this.theme = theme;
        this.isBorrowed = false;//默认未借出
    }

    public Book(int id, String name, String author, double price, String theme, boolean isBorrowed, Date borrowTime, Date returnTime) {
        this.id = id;
        this.name = name;
        this.author = author;
        this.price = price;
        this.theme = theme;
        this.isBorrowed = isBorrowed;
        this.borrowTime = borrowTime;
        this.returnTime = returnTime;
    }

    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 String getTheme() {
        return theme;
    }

    public void setTheme(String theme) {
        this.theme = theme;
    }

    public boolean isBorrowed() {
        return isBorrowed;
    }

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

    public double getPrice() {
        return price;
    }

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

    @Override
    public String toString() {
        return "Book{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", price=" + price +
                ", theme='" + theme + '\'' +
                ", isBorrowed=" + isBorrowed +
                ", borrowTime=" + borrowTime +
                ", returnTime=" + returnTime +
                '}';
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        Book book = (Book) o;
        return isBorrowed == book.isBorrowed && Objects.equals(name, book.name) && Objects.equals(author, book.author) && Objects.equals(theme, book.theme);
    }

b、BookShelf类

仍然需要书架类,便于之后对book表的各种操作,但是构造方法发生了改变,之前的currentSize书架当前存放书本书目是固定的,并且默认是书架中存放了几本书,而现在需要统计Book表中存放了多少条数据,在此使用了全列查询,对得到的结果集遍历,将书存放到书架上,并且得到currentSize的大小。

import util.DBUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;

public class Bookshelf {
    private Book[] books ;//书架类
    private int size;//书架当前存放图书的数目
    private int currentSize=0;
    public Bookshelf(int size) {
        books = new Book[size];
        this.size=size;
    }
    public Bookshelf() throws SQLException {
        books = new Book[10000];//默认能存放10000本书
        this.size=10000;
        Connection connection= DBUtil.getConnection();
        String sql="select * from book";
        PreparedStatement statement=connection.prepareStatement(sql);
        ResultSet resultSet = statement.executeQuery();
        int count=0;
        while(resultSet.next()) {
            int id = resultSet.getInt("id");
            String name = resultSet.getString("name");
            String author = resultSet.getString("author");
            Double price = resultSet.getDouble("price");
            String theme = resultSet.getString("theme");
            boolean isBorrowed = resultSet.getBoolean("statue");
            Date borrowTime = resultSet.getTime("borrow_time");
            Date returnTime = resultSet.getTime("return_time");
            books[count++] = new Book(id, name, author, price, theme, isBorrowed, borrowTime, returnTime);
        }
        this.currentSize=count;
    }


    public int getCurrentSize()  {
        return this.currentSize;

    }

    public void setCurrentSize(int currentSize) {
        this.currentSize = currentSize;
    }

    public int getSize() {
        return size;
    }

    public void setSize(int size) {
        this.size = size;
    }

    /**
     * 获取指定位置的图书
     * @param pos
     * @return
     */
    public Book getBook(int pos){
        if(pos>=size){
            System.out.println("已超出书架当前容量");
        }else{
            return books[pos];
        }
        return null;
    }
    public void addBook(Book book){
        books[currentSize]=book;
    }

    /**
     * 修改指定位置的图书
     * @param pos
     * @param book
     * @return
     */
    public void modify(int pos,Book book){
        if(pos>=size){
            System.out.println("已超出书架当前容量");
            return ;
        }else{
            books[pos]=book;
        }
    }
}

c、User类

User类是管理员和普通用户的父类,因为在登录时登录时选择不同身份来对数据库进行操作,除了表中属性,还需要定义一个接口数组用于存放各种对书架的相关操作方法,需要一个展示菜单的方法并返回选项,然后再定义一个doWork()方法是依据选项来操作数据库。还需要定义一个身份验证的方法。

import book.Bookshelf;
import operate.Operate;
import java.sql.SQLException;

public abstract class User {
    public int id;//用户编号
    public String name;//用户姓名
    public String password;//用户密码
    public Operate[] operates;
    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public User( String name, String password) {

        this.name = name;
        this.password = password;
    }

    public User() {
    }
    public abstract int menu();
    public  void doWork(int option, Bookshelf books) throws SQLException {
         this.operates[option].work(books);
    }
    public abstract boolean authentication(String name, String pwd)throws SQLException;

}

d、Administrator类

管理员的主要功能是对图书进行增加、删除、查看以及查找,管理员类继承User类,需要对父类定义的接口数组完善将自己特有的方法进行填充。对于重写身份验证方法,使用select name,password from administrator ,遍历结果集得到姓名和密码,若有对应的密码和密码则登录成功,否则登录失败。

import operate.*;
import util.DBUtil;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;

public class Administrator extends User{
    public Administrator(){

    }
    public Administrator(String name, String password) {
        super(name,password);
        this.operates=new Operate[]{
                new ExitOpe(),
                new AddBook(),
                new DelBook(),
                new DisplayBook(),
                new FindBook()
        };
    }

    @Override
    public int menu() {
        System.out.println("*******************************************");
        System.out.println("    1.添加图书                   2.删除图书   ");
        System.out.println("    3.显示图书                   4.查找图书   ");
        System.out.println("    0.退出系统                              ");
        System.out.println("*******************************************");
        System.out.println("请输入您的操作:");
        Scanner sc = new Scanner(System.in);
        int option = sc.nextInt();
        return option;
    }

    @Override
    public  boolean authentication(String name,String pwd) throws SQLException {
        Connection connection= DBUtil.getConnection();
        String sql="select name,password from administrator where name=?";
        PreparedStatement statement=connection.prepareStatement(sql);
        statement.setString(1,name);
        ResultSet resultSet=statement.executeQuery();
        if(resultSet.next()){
            String na=resultSet.getString("name");
            String pw=resultSet.getString("password");
            if(pw.equals(pwd)&&na.equals(name)){
                return true;
            }
        }
        return false;
    }

}

e、RegularUser类

普通用户类同样继承User类,内部实现与管理员类相似。

import operate.*;
import util.DBUtil;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Scanner;

public class RegularUser extends User{
    public RegularUser(){

    }
    public RegularUser(String name, String password) {
        super(name,password);
        this.operates=new Operate[]{
                new ExitOpe(),
                new BorrowBook(),
                new ReturnBook(),
                new DisplayBook(),
                new FindBook(),

        };
    }

    @Override
    public int menu() {
        System.out.println("*******************************************");
        System.out.println("    1.借阅图书                   2.归还图书   ");
        System.out.println("    3.显示图书                   4.查找图书   ");
        System.out.println("    0.退出系统                              ");
        System.out.println("*******************************************");
        System.out.println("请输入您的操作:");
        Scanner sc = new Scanner(System.in);
        int option = sc.nextInt();
        return option;
    }

    @Override
    public boolean authentication(String name, String pwd) throws SQLException {
        Connection connection= DBUtil.getConnection();
        String sql="select name,password from regularuser where name=?";
        PreparedStatement statement=connection.prepareStatement(sql);
        statement.setString(1,name);
        ResultSet resultSet=statement.executeQuery();
        if(resultSet.next()){
            String na=resultSet.getString("name");
            String pw=resultSet.getString("password");
            if(pw.equals(pwd)&&na.equals(name)){
                return true;
            }
        }
        return false;
    }
}

4、实现操作类 

a、Operate接口

创建一个接口,内部定义一个抽象的work方法,然后操作类都实现这个接口,并重写work方法。

import book.Bookshelf;
import java.sql.SQLException;

public interface Operate {
    void work(Bookshelf books) throws SQLException;
}

b、 添加图书方法

由于书架当时的初始容量为10000,但还是进行了判断,如果容量已满则无法添加,再进一步输入要添加图书的信息,利用图书类中的equals()方法对添加的图书与已经存放的图书,若有重复则无法添加,否则使用insert插入语句进行添加,完成对数据库的更新,并且要将该图书添加到书架类的数组中。

public class AddBook implements Operate{
    @Override
    public void work(Bookshelf books) throws SQLException {
        if(books.getCurrentSize()>= books.getSize()){
            System.out.println("书架已满,无法继续添加");
        }else{
            Scanner sc=new Scanner(System.in);
            System.out.println("请输入图书信息:");
            System.out.println("图书编号:");
            int id=sc.nextInt();
            System.out.println("图书名称:");
            String name=sc.next();
            System.out.println("图书作者:");
            String author = sc.next();
            System.out.println("图书价格:");
            int price = sc.nextInt();
            System.out.println("图书主题:");
            sc.nextLine();
            String theme= sc.nextLine();
            Book book = new Book(id,name, author, price, theme);
            for (int i = 0; i < books.getCurrentSize(); i++) {
                if(book.equals(books.getBook(i))){
                    System.out.println("该图书已经存在,无法继续添加!");
                    return;
                }
            }
            String sql="insert into book(id,name,author,price,theme) values(?,?,?,?,?)";
            Connection connection= DBUtil.getConnection();
            PreparedStatement statement=connection.prepareStatement(sql);
            statement.setInt(1,id);
            statement.setString(2,name);
            statement.setString(3,author);
            statement.setDouble(4,price);
            statement.setString(5,theme);
            books.addBook(book);
            books.setCurrentSize(books.getCurrentSize()+1);
            int ret=statement.executeUpdate();
            if(ret>0){
                System.out.println("添加成功!");
            }
            statement.close();
            connection.close();
        }
    }
}

c、删除图书 

输入要删除的图书名称,利用书架类的数组遍历,此处不使用select语句进行查找是后面对书架进行删除时需要得到图书在书架的位置,找到后使用delete语句删除图书,然后再使用循环覆盖删除书架中的该图书。

public class DelBook implements Operate{
    @Override
    public void work(Bookshelf books) throws SQLException {
        System.out.println("请输入要删除的图书名称");
        Scanner sc=new Scanner(System.in);
        String name=sc.nextLine();
        int pos=-1;
        for (int i = 0; i < books.getCurrentSize(); i++) {
            if(name.equals(books.getBook(i).getName())){
                pos=i;
                break;
            }
        }
        if(pos==-1){
            System.out.println("未找到您要删除的图书");
        }else{
            Connection connection= DBUtil.getConnection();
            String sql="delete from book where name=?";
            PreparedStatement statement=connection.prepareStatement(sql);
            statement.setString(1,name);
            int ret=statement.executeUpdate();
            if(ret>0){
                System.out.println("删除成功!");
            }
            for(int i= pos+1;i<books.getCurrentSize();i++){
                Book book=books.getBook(i);
                books.modify(i-1,book);
            }
            books.modify(books.getCurrentSize(),null);
            books.setCurrentSize(books.getCurrentSize()-1);
            statement.close();
            connection.close();
        }
    }
}

d、显示图书 

显示所有的图书信息,此处使用select语句对book表进行全列查询,此处也可以遍历书架得到所有图书的信息。  

public class DisplayBook implements Operate{
    @Override
    public void work(Bookshelf books) throws SQLException {
        Connection connection= DBUtil.getConnection();
        String sql="select * from book";
        PreparedStatement statement=connection.prepareStatement(sql);
        ResultSet resultSet = statement.executeQuery();
        System.out.println("====================================================================================================================");
        while(resultSet.next()){
            int id=resultSet.getInt("id");
            String name=resultSet.getString("name");
            String author=resultSet.getString("author");
            Double price=resultSet.getDouble("price");
            String theme=resultSet.getString("theme");
            boolean isBorrowed=resultSet.getBoolean("statue");
            Date borrowTime=resultSet.getDate("borrow_time");
            Date returnTime=resultSet.getDate("return_time");
            System.out.println("Book{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    ", author='" + author + '\'' +
                    ", price=" + price +
                    ", theme='" + theme + '\'' +
                    ", isBorrowed=" + (isBorrowed?"已借出":"未借出") +
                    ", borrowTime=" + borrowTime +
                    ", returnTime=" + returnTime +
                    '}');
        }

        System.out.println("====================================================================================================================");
        resultSet.close();
        statement.close();
        connection.close();
    }
}

e、查找图书 

此处使用的是select语句对图书名称进行精确查询,也使用循环遍历书架更为方便。

public class FindBook implements Operate{
    @Override
    public void work(Bookshelf books) throws SQLException {
        System.out.println("请输入要查找的图书名称");
        Scanner sc=new Scanner(System.in);
        String str=sc.nextLine();
        int pos=-1;
        Connection connection= DBUtil.getConnection();
        String sql="select * from book where name=?";
        PreparedStatement statement=connection.prepareStatement(sql);
        statement.setString(1,str);
        ResultSet resultSet = statement.executeQuery();
        if(resultSet==null){
            System.out.println("未找到您要找的书籍");
            return;
        }
        System.out.println("====================================================================================================================");
        while(resultSet.next()){
            int id=resultSet.getInt("id");
            String name=resultSet.getString("name");
            String author=resultSet.getString("author");
            Double price=resultSet.getDouble("price");
            String theme=resultSet.getString("theme");
            boolean isBorrowed=resultSet.getBoolean("statue");
            Date borrowTime=resultSet.getTime("borrow_time");
            Date returnTime=resultSet.getTime("return_time");
            System.out.println("Book{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    ", author='" + author + '\'' +
                    ", price=" + price +
                    ", theme='" + theme + '\'' +
                    ", isBorrowed=" + (isBorrowed?"已借出":"未借出") +
                    ", borrowTime=" + borrowTime +
                    ", returnTime=" + returnTime +
                    '}');
        }
        System.out.println("====================================================================================================================");
        resultSet.close();
        statement.close();
        connection.close();
    }
}

f、借阅图书 

 在借阅图书时,首先对输入的图书进行查找,若有才能进行借阅,使用update语句对图书的是否借出还有借阅时间进行修改,在创建图书类的日期是使用的是util包的Date类,但是在book表中的datetime是sql包的Date类,需要进行转换,对数据库中的book表完成更新后,同时也要修改书架上的图书信息。

public class BorrowBook implements Operate{
    @Override
    public void work(Bookshelf books) throws SQLException {
        System.out.println("请输入要借阅的图书名称");
        Scanner sc=new Scanner(System.in);
        String name=sc.nextLine();
        int pos=-1;
        for (int i = 0; i < books.getCurrentSize(); i++) {
            if(name.equals(books.getBook(i).getName())){
                pos=i;
                break;
            }
        }
        if(pos==-1){
            System.out.println("未找到您需要的图书");
        }else{
            if(books.getBook(pos).isBorrowed()==true){
                System.out.println("该图书已经借出");
                return;
            }
            Date date=new Date(System.currentTimeMillis());
            java.sql.Date sd=new java.sql.Date(date.getTime());
            Connection connection= DBUtil.getConnection();
            String sql1="update book set borrow_time=? where name=?";
            PreparedStatement statement1=connection.prepareStatement(sql1);
            statement1.setDate(1,sd);
            statement1.setString(2,name);
            String sql2="update book set statue=? where name=?";
            PreparedStatement statement2=connection.prepareStatement(sql2);
            Boolean flag=true;
            statement2.setBoolean(1,flag);
            statement2.setString(2,name);
            statement1.executeUpdate();
            statement1.close();
            statement2.executeUpdate();
            statement2.close();
            connection.close();
            books.getBook(pos).setBorrowed(true);
            books.getBook(pos).setBorrowTime(date);
            System.out.println("借阅成功!");
        }
    }
}

g、归还图书 

 在归还图书时,也要对图书的借阅状态和归还时间进行修改,操作与借阅图书类似。

public class ReturnBook implements Operate {
    @Override
    public void work(Bookshelf books) throws SQLException {
        System.out.println("请输入要归还的图书名称");
        Scanner sc=new Scanner(System.in);
        String name=sc.nextLine();
        int pos=-1;
        for (int i = 0; i < books.getCurrentSize(); i++) {
            if(name.equals(books.getBook(i).getName())){
                pos=i;
                break;
            }
        }
        if(pos==-1){
            System.out.println("未找到您需要的图书");
        }else{
            Date date=new Date(System.currentTimeMillis());
            java.sql.Date sd=new java.sql.Date(date.getTime());
            Connection connection= DBUtil.getConnection();
            String sql1="update book set return_time=? where name=?";
            PreparedStatement statement1=connection.prepareStatement(sql1);
            statement1.setDate(1,sd);
            statement1.setString(2,name);
            String sql2="update book set statue=? where name=?";
            PreparedStatement statement2=connection.prepareStatement(sql2);
            Boolean flag=false;
            statement2.setBoolean(1,flag);
            statement2.setString(2,name);
            statement1.executeUpdate();
            statement1.close();
            statement2.executeUpdate();
            statement2.close();
            connection.close();
            books.getBook(pos).setBorrowed(false);
            books.getBook(pos).setReturnTime(date);
            System.out.println("归还成功!");
        }
    }
}

h、退出系统

使用System.exit(0)方法退出系统,虽然该方法没有任何异常,但因为重写了Operate中的work方法,work方法抛出了sql异常,那么该方法也需要抛出异常。  

public class ExitOpe implements Operate{
    @Override
    public void work(Bookshelf books) throws SQLException {
        System.out.println("退出成功,欢迎下次使用!");
        System.exit(0);
    }
}

5、Main

在测试类中需要实现登录函数,由于在登录时才知道用户身份,所以使用User类为返回值进行向上转型,在登录函数中首先选择身份,然后对身份进行验证,验证成功后,即登录成功。

public class Main {

    public static User login() throws SQLException {
        System.out.println("请选择登录身份:1)管理员 2)普通用户");
        Scanner sc=new Scanner(System.in);
        int option=sc.nextInt();
        System.out.println("请输入姓名:");
        String name=sc.next();
        System.out.println("请输入密码:");
        String pwd=sc.next();
        if(option==1){
            boolean flag=new Administrator().authentication(name,pwd);
            if(flag){
                System.out.println("登陆成功!");
               return new Administrator(name,pwd);
            }else{
                System.out.println("姓名或密码输入有误");
            }
        }else if(option==2){
            boolean flag=new RegularUser().authentication(name,pwd);
            if(flag){
                System.out.println("登陆成功!");
                return new RegularUser(name,pwd);
            }else{
                System.out.println("姓名或密码输入有误");
            }
        }else{
            System.out.println("输入有误");
        }
        return null;
    }
    public static void main(String[] args) throws SQLException {
        Bookshelf books=new Bookshelf();
            User user=login();
            while(true){
                int ret=user.menu();
                user.doWork(ret,books);
            }
    }
}

6、效果演示

管理员和普通用户表如下所示: 

 

 

运行效果演示:

管理员:

 普通用户:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/98898.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

jsp+ssm计算机毕业设计大学生足球预约信息【附源码】

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; JSPSSM mybatis Maven等等组成&#xff0c;B/S模式 Mave…

java计算机毕业设计springboot+vue青少年编程在线考试系统

项目介绍 21世纪的今天,随着社会的不断发展与进步,人们对于信息科学化的认识,已由低层次向高层次发展,由原来的感性认识向理性认识提高,管理工作的重要性已逐渐被人们所认识,科学化的管理,使信息存储达到准确、快速、完善,并能提高工作管理效率,促进其发展。 论文主要是对青少…

AIGC stable diffusion完整部署手册 for linux

准备工作 &#xff08; GPU服务器4G显卡 &#xff09;&#xff1a; 1. 建议 Python3.10.7 以上的版本&#xff0c;最低不能低于3.10.5 2. pip pip3的版本升级到最新 pip 22.3.1 3. 安装python3.10.7之前先安装和升级 openssl-1.1.1q 4. yum安装源改成 阿里云 或者 清华 …

English Learning - L1-4 从此没有不会的表达(下) 2022.12.15 周四

English Learning - L1-4 从此没有不会的表达&#xff08;下&#xff09; 2022.12.15 周四5 动名词5.1 动名词都有什么作用作主语做表语做定语动名词做定语有啥讲究&#xff1f;做宾语5.2 动名词的复合结构---成功加入动名词自己的主语逻辑主语动名词复合结构作宾语时用普通格和…

2021年度汇总丨20大热门TWS耳机功能配置汇总解析

疫情下的时间匆匆而过&#xff0c;2021已成为过去&#xff0c;2022年正式开启。在过去的一年中&#xff0c;以TWS耳机为代表的音频市场依旧保持着健康稳定的发展&#xff0c;彰显这一市场超强的活力和朝好的未来发展。 回顾2021&#xff0c;这一年中&#xff0c;我爱音频网365天…

直线检测霍夫变换VS深度学习

1. 引言 直线检测有很多应用&#xff1a;例如&#xff0c;创建矢量化图、端点检测等。在这篇文章中&#xff0c;我们不讨论其具体的应用程序&#xff0c;而是重点关于于如何使用传统算法和深度学习的方法来进行直线检测&#xff0c;这里我们将对二者进行相关比较。 闲话少说&a…

经典算法之异或运算(无进位相加)

目录异或运算的定义异或运算的性质异或运算的应用交换两数翻转指定位寻找单身狗异或运算的定义 众所周知&#xff0c;计算机中的所有数据都是以二进制&#xff08;0或者1&#xff09;的形式存储。而异或运算符&#xff08;^&#xff09;就是将参加运算的两个数据&#xff0c;按…

C语言—数据类型

通过sizeof运算符获取数据类型的大小&#xff0c;int占4个字节&#xff0c;表示一个int变量可以存储32位的数据&#xff1b; vs2022中&#xff0c;sizeof运算符返回的结果是一个64位 (8bytes)的无符号整型的值&#xff0c;所以占位符要使用%lld&#xff1b; #include <std…

【空气起动系统控制】使用PID调节起动机入口压力值

前段时间师傅让做一个空起系统的建模&#xff0c;结果给忘了&#xff0c;现在趁着这几天疫情封控期间在家搞一搞&#xff0c;断断续续搞了五天&#xff0c;空起系统控制的相关资料太少了&#xff0c;还好最后弄出来了&#xff0c;虽然最后还存在点小问题&#xff0c;不过大体上…

【Java编程】SSH:Struts、Spring、Hibernate

SSH&#xff1a;Struts、Spring、HibernateSSH 框架指的是 Struts、Spring 和 Hibernate 三者的集成。集成 SSH 框架的系统从职责上分为表示层、业务逻辑层、数据持久层和域模块层。Struts 属于 MVC 框架的一种&#xff0c;提供了对 MVC 系统底层的支持&#xff0c;负责 MVC 的…

汽车ECU通信相关验证项有哪些?

已剪辑自: https://mp.weixin.qq.com/s/-fIAXkS37r6jvnuA7yIQDA 汽车电子的高速发展决定了基础软件所面临的要求将会更加严格&#xff0c;其要求会覆盖软件的安全性、稳定性、可扩展性等方方面面。为了提高软件质量&#xff0c;降低软件应用风险&#xff0c;构建高安全、高可靠…

什么是网站安全?如何查询网站在百度是否安全?

什么是网站安全&#xff1f; 百度词条的定义为网站安全是指出于防止网站受到黑客入侵者对其网站进行挂马&#xff0c;篡改网站源代码&#xff0c;被窃取数据等行为而做出一系列的安全防御工作&#xff0c;在我的理解中&#xff0c;网站安全就是当有人攻击你的网站时&#x…

Java+SSM社团管理系统(含源码+论文+答辩PPT等)

项目功能简介: 该项目采用的技术实现如下 后台框架&#xff1a;Spring、SpringMVC、MyBatis UI界面&#xff1a;JSP、jQuery 、H-ui 数据库&#xff1a;MySQL 系统功能 本社团管理系统是根据大学社团管理的实际应用而开发的&#xff0c;采用JSP技术&#xff0c;Java编程语言&am…

python调用halcon程序/.hdev文件/直接调用halcon引擎

一、前言 python有两种调用halcon的方法 1、安装halcon的python库&#xff0c;pip install mvtec-halcon20111 然后python代码中主要调用方式为&#xff1a;通过ha来调用halcon中的各种算子&#xff0c;本人不是很喜欢这种方式&#xff0c;后面主要介绍第2种方法。 import …

java计算机毕业设计springboot+vue校园出入管理系统

项目介绍 本论文主要论述了如何使用JAVA语言开发一个校园出入管理系统 ,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述校园出入管理系统的当前背景以及系统开发的目的,后续章节将严格按照软件开发流程,对系…

可能你看到的大部分教材里讲的指针和指针变量是一个概念,但是真的是这样吗?看完我这篇文章肯定会颠覆你的认知哦?

指针vs指针变量一、指针和指针变量的含义1、变量的“左值”和“右值”2、什么是指针&#xff1f;3、什么是指针变量&#xff1f;二、如何看待“指针就是指针变量”这种说法三、为什么要存在指针&#xff1f;四、对指针进行解引用操作的本质一、指针和指针变量的含义 1、变量的…

2022云南省职业院校技能大赛(高职组) Web技术(网站设计与开发)赛项规程

2022云南省职业院校技能大赛&#xff08;高职组&#xff09; Web技术&#xff08;网站设计与开发&#xff09;赛项规程 一、赛项名称 赛项名称&#xff1a;Web技术&#xff08;网站设计与开发&#xff09; 赛项组别&#xff1a;高职组 二、竞赛内容 Web技术&#xff08;网站设计…

SA-UNet:用于视网膜血管分割的空间注意力UNet

摘要 在本文中提出了一种名为空间注意力UNet&#xff08;SA-UNet&#xff09;的轻量级网络&#xff0c;它不需要大量的带注释的训练样本&#xff0c;可以以数据增强的方式来更有效的使用可用的带注释的样本。SA-UNet引入一种空间注意模块&#xff0c;这个模块沿着空间维度推断…

[激光原理与应用-61]:激光器 - 种子源 - 1064nm皮秒种子源参数解读

目录 第1章 种子源介绍 1.1 简介 1.2 种子源特点 1.3 皮秒种子源应用 第2章 《瀚盈激光》种子源性能指标解读 2.1 波长&#xff1a;1064nm 》红外 2.2 光谱宽度&#xff08;频率宽度、带宽&#xff09; 2.3 线宽 2.4 脉冲宽度 2.5 重复频率 周期T 2.6 输出功率 2.…

【世界杯黑技术专题】「原理探索专题」一文解读一下“卡塔尔世界杯”的先进技术之半自动越位技术SAOT+比赛用球Al Rihla

2022年卡塔尔世界杯即将谢幕 纵观2022年的卡塔尔世界杯的赛程&#xff0c;还是很多波澜的&#xff0c;很多强队都被草草的淘汰掉&#xff0c;特别是我之前较为看好的德国队、西班牙、葡萄牙等队伍草草的出局。让我的心不禁的一紧&#xff0c;到底花落谁家呢&#xff1f;我后面…