图书馆管理系统_三层架构_MySQL

图书馆管理系统(重构)项目_三层架构_MySQL

先前的图书馆管理系统主要通过控制台输入,存储数据通过文件进行存储。
而本次的重构图书馆管理系统虽然界面还是通过控制台输入输出,但是由于本系统重构的目的在于Java后端使用三层架构UBD、数据库使用MySQL进行数据的存储与访问。因此,前端采用最简单的显示方式以至于更清楚明了后端的代码功能与逻辑。


文章目录

  • 图书馆管理系统(重构)项目_三层架构_MySQL
  • 前言
  • 一、项目基础架构简介
  • 二、数据库表
    • 1.管理员表
    • 2.图书信息表
    • 3.读者信息表
    • 4.读者类型表
    • 5.借阅记录表
  • 三、三层UBD代码举例说明(展示)
    • 1、表现层(User Interface layer)
    • 2、业务逻辑层(Business Logic Layer)
    • 3、数据访问层(Data access layer)
  • 四、工具类
    • 1.数据库工具类 DBUtils.java
    • 2. sql执行返回对象字段(自设置)_工具类
  • 五、总结

前言

如果有感兴趣的可自行查看源代码!
本系统源代码地址


一、项目基础架构简介

如下图:本项目主要由【三层架构UBD】和 【实体层】 和 【工具层 】组成!

图书馆管理系统_三层架构_MySQL_第1张图片
详细工程展示:
图书馆管理系统_三层架构_MySQL_第2张图片图书馆管理系统_三层架构_MySQL_第3张图片图书馆管理系统_三层架构_MySQL_第4张图片
图书馆管理系统_三层架构_MySQL_第5张图片

除此之外,依赖于libs中的jar包。
【注】libs中的本地包如何导入项目中:
图书馆管理系统_三层架构_MySQL_第6张图片图书馆管理系统_三层架构_MySQL_第7张图片
图书馆管理系统_三层架构_MySQL_第8张图片
点击OK即可。

以及数据库sql文件。 使用MySQL管理工具执行sql脚本即可!

二、数据库表

1.管理员表

在这里插入图片描述

2.图书信息表

图书馆管理系统_三层架构_MySQL_第9张图片

3.读者信息表

图书馆管理系统_三层架构_MySQL_第10张图片

4.读者类型表

在这里插入图片描述

5.借阅记录表

图书馆管理系统_三层架构_MySQL_第11张图片

三、三层UBD代码举例说明(展示)

1、表现层(User Interface layer)

以用户界面 管理员为例:

package lms.view;

import com.sun.org.glassfish.gmbal.Description;
import lms.entity.Admin;
import lms.service.MangerService;
import lms.service.impl.ManagerServiceImpl;

import java.text.ParseException;
import java.util.Scanner;

/**
 * @description: 管理员
 * @author: Grape_Pip
 */
public class ManageView {
    public Scanner scan = new Scanner(System.in);
    private MangerService mangerService = new ManagerServiceImpl();

    /**
     * @return void
     * @Description //TODO  管理员选择操作
     **/
    public void mLogin() throws ParseException {
        mLoginShow();
        System.out.println("请输入您要选择的操作:");
        int option;
        while (!scan.hasNextInt()) {
            String stu = scan.next();
            System.out.println("请输入对应的操作数字哦!");
            System.out.println("请重新输入吖:");
        }
        option = scan.nextInt();
        switch (option) {
            case 1:
//                登录操作:管理员账号,密码
                System.out.println("请输入您的账户:");
                String mName = scan.next();
                System.out.println("请输入您的密码:");
                String mPwd = scan.next();
                Admin adminUser = new Admin(mName, mPwd);
                boolean flagLogin = mangerService.managerLogin(adminUser);
                if (flagLogin) {
//                    登录成功
                    System.out.println("登录成功!");
//                    成功后的操作:管理员选择操作
                    mOperation();
                } else {
                    System.out.println("用户名或密码错误!");
                }
                mLogin();
                break;
            case 2:
//                注册操作:账户,密码
                System.out.println("请输入注册的账户名:");
                String mrName = scan.next();
                System.out.println("请输入注册的账户密码:");
                String mrPwd = scan.next();
//                调用方法

                boolean flagRegist = mangerService.managerRegister(mrName, mrPwd);
                if (flagRegist) {
//                    注册成功
                    System.out.println("注册成功!即将返回上一层进行登录~");
                    mLogin();
                }else{
                    System.out.println("注册失败!请重新注册哦~");
                    mLogin();
                }
                break;
            case 0:
                //退出系统
                System.exit(0);
                break;
            default:
                System.out.println("敬请期待...");
                mLogin();

        }
    }


