大家好,欢迎来到IT知识分享网。
一、项目分析
1、项目功能分析
项目功能模块主要分为三个模块,登录模块、管理员模块、操作员模块。
登录模块包括登录功能,注册功能,登录日志功能,修改密码以及找回密码。
管理员模块包括工作日志功能、图书借阅金额设定、操作员管理功能、图书借阅逾期账单。
操作员模块包括基础信息维护功能,对图书类别、读者类型、罚金进行增删改查的操作,图书信息管理功能是对图书信息的增删改查,读者信息管理功能对读者信息的增删改查,图书借阅管理功能包括图书的借阅,图书的归还以及图书借阅记录的查询。以上就是整个项目的主体功能结构,理清楚需求与结构后,便着手了项目的说明文档。
2、说明文档
说明文档主要从概要设计说明、软件需求说明、接口设计说明、数据库设计说明四个方便对项目的结构,需求,具体的接口,数据库进行全面的规划设计,保证了代码编写的依据性以及合理性。
概要设计说明对项目编写的背景、需求分析、程序运行的流程、功能结构、接口设计、数据库设计以及程序运行出错后的处理方案进行了总体的描述与规划。
软件需求说明是对整个程序进行了具体的需求分析,包括了项目整体的结构图,流程图,ER设计图,为项目的进行和程序的编写提供了方向。
接口设计说明是程序对数据库访问的具体方法的接口设计,接口设计清楚了就能更快速的进行对数据的处理与使用。
数据库设计说明主要是对数据库进行具体的数据表设计,根据软件的具体需求来设计相应的数据表,存放软件产生的数据。
二、项目实现
项目编写严格按照了三层架构的标准来设计同时具体体现了简单工厂的设计模式。从Dao类的设计到实体层再到业务逻辑成最后到页面设计,整体的结构清晰明了。然后展示一些代码吧,满满的成就感!
图书借阅Dao:
public interface BookBorrowAndReturnDao {
//查询所有借阅记录
List<BookBorrowAndReturn> selectAllBorrow(Connection conn);
//添加一条借阅记录
void addborrow(Connection conn, BookBorrowAndReturn bbr);
//修改借阅记录
int updateBorrow(Connection conn, int readerId, int ISBN, Date returnDate, BookBorrowAndReturn bbr);
//根据readerId查询需要归还的图书记录
List<BookBorrowAndReturn> selectBorrowByReaderId(Connection conn, int readerId);
//根据isbn和readerId以及状态查询需要归还的图书记录
BookBorrowAndReturn selectBorrowByIsbn(Connection conn, int readerId, int isbn, String state);
//根据状态和图书编号查询
List<BookBorrowAndReturn> selectBorrowByIsbn(Connection connection, int isbn, String state);
//根据读者ID和状态查询
List<BookBorrowAndReturn> selectBorrowByState(Connection connection, int readerId, String state);
}
图书借阅的Impl:
public class BookBorrowAndReturnImpl extends BaseDao<BookBorrowAndReturn> implements BookBorrowAndReturnDao {
//查询所有借阅信息
@Override
public List<BookBorrowAndReturn> selectAllBorrow(Connection conn) {
String sql = "select readerId,readerName,bookISBN as ISBN,bookName, borrowDate,returnDate,fine,state from bookborrowandreturn";
List<BookBorrowAndReturn> beanList = getBeanList(conn, sql);
return beanList;
}
//借书记录
@Override
public void addborrow(Connection conn, BookBorrowAndReturn bbr) {
String sql = "insert into bookborrowandreturn(readerId,readerName,bookISBN,bookName,borrowDate,state) values(?,?,?,?,?,?)";
update(conn, sql, bbr.getReaderId(),bbr.getReaderName(), bbr.getISBN(),bbr.getBookName(), bbr.getBorrowDate(), bbr.getState());
}
@Override
public int updateBorrow(Connection conn, int readerId, int ISBN, Date returnDate, BookBorrowAndReturn bbr) {
String sql = "update bookborrowandreturn set readerId = ?,readerName = ?,bookISBN = ?, bookName = ?,borrowDate = ? ,returnDate = ?, fine = ? ,state = ? where readerId = ? and bookISBN = ? and returnDate is ?";
int update = update(conn, sql, bbr.getReaderId(), bbr.getReaderName(),bbr.getISBN(),bbr.getBookName(), bbr.getBorrowDate(), bbr.getReturnDate(), bbr.getFine(), bbr.getState(), readerId, ISBN,returnDate);
return update;
}
@Override
public List<BookBorrowAndReturn> selectBorrowByReaderId(Connection conn, int readerId) {
String sql = "select readerId,readerName,bookISBN as ISBN,bookName, borrowDate,returnDate,fine,state from bookborrowandreturn where readerId = ?";
List<BookBorrowAndReturn> beanList = getBeanList(conn, sql, readerId);
return beanList;
}
@Override
public BookBorrowAndReturn selectBorrowByIsbn(Connection conn,int readerId, int isbn,String state) {
String sql = "select readerId,readerName,bookISBN as ISBN,bookName, borrowDate,returnDate,fine,state from bookborrowandreturn where bookISbn = ? and state = ? and readerId = ?";
BookBorrowAndReturn beanList = getBean(conn, sql, isbn,state,readerId);
return beanList;
}
@Override
public List<BookBorrowAndReturn> selectBorrowByIsbn(Connection connection, int isbn, String state) {
String sql = "select readerId,readerName,bookISBN as ISBN,bookName, borrowDate,returnDate,fine,state from bookborrowandreturn where bookISbn = ? and state = ?";
List<BookBorrowAndReturn> beanList = getBeanList(connection, sql, isbn,state);
return beanList;
}
@Override
public List<BookBorrowAndReturn> selectBorrowByState(Connection connection, int readerId, String state) {
String sql = "select readerId,readerName,bookISBN as ISBN,bookName, borrowDate,returnDate,fine,state from bookborrowandreturn where readerId = ? and state = ?";
List<BookBorrowAndReturn> beanList = getBeanList(connection, sql, readerId,state);
return beanList;
}
}
图书归还功能的部分代码展示:
页面设计展示:
程序运行图:
三、项目心得
利用数据库来实现实现数据的存储比使用文件来储存数据要方便多了也要更快捷了,同时效率也更高了。但是在用的时候出现了一些问题还有在业务逻辑层循环语句的使用上还是避免不了出现错误,多层循环的嵌套容易理不清楚,所以就出现的一些bug进行总结。
1、JDBC使用时sql语句与数据库对应错误。
主要是由于实体层设计时属性名没有与数据表的列名保持一致,从而在sql语句编写出现错误,导致异常,要使用别名来进行联系。
如下图的bookISBN与实体类属性ISBN的不一致:
public List<BookBorrowAndReturn> selectAllBorrow(Connection conn) {
String sql = "select readerId,readerName,bookISBN as ISBN,bookName, borrowDate,returnDate,fine,state from bookborrowandreturn";
List<BookBorrowAndReturn> beanList = getBeanList(conn, sql);
return beanList;
}
2、多层循环嵌套
在编写图书借阅与归还功能时需要添加许多的限制条件,就难免需要多层循环的嵌套,并且还需要对数据库查询出来的数据存储的集合进行遍历,许多的while循环,for循环,if语句嵌套在一起,当时就出现了循环的多余,以及引用的错误!在进行循环嵌套时首先就要搞清楚每一层循环的作用,并添加注释,那么在出现错误后也能一目了然。
如:
public void returnBook() {
System.out.println("**********************");
System.out.println("********图书归还********");
System.out.println("**********************");
//打印读者信息表
System.out.println("读者信息表");
new SetReader().selectAllReader();
//获取连接
Connection conn = null;
try {
conn = JDBCutils.getConnectionDruid();
boolean flag = true;
while (flag) {
System.out.println("请选择你要进行还书的读者的序号");
int Id = TSUtility.readInt();
List<Reader> readers = new ReaderDAOImp().selectAllReaders(conn);
if (Id > readers.size() || Id <= 0) {
System.out.println("选择错误,请重新选择!");
} else {
flag = false;
int readerId = readers.get(Id - 1).getReaderId();
//查询选择的序号对应的读者的所有未还记录
String state = "未还";
BookBorrowAndReturnOperation b = new BookBorrowAndReturnOperation();
List<BookBorrowAndReturn> books = b.selectBorrowByState(readerId, state);
Date borrowBookDate = null;
if (books.size() == 0) {
System.out.println("读者" + readers.get(Id - 1).getName() + "暂无未归还记录");
} else {
System.out.println("====图书未还记录====");
System.out.println("序号\t读者ID\t读者姓名\t图书ISBN\t图书名称\t借书日期\t还书日期\t罚金\t状态");
for (int i = 0; i < books.size(); i++) {
System.out.println((i + 1) + "\t" + books.get(i).getReaderId() + "\t" + books.get(i).getReaderName() + "\t" + books.get(i).getISBN()
+ "\t" + books.get(i).getBookName() + "\t" + books.get(i).getBorrowDate() + "\t" + books.get(i).getReturnDate() +
"\t" + books.get(i).getFine() + "\t" + books.get(i).getState());
borrowBookDate = books.get(i).getBorrowDate();
}
TSUtility.readReturn();
//选择需要归还的图书(一次只能还一本)
boolean returnFlag = true;
while (returnFlag) {
System.out.println("请选择你要还的图书的序号");
int bId = TSUtility.readInt();
if (bId > books.size() || bId <= 0) {
System.out.println("选择错误,请重新选择!");
} else {
returnFlag = false;
int bookId = 0;
for (int j = 0; j < books.size(); j++) {
bookId = books.get(bId - 1).getISBN();
}
//设置归还时间
Scanner sc = new Scanner(System.in);
Date returnDate = null;
boolean flagD = true;
int days = 0;
while (flagD) {
System.out.println("请输入归还日期(格式:yyyy-MM-dd):");
String date = sc.next();
boolean date1 = isDate(date);
returnDate = getDateStr(date);
if (!date1) {
System.out.println("日期格式输入错误,请重新输入");
TSUtility.readReturn();
} else {
//获取借书时间
java.sql.Date borrowDate1 = books.get(bId - 1).getBorrowDate();
//得到相隔天数
int day = daysBetween(borrowDate1, returnDate);//相隔天数
//与可借天数对比计算逾期时间
double money = 0;
Reader reader = new ReaderDAOImp().selectReaderById(conn, readerId);
if (day >= 0) {
days = day - reader.getLimit();
flagD = false;
//获取罚金标准根据逾期时间计算罚金
String typeName = reader.getTypeName();
List<Fine> fines = new FineDaoImpl().selectAllFine(conn);
for (Fine fine : fines) {
if (typeName.equals(fine.getReaderTypeName())) {
//罚金金额
if (days <= 0) {
System.out.println("您未逾期,感谢您保持良好的信用习惯。");
money = 0;
} else {
money = days * fine.getFine();
System.out.println("你已逾期" + days + "天" + ",需缴纳" + money + "元罚金!");
}
}
}
String stated = "已还";
Date returnDatejiaoyan = null;
BookBorrowAndReturn bbr = books.get(bId - 1);
bbr.setReturnDate(new java.sql.Date(returnDate.getTime()));
bbr.setFine(money);
bbr.setState(stated);
bbr.setReaderId(readerId);
new BookBorrowAndReturnOperation().updateBorrow2(readerId, bookId, (java.sql.Date) returnDatejiaoyan, bbr);
System.out.println("归还成功!");
//归还成功后需返还读者可借数量
Reader reader1 = new ReaderDAOImp().selectReaderById(conn, readerId);
int Num = (reader.getMaxBorrowNum() + 1);
reader1.setMaxBorrowNum(Num);
new ReaderDAOImp().updateReaderById(conn, readerId, reader1);
//返还图书库存数
Book book = new BookDaoImpl().selectByISBN(conn, bookId);
int printTime = (book.getPrintTime() + 1);
book.setPrintTime(printTime);
new BookDaoImpl().updateBook(conn, book, bookId);
} else if (day < 0) {
System.out.println("还书日期不能小于借书日期,请重新输入");
TSUtility.readReturn();
}
}
}
}
}
}
}
}
} catch (SQLException throwables) {
throwables.printStackTrace();
} finally {
JDBCutils.closeResoureSelect(conn, null, null);
}
}
最后得到最深的感触是,做项目时一定先把说明文档清清楚楚的做好了,在进行程序的编写,只要有方向的去做,时间会节约,效率会提高,bug一直会存在,但这是最宝贵的经验。未来的日子加油!不负韶华!
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/9894.html