图书管理系统

Java+MySQL

Posted by     "刘晓疆" on Friday, March 4, 2022

当我看到你的第一眼,就把人生里浪漫的是想了个遍。世人的喜欢只会停留在新鲜的第一面,有了爱的牵绊那就会有一生的纠缠…一生只此一回的爱,等多少年都不晚。

前言

这次想写一个图书管理系统,主要包含用户和管理员模块,用户可以实现登录,注册,查询个人信息,借书和还书等操作。管理员可以实现对用户的添加,修改,删除和对书籍的入库、借出、查询等操作。

相关知识了解

三层架构:通常意义上的三层架构就是将整个业务应用划分为:界面层(UI)、业务逻辑层(Service)、数据 访问层(Dao)再加上实体类库(entity)。

1、Dao层 主要是存放对数据类的访问,即对数据库的添加、删除、修改、更新等基本操作

2、Service层 将UI表示层与DAL数据访问层之间联系起来。所要负责的,就是处理涉及业务逻辑相关的问题,比如在调用访问数据库之前,先处理数据、判断数据

3、UI层 用户表现层(UIL),就是用户看到的主界面。

具体设计

目前完成的有(4日):用户的实体部分(entity层),部分功能实现:用户的添加,修改和删除。 用户的实体部分代码:

    private Integer id;
    private String name;
    private String password;
    private String brrow;
    private  String back;
    private String tel;

Dao层

完成了对用户的添加,修改,删除,查找全部用户和按用户名查找。 UserDao接口:

public interface Dao {
     void add(User user);
     User findUserbyname(String name);
     void  Update(User user);
     List<User> Findall();
     void  delete(User user);
}

//用户添加

public void add(User user) {
        user.setId(users.size()+1);
        users.add(user);}

//按用户名修改个人信息

public void Update(User user) {
    for(User u:users){
        if(u.getName().equals(user.getName())) {
            u.setPassword(user.getPassword());
            u.setTel(user.getTel());
            break;
        }
    }
}

//按用户id删除用户

public void delete(User user) {
        users.remove(user.getId()-1);
    }

//查找全部用户

public List<User> Findall() {
        List<User> list=new ArrayList();
        users.forEach(item ->{
            list.add(item);
        });
        return list;
    }

//按用户名查找

public User findUserbyname(String name) {
       for( User u :users){
           if (u.getName().equals(name)){
               return  u;
           }
       }
       return null;
    }

Service层

调用上述方法。 UserService接口:

 boolean addUser(User u);
    void  delete(User u);
     List<User>Findall();
   void brrow();
   void back();
   User findUserbyname(String name);
   void  update(User user)

//service层调用dao层方法为ui面板提供服务

    @Override
    public void delete(User u) {userDao.delete(u);}

    @Override
    public List<User>Findall() { return userDao.Findall();}

    @Override
    public void brrow() {

    }

    @Override
    public void back() {

    }

    @Override
    public User findUserbyname(String name) {
       return userDao.findUserbyname(name);
    }

    @Override
    public void update(User user) {
        userDao.Update(user);
    }

UI面板

测试(4):对目前功能的测试板块

public class Ui {
    UserService userService = new UserServiceImpl();
    public static void show(){
        System.out.println("1、添加用户");
        System.out.println("2、删除用户");
        System.out.println("3、查询用户");
        System.out.println("4、修改信息");
        System.out.println("5、退出");
    }
    public void  choice() {
        boolean keep = true;
        while (keep) {
            show();
            Scanner sc = new Scanner(System.in);
            System.out.println("请输入选择:");
            switch (sc.nextInt()) {
                case 1:
                    System.out.println("请输入用户名:");
                    String name = sc.next();
                    User user = new User(name);
                    boolean y = userService.addUser(user);
                    if (y) {
                        System.out.println("添加成功!");
                    } else {
                        System.out.println("名字重复了!");
                    }
                    break;
                case 2:
                    System.out.println("请输入用户id:");
                    int id = sc.nextInt();
                    User u1 = new User();
                    u1.setId(id);
                    userService.delete(u1);
                    System.out.println("删除成功。");
                case 3:
                    List<User> list = userService.Findall();
                    for (User users:list){
                        System.out.println(users.toString());
                    }


                    break;
                case 4:
                    System.out.println("请输入用户名:");
                    name = sc.next();
                    System.out.println("请输入修改后的密码:");
                    String psd =sc.next();
                    System.out.println("请输入修改后的电话:");
                    String tel = sc.next();
                    User u3 = new User(name,psd,tel);
                    userService.update(u3);
                    break;
                case 5:
                    keep = false;
                    break;

            }
        }
    }
    public static void main(String[] args) {
        Ui ui = new Ui();
        ui.choice();
    }

功能测试截图: 效果图

3.5更新..

管理员实体类设定为:id,姓名,密码,电话等。

