先前的图书馆管理系统主要通过控制台输入,存储数据通过文件进行存储。
而本次的重构图书馆管理系统虽然界面还是通过控制台输入输出,但是由于本系统重构的目的在于Java后端使用三层架构UBD、数据库使用MySQL进行数据的存储与访问。因此,前端采用最简单的显示方式以至于更清楚明了后端的代码功能与逻辑。
如果有感兴趣的可自行查看源代码!
☞本系统源代码地址
如下图:本项目主要由【三层架构UBD】和 【实体层】 和 【工具层 】组成!
除此之外,依赖于libs中的jar包。
【注】libs中的本地包如何导入项目中:
点击OK即可。
以用户界面 管理员为例:
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();
}
}
}
以管理员注册登录功能作为例子。
----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;
}
}
}
以管理员登陆注册功能作为例子。
——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;
}
}
}
数据库主要是抽象出来常用的方法,并使用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;
}
}
以读者对象(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三层架构,使我能够深刻的体会到三层架构的优势。其实,这次的系统功能不算复杂,还不足以完全体会到其巨大的优势,但是仍是给予了我一些启发。也为我之后的开发以及优化敲开了一个多思考、多实践、多学习的新门。