    /**
     * @return void
     * @Description //TODO  管理员登录成功后显示界面
     **/
    public void mLoginShow() {
        System.out.println("========== 图书馆管理系统 v2.0 ======");
        System.out.println("|------------ 1、登录 ------------|");
        System.out.println("|------------ 2、注册 ------------|");
        System.out.println("|------------ 0、退出 ------------|");
    }

    /**
     * @return void
     * @Description //TODO  管理员登录成功后的操作界面
     **/
    public void mOperationShow() {
        System.out.println("^========图书馆管理系统 v2.0========^");
        System.out.println("<========  欢迎您,管理员! ========>");

        System.out.println("|---------- 1、图书管理 -----------|");
        System.out.println("|---------- 2、读者管理 -----------|");
        System.out.println("|---------- 3、借阅管理 -----------|");
        System.out.println("|---------- 0、退出登录 -----------|");
    }

    /**
     * @return void
     * @Description //TODO  管理员控制台选择相应功能进行管理
     * @Param []
     **/
    public void mOperation() throws ParseException {
        mOperationShow();
        System.out.println("请输入您要选择的操作:");
        int option;
        while (!scan.hasNextInt()) {
            String stu = scan.next();
            System.out.println("请输入对应的操作数字哦!");
            System.out.println("请重新输入吖:");
        }
        option = scan.nextInt();
        switch (option) {
            case 1:
//                跳转至图书管理界面
                new ManageBookView();
                break;
            case 2:
//                跳转至读者管理界面
                new ManageReaderView();
                break;
            case 3:
//                跳转至借阅界面管理
                new ManageBorrowView();
                break;
            case 0:
                mLogin();
                break;
            default:
                System.out.println("其它功能敬请期待...");
                mOperation();
        }
    }

}

2、业务逻辑层(Business Logic Layer)

以管理员注册登录功能作为例子。
----Service 接口

package lms.service;

import lms.entity.Admin;

/**
 * @description: 管理员
 * @author: Grape_Pip
 */
public interface MangerService {
    /**
     * @return boolean
     * @Description //TODO  管理员登录
     * @Param [mName, mPassword]
     **/
    boolean managerLogin(Admin adminUser);

    /**
     * @return boolean
     * @Description //TODO  管理员注册
     * @Param [mrName, mrPassword]
     **/
    boolean managerRegister(String mrName, String mrPassword);

}

----Service 实现类

package lms.service.impl;

import lms.dao.ManagerDao;
import lms.dao.impl.ManagerDaoImpl;
import lms.entity.Admin;
import lms.service.MangerService;

/**
 * @description: 管理员注册登录实现类
 * @author: Grape_Pip
 */
public class ManagerServiceImpl implements MangerService {

    private ManagerDao managerDao = new ManagerDaoImpl();

    @Override
    public boolean managerLogin(Admin adminUser) {
        if (adminUser == null) {
            return false;
        }
        Admin login = managerDao.mLogin(adminUser);
        if (login != null) {
            return true;
        } else {
            return false;
        }
    }

    @Override
    public boolean managerRegister(String mrName, String mrPassword) {
        if (mrName == null || mrPassword == null) {
            return false;
        }
        int res = managerDao.mRegister(mrName, mrPassword);
        if (res == 1) {
            return true;
        } else {
            return false;
        }
    }
}

3、数据访问层(Data access layer)

以管理员登陆注册功能作为例子。
——Dao层接口

package lms.dao;

import lms.entity.Admin;

/**
 * @description: 管理员登陆注册功能Dao接口
 * @author: Grape_Pip
 */
public interface ManagerDao {
    /**
     * @return lms.entity.Admin
     * @MethodName :
     * @Description //TODO  管理员登录
     * @Param [adminName, adminPwd]
     **/
    Admin mLogin(Admin admininfo);

    /**
     * @return int
     * @Description //TODO  管理员注册
     * @Param [adminRName, adminRPwd]
     **/
    int mRegister(String adminRName, String adminRPwd);
}

——Dao层实现类

package lms.dao.impl;

import lms.dao.ManagerDao;
import lms.entity.Admin;
import lms.utils.DBUtils;
import org.springframework.dao.EmptyResultDataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