    private Integer id;
    private String name;
    private String password;
    private  Integer tel;

管理员Dao层部分

与用户功能基本相同:包含对管理员自身的注册、删除、信息修改、全部查找及单个查找。

   for (Admin a:admins){
            if(a.getName().equals(admin.getName())){
                a.setPassword(admin.getPassword());
                a.setTel(admin.getTel());
            }
        }

管理员Service层

完成对管理员信息的各项操作,联系Dao层与ui界面。

public void AdminUpdate(Admin admin) {
    adminDao.AdminUpdate(admin);
    }

    @Override
    public void Admindelete(Admin admin) {

    }

    @Override
    public List<Admin> FindAll() {
       return adminDao.FindAll();
    }

    @Override
    public Admin findAdminByName(String name) {
        return adminDao.findAdminByName(name);
    }

登录

用户及管理员的登录问题(暂时放在ui界面中),在Ui界面中写入布尔方法,根据返回值判断是否登录成功,继续进行下面的操作。

  public  boolean Userlogin() {
                List<User> list = userService.Findall();
                System.out.println("请输入用户名:");
                String name3 = sc.next();
                System.out.println("请输入密码:");
                String psd2 = sc.next();
                User u = new User(name3);
                u = userService.findUserbyname(name3);
                for (int i = 0; i < list.size(); i++) {
                    if (list.get(i).getPassword().equals(u.getPassword())) {
                        return true;
                    }

                }
                return false;
            }

执行Ui测试

