图书馆管理系统_三层架构_MySQL
Posted 葡萄籽-June
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图书馆管理系统_三层架构_MySQL相关的知识,希望对你有一定的参考价值。
图书馆管理系统(重构)项目_三层架构_mysql
先前的图书馆管理系统主要通过控制台输入,存储数据通过文件进行存储。
而本次的重构图书馆管理系统虽然界面还是通过控制台输入输出,但是由于本系统重构的目的在于Java后端使用三层架构UBD、数据库使用MySQL进行数据的存储与访问。因此,前端采用最简单的显示方式以至于更清楚明了后端的代码功能与逻辑。
文章目录
前言
如果有感兴趣的可自行查看源代码!
☞本系统源代码地址
一、项目基础架构简介
如下图:本项目主要由【三层架构UBD】和 【实体层】 和 【工具层 】组成!
详细工程展示:
除此之外,依赖于libs中的jar包。
【注】libs中的本地包如何导入项目中:
点击OK即可。
二、数据库表
1.管理员表
2.图书信息表
3.读者信息表
4.读者类型表
5.借阅记录表
三、三层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;
}
}
}
实现效果:
四、工具类
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三层架构_(标题说要五个字以上,看不起我四个字?)
Spring_33_3 | 回顾:事务支持转账_三层架构/XML