/**
 * @description: Dao层实现类
 * @author: Grape_Pip
 */
public class ManagerDaoImpl implements ManagerDao {
    /**
     * 获取JDBCTemplate对象
     **/
    private JdbcTemplate template = new JdbcTemplate(DBUtils.getDataSource());
    /**
     * 数据库连接对象
     */
    Connection conn = null;
    /**
     * 数据库操作对象
     */
    PreparedStatement pstmt = null;
    /**
     * 结果集
     */
    ResultSet rs = null;

    @Override
    public Admin mLogin(Admin adminInfo) {
        try {

            String sql = "select * from l_admin where mname = ? and mpwd = ?";
            return template.queryForObject(sql, new BeanPropertyRowMapper<Admin>(Admin.class), adminInfo.getManagerName(), adminInfo.getManagerpPwd());
        } catch (EmptyResultDataAccessException e) {
            return null;
        }
    }

    @Override
    public int mRegister(String adminRName, String adminRPwd) {
        try {

            String sql = "insert into l_admin (`mname`,`mpwd`) " +
                    "VALUES (?,?)";
            int res = template.update(sql, adminRName,adminRPwd);
            return res;
        } catch (Exception e) {
            e.printStackTrace();
            return 0;
        }
    }
}

实现效果:
图书馆管理系统_三层架构_MySQL_第12张图片
图书馆管理系统_三层架构_MySQL_第13张图片


四、工具类

1.数据库工具类 DBUtils.java

数据库主要是抽象出来常用的方法,并使用Spring Template对象加载数据源。
代码如下(示例):

package lms.utils;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
 * Druid连接池的工具类
 */
public class DBUtils {

    //1.定义成员变量 DataSource
    private static DataSource ds;

    static {
        try {
            //1.加载配置文件
            Properties pro = new Properties();
//            一般资源文件需要在src目录的下一级,此项目与com包同级。
            pro.load(DBUtils.class.getClassLoader().getResourceAsStream("druid.properties"));
            //2.获取DataSource
            ds = DruidDataSourceFactory.createDataSource(pro);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取连接
     */
    public static Connection getConnection() throws SQLException {
        return ds.getConnection();
    }

    /**
     * 释放资源
     */
    public static void close(Statement stmt, Connection conn) {
        close(null, stmt, conn);
    }


    public static void close(ResultSet rs, Statement stmt, Connection conn) {

        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        if (conn != null) {
            try {
                conn.close();//归还连接
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
    /**
     * 获取连接池方法
     */
    public static DataSource getDataSource() {
        return ds;
    }

}

2. sql执行返回对象字段(自设置)_工具类

以读者对象(ReaderRowMapper.java)为例:

package lms.utils;

import lms.entity.Reader;
import lms.entity.ReaderType;
import org.springframework.jdbc.core.RowMapper;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Date;

public class ReaderRowMapper implements RowMapper<Reader> {

    @Override
    public Reader mapRow(ResultSet resultSet, int i) throws SQLException {
//        读者基本信息
        int rid = resultSet.getInt("rid");
        String rName = resultSet.getString("rname");
        String rGender = resultSet.getString("rgender");
        String rTel = resultSet.getString("rtel");
        String rMajor = resultSet.getString("rmajor");
        String  rType= resultSet.getString("rtype");
        Date  rRegisTime= resultSet.getDate("rregistime");

//        读者类型信息
        String rTypeName=resultSet.getString("rtype");
        int limit=resultSet.getInt("rtlimit");

        Reader reader = new Reader();
        ReaderType readerType=new ReaderType();

        readerType.setrType(rTypeName);
        readerType.setLimit(limit);

        reader.setReaderId(rid);
        reader.setReaderName(rName);
        reader.setReaderGender(rGender);
        reader.setReaderTel(rTel);
        reader.setReaderMajor(rMajor);
        //读者类型放入
        reader.setReaderType(readerType);
        reader.setReaderRegisDate(rRegisTime);

        return reader;
    }
}


五、总结

本次项目通过简单的控制台输入,后端从之前的2层基础架构转化为了UBD三层架构,使我能够深刻的体会到三层架构的优势。其实,这次的系统功能不算复杂,还不足以完全体会到其巨大的优势,但是仍是给予了我一些启发。也为我之后的开发以及优化敲开了一个多思考、多实践、多学习的新门。

你可能感兴趣的:(总结,Java进阶,java,mysql)