 public static void ui() {
        System.out.println("*********欢迎来到图书管理系统***********");
        System.out.println("        请选择您要登录的身份        ");
        System.out.println("1、用户登录");
        System.out.println("2、管理员登录");
        System.out.println("3、用户注册");
        System.out.println("4、管理员注册");

        System.out.println("5、退出");

相关截图 功能截图

3.6…..有点小困难(没有连数据库,导致每次测试的数据无法生效,整了好多遍。。。)

书籍类

书籍实体

为书籍设计了序号、名称、出版社、作者、数量等变量

 private Integer id;
    private String bookname;
    private String press;
    private String author;
    private Integer num;

想把ui中的方法写到各自的文件夹中,但是两个类之间的变量并不互通,暂时还没找到好的方法,等数据库连好以后应该就可以了。 对书籍的操作有添加、删除、修改、查找全部书籍与按名查找。。。

BookDao层

部分代码

    public class BookDaoImpl implements BookDao {
         private List< Book >  books = new ArrayList<>();
        @Override
        public Book findBookByName(String name) {
            for (int i=0;i< books.size();i++){
                if(books.get(i).getBookname().equals(name)){
                    return books.get(i);
                }
            }
            return null;
        }

        @Override
        public void add(Book book) {
        book.setId(books.size()+1);
        books.add(book);
        }
        public void Update(Book book) {
            for(Book book1:books){
                if(book1.getBookname().equals(book.getBookname())) {
                book1.setNum(book.getNum()+1);
                    break;
                }
            }
        }

        @Override
        public void delete(Book book) {
        books.remove(book.getId()-1);
        }

        @Override
        public List<Book> FindAllBook() {
            List<Book> list =new ArrayList<>();
            books.forEach(item->{
            list.add(item);
            });
            return list;
        }

BookService层

采用布尔函数来添加书籍,但是后面用户的书籍还书等操作需要直接进行添加操作,所以还需要一个直接添加的函数。 部分代码

public class BookServiceImpl implements BookService {
    BookDao bookDao = new BookDaoImpl();
    @Override
    public Book FindBookByName(String name) {
        return bookDao.findBookByName(name);
    }

    @Override
    public boolean BookAdd(Book book) {
        List<Book> list= bookDao.FindAllBook();
        for(int i=0;i<list.size();i++){
            if(list.get(i).getBookname().equals(book.getBookname())){
                return false;
            }
        }
        bookDao.add(book);
        return true;
    }

    @Override
    public void Bookdelete(Book book) {
    bookDao.delete(book);
    }

    @Override
    public List<Book> FindAllBook() {
        return bookDao.FindAllBook();
    }

    @Override
    public void Update(Book book) {
        bookDao.Update(book);
    }

执行Ui测试

用户的书籍借书还书操作基本成功,但具体还需要连接数据库以实验
而管理员的书籍操作可以实现,查询的数据也能显示出来 代码:

 case 4:
                System.out.println("请选择您要进行的服务:");
                Brrow.bookUi();
                Brrow.bookChoice();
                break;
            case 5:
                System.out.println("请输入您要还的书名:");
                String name3 = sc.next();
                Book book = new Book();
                Book book1 = new Book(name3,0);
                book = bookService.FindBookByName(name3);
                if(book!=null){
                   bookService.Update(book);
                }else {
                    boolean k = bookService.BookAdd(book1);
                    if (k) {
                        bookService.Update(book1);
                    }
                }
                System.out.println("还书成功!");
                Usershow();
                Userchoice();
                break;
public class Books {
    static BookService b=new BookServiceImpl();
    public static void bookui(){
        System.out.println("1、添加书籍");
        System.out.println("2、删除书籍");
        System.out.println("3、查询全部书籍");
        System.out.println("4、按名查询书籍");

    }
    public static void bookcho() {
        System.out.println("请输入选择:");
        Scanner scanner = new Scanner(System.in);
        switch (scanner.nextInt()) {
            case 1:
            System.out.println("请输入书籍名称:");
            Scanner sc = new Scanner(System.in);
            String name = sc.next();
            System.out.println("请输入书籍出版社:");
            String press = sc.next();
            System.out.println("请输入书籍作者:");
            String author = sc.next();
            System.out.println("请输入书籍数目:");
            int num = sc.nextInt();
            Book book = new Book(name, press, author, num);
            boolean k = b.BookAdd(book);
            if (k) {
                System.out.println("添加成功");
            } else {
                System.out.println("重复添加书籍!!");
            }
            bookui();
            bookcho();etc...

测试截图
测试截图

3.7…. 数据库文件

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE IF EXISTS `admin`;
CREATE TABLE IF NOT EXISTS `admin` (
    `a_id` INT UNSIGNED AUTO_INCREMENT,//设立自增
    `a_name` VARCHAR(20) NOT NULL,
    `a_psd` VARCHAR(20) NOT NULL,
    `a_tel` DOUBLE  NOT NULL,
    PRIMARY KEY (`a_id`)
    )ENGINE=InnoDB DEFAULT CHARSET =utf8;
INSERT INTO `admin` VALUES ('1','测试管理员1', '1','12345');
INSERT INTO `admin` VALUES ('2','测试管理员2', '1','23456');
INSERT INTO `admin` VALUES ('3','测试管理员3', '1','34567');
INSERT INTO `admin` VALUES ('4','测试管理员4', '1','1234');
INSERT INTO `admin` VALUES ('5','测试管理员5', '1','12345');
INSERT INTO `admin` VALUES ('6','测试管理员6', '1','123456');
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user`  (
     `u_ID` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '账号(主键)',
    `u_Name` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '客户姓名',
    `u_PSWD` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '客户密码',
    `u_tel` DOUBLE  NOT NULL,
    PRIMARY KEY (`u_ID`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of customer
INSERT INTO `admin` VALUES ('1','测试用户1', '1','12345');
INSERT INTO `admin` VALUES ('2','测试用户2', '1','23456');
INSERT INTO `admin` VALUES ('3','测试用户3', '1','34567');
INSERT INTO `admin` VALUES ('4','测试用户4', '1','1234');
INSERT INTO `admin` VALUES ('5','测试用户5', '1','12345');
INSERT INTO `admin` VALUES ('6','测试用户6', '1','123456');
CREATE  TABLE `book`(
    `b_id` varchar (20) NOT NULL COMMIT ,
    `b_name` varchar (20) NOT NULL,
    `b_p` varchar (20) NOT NULL ,
    `b_a` varchar (20) NOT  NULL ,
    PRIMARY  KEY (`b_id`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;

数据库连不上,应该在开始的时候就直接连上数据库来写的,现在我直接将程序写完,导致现在所有方法都要改变,一直出问题,直接连不上了。 难受哦 3.8-3.9… 数据库连接成功了..问题是我导的mysq-connect包是5.08版本的,但我的要素语法采用的是6.0版本,所以一直报错。

完整版

Dao层

Admin Dao
User Dao
Book Dao
展示Admin dao部分代码:

public int Adminadd(Admin admin) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        int flag = 0;

        try {
            conn = JDBCUtil.getConnection();

           // Integer a_id = admin.getId();
            String a_name=admin.getName();
            String a_psd = admin.getPassword();
            Integer a_tel = admin.getTel();

            String sql = "insert into admin values(null , ?, ?, ? )";
            ps = conn.prepareStatement(sql);
            //ps.setInt(1,a_id);
            ps.setString(1,a_name);
            ps.setString(2, a_psd);
            ps.setInt(3,a_tel);

            //System.out.println("insertAdmin(Admin admin)" + sql);

            flag = ps.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtil.closeResource(conn, ps, rs);
            return flag  ;
        }
    }


    @Override
    public int Admindelete(Admin admin) {
        Connection con =null;
        PreparedStatement ps=null;
        ResultSet rs = null;
        int flag=0;
        try {
            con = JDBCUtil.getConnection();
            String a_name = admin.getName();
            String sql = "delete from admin where a_name = ?";
            ps = con.prepareStatement(sql);
            ps.setString(1,a_name);
            flag = ps.executeUpdate();

        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            JDBCUtil.closeResource(con,ps,rs);
            return flag;
        }
    }

    @Override
    public int AdminUpdate(Admin admin) {
     Connection con =null;
     PreparedStatement ps =null;
     ResultSet rs =null;
     int flag=0;
     Admin a=null;
     try {
         con =JDBCUtil.getConnection();
         String psd =admin.getPassword();
         Integer tel = admin.getTel();
         String sql = "UPDATE admin set a_psd = ? , a_tel = ?  where a_name = ?";
         ps =con.prepareStatement(sql);
         ps.setString(1,psd);
         ps.setInt(2,tel);
         ps.setString(3,admin.getName());
         flag = ps.executeUpdate();

     } catch (Exception e) {
         e.printStackTrace();
     }finally {
         JDBCUtil.closeResource(con,ps,rs);
         return flag;
     }
    }

    @Override
    public List<Admin> FindAll() {
        List<Admin> list = new ArrayList<>();
        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;

            try {
                con = JDBCUtil.getConnection();
                String sql = "select * from admin";
                ps = con.prepareStatement(sql);
                rs = ps.executeQuery();
                while (rs.next()) {
                    Admin admin = new Admin();
                    admin.setId(rs.getInt("A_id"));
                    admin.setName(rs.getString("A_name"));
                    admin.setPassword(rs.getString("A_psd"));
                    admin.setTel(rs.getInt("A_tel"));
                    list.add(admin);
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        finally {
            JDBCUtil.closeResource(con, ps, rs);
            return list;
        }
    }

    @Override
    public Admin findAdminByName(String name) {
        Connection conn = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        Admin admin1 = null;

        try {
            conn = JDBCUtil.getConnection();

            String a_name = name;

            String sql = "select * from admin where a_name = ?";

            ps = conn.prepareStatement(sql);
            //System.out.println("selectAdmin(Admin admin)" + sql);

            ps.setString(1, a_name);

            rs = ps.executeQuery();

            while (rs.next()) {
                admin1 = new Admin(name);
                admin1.setId(rs.getInt("A_ID"));
                admin1.setPassword(rs.getString("A_psd"));
                admin1.setTel(rs.getInt("A_tel"));
            }
        } catch (
                SQLException e) {
            e.printStackTrace();
        } finally {
                JDBCUtil.closeResource(conn, ps, rs);
                return admin1;
        }
    }

    @Override
    public Admin findAdminByNamewithpsd(Admin admin) {
        Connection con = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        Admin admin1 = null;
        try {
            con = JDBCUtil.getConnection();
            String a_name = admin.getName();
            String a_psd = admin.getPassword();
            String sql = "Select * from admin where a_name= ? And a_psd = ? ";
            ps = con.prepareStatement(sql);
            ps.setString(1, a_name);
            ps.setString(2, a_psd);

            rs = ps.executeQuery();
            while (rs.next()) {
                admin1 = new Admin(a_name, a_psd);
                admin1.setId(rs.getInt("a_id"));
                admin1.setTel(rs.getInt("a_tel"));

            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtil.closeResource(con,ps,rs);
            return admin1;
        }
    }

Service

与前面差距不大,主要是调用Dao层的方法。

Ui界面

将各个实体的功能分开,使结构更加清晰,整洁。

long()
choice()
Ui()

测试截图: 管理员界面实现书籍添加功能并向数据库中存入信息: 测试截图 数据库中写入: jt2

小程序github仓库入口

「真诚赞赏,手留余香」

Xiaojiang Blog

真诚赞赏,手留余香

使用微信扫描二维码完成支付