JAVA简单的图书管理系统
2018-01-03 20:49
816 查看
1.类
图书类的设计主要是图书的一些基本属性:1.1 图书类
import java.util.Date;
/**
* 图书
* @author 李海明
*
*/
public class Book {
private int id; //图书编号
private String isbn; //isbn编号
private String name; //书名
private double price; //价格
private String author; //作者
private String publisher; //出版社
private Date pubDate; // 出版日期
private boolean lended; //借阅状态(是否借出)
private int counter; // 被借阅总次数
private String type; // 图书类型
/**
* 下面属性的get和set方法
*/
public String getType() {
return type;
}
public void setType(String type) { this.type = type; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getIsbn() { return isbn; } public void setIsbn(String isbn) { this.isbn = isbn; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getPrice() { return price; } public void setPrice(double price) { this.price = price; } public String getAuthor() { return author; } public void setAuthor(String author) { this.author = author; } public String getPublisher() { return publisher; } public void setPublisher(String publisher) { this.publisher = publisher; } public Date getPubDate() { return pubDate; } public void setPubDate(Date pubDate) { this.pubDate = pubDate; } public boolean isLended() { return lended; } public void setLended(boolean lended) { this.lended = lended; } public int getCounter() { return counter; } public void setCounter(int counter) { this.counter = counter; }
}
1.2 读者类
import java.util.Date;
/**
* 读者
* @author 李海明
*
*/
public class Reader {
private int id; //编号
private String name;//名字
private boolean gender;//性别
private String tel;//电话
private Date registerDate;//注册时间
private boolean available;//是否注销
private boolean isVip=false;//是否vip
private int maxLendeddate;//最大借书天数
private int lendednum;//当前借书未还数量
/**
* 读者的get和set方法
*/
public int getLendednum() {
return lendednum;
}
public void setLendednum(int lendednum) { this.lendednum = lendednum; } public boolean isVip() { return isVip; } public void setVip(boolean isVip) { this.isVip = isVip; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public boolean isGender() { return gender; } public void setGender(boolean gender) { this.gender = gender; } public String getTel() { return tel; } public void setTel(String tel) { this.tel = tel; } public Date getRegisterDate() { return registerDate; } public void setRegisterDate(Date registerDate) { this.registerDate = registerDate; } public boolean isAvailable() { return available; } public void setAvailable(boolean available) { this.available = available; }
}
2.工具类
2.1 导入jdbc-jar包与数据库有关的操作放在这个类中,首先需要导入jdbc的jar包,步骤:1.下载jdbc-jar包 2.在Eclipse上右击项目,build path->add external archive->选择jar包就ok了
2.2 JdbcUtil工具类
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
/** <
4000
br>
* JDBC操作工具类
* @author 李海明
*
*/
public class JdbcUtil {
private static Properties props = new Properties();
static { try (InputStream inputStream = JdbcUtil.class.getClassLoader() .getResourceAsStream("jdbc.properties")) { props.load(inputStream); Class.forName(props.getProperty("drv")); } catch (IOException | ClassNotFoundException e) { e.printStackTrace(); } } private JdbcUtil() { throw new AssertionError(); } /** * 获得数据库连接 * @return Connection对象 */ public static Connection getConnection() { try { return DriverManager.getConnection( props.getProperty("url"), props.getProperty("uid"), props.getProperty("pwd")); } catch (SQLException e) { throw new RuntimeException(e); } } /** * 关闭数据库连接 * @param connection 连接对象 */ public static void closeConnection(Connection connection) { try { if (connection != null && !connection.isClosed()) { connection.close(); } } catch (SQLException e) { throw new RuntimeException(e); } } /** * 开启事务 * @param connection 连接对象 */ public static void beginTx(Connection connection) { try { connection.setAutoCommit(false); } catch (SQLException e) { throw new RuntimeException(e); } } /** * 提交事务 * @param connection 连接对象 */ public static void commitTx(Connection connection) { try { connection.commit(); } catch (SQLException e) { throw new RuntimeException(e); } } /** * 回滚事务 */ public static void rollbackTx(Connection connection) { try { connection.rollback(); } catch (SQLException e) { throw new RuntimeException(e); } } /** * 执行增删改操作 * @param con 连接对象 * @param sql SQL语句 * @param params 替换占位符的参数 * @return 受影响的行数 * @throws SQLException */ public static int executeUpdate(Connection con, String sql, Object... params) throws SQLException { try (PreparedStatement stmt = con.prepareStatement(sql)) { for (int i = 0; i < params.length; ++i) { stmt.setObject(i + 1, params[i]); } return stmt.executeUpdate(); } } public static ResultSet executeSelect(Connection con, String sql, Object... params) throws SQLException { try (PreparedStatement stmt = con.prepareStatement(sql)) { for (int i = 0; i < params.length; ++i) { stmt.setObject(i + 1, params[i]); } return stmt.executeQuery(); } }
}
3. 管理类
将一些操作书本的方法封装在**bookManager**类中,有利于管理和修改。
3.1 bookmanager类
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Collections;
import java.util.List;
import javax.swing.text.StyledEditorKit.ForegroundAction;
import com.mysql.jdbc.Statement;
/**
* 图书管理器
*
* @author 李海明
*
*/
public class BookManager {
/** * 添加新图书 * @param book 图书 * @return 添加成功返回true 否则返回false */ public boolean addNewBook(Book book) { try (Connection connection = JdbcUtil.getConnection()) { return JdbcUtil.executeUpdate(connection, "insert into tb_book (bookid, isbn, bname, price, author, publisher, pubdate) values (?,?,?,?,?,?,?)", book.getId(), book.getIsbn(), book.getName(), book.getPrice(), book.getAuthor(), book.getPublisher(), book.getPubDate()) == 1; } catch (SQLException e) { e.printStackTrace(); } return false; } /** * 根据编号移除图书(不可借阅) * @param id * @return 移除成功返回true 否则返回false */ public boolean removeBookById(int id) { try (Connection connection = JdbcUtil.getConnection()) { return JdbcUtil.executeUpdate(connection, "update tb_book set lended=1 where bookid=? and lended=0", id) == 1; } catch (SQLException e) { e.printStackTrace(); } return false; } /** * 借出图书 * @param bookId 图书编号 * @param readerId 读者编号 * @return 借出成功返回true 否则返回false */ @SuppressWarnings("resource") public boolean lendOut(int bookId, int readerId) { Connection connection = JdbcUtil.getConnection(); try { PreparedStatement stmt = connection.prepareStatement( "select available from tb_reader where lendednum<maxlendednum and readerid=?"); stmt.setInt(1, readerId); ResultSet rs = stmt.executeQuery(); // 事务(transaction) - 不可分割的一组原子性操作 // 事务的ACID特性 // - Atomicity(原子性) - 不可分割要么全做要么全不做 // - Consistency(一致性) - 事务前后数据状态保持一致 // - Isolation(隔离性) - 事务不能看到彼此的中间状态 // - Duration(持久性) - 事务完成后数据要持久化 if (rs.next() && rs.getBoolean(1)){ JdbcUtil.beginTx(connection); if (JdbcUtil.executeUpdate(connection, "update tb_book set lended=1, counter=counter+1 where lended=0 and bookid=? ", bookId) == 1) { int affectedRows = JdbcUtil.executeUpdate(connection, "insert into tb_record (bid, rid, lenddate) values (?,?,?)", bookId, readerId, new Date(System.currentTimeMillis())); JdbcUtil.executeUpdate(connection, "update tb_reader set lendednum=lendednum+1 where readerid=?",readerId); // 如果没有发生异常就提交事务 JdbcUtil.commitTx(connection); return affectedRows == 1; } }else{ System.out.println("超出可借最大数量!如要继续借书,请注册会员!"); } } catch (SQLException e) { e.printStackTrace(); // 如果发生了异常就让事务回滚 JdbcUtil.rollbackTx(connection); } finally { JdbcUtil.closeConnection(connection); } return false; } /** * 归还图书 * @param bookId 图书编号 * @param readerId 读者编号 * @return 如果超期则返回罚款金额 否则返回0 操作失败返回-1 */ @SuppressWarnings("resource") public double returnBack(int bookId, int readerId) { double pulishment = 0; Connection connection = JdbcUtil.getConnection(); try { JdbcUtil.beginTx(connection); if (JdbcUtil.executeUpdate(connection, "update tb_book set lended=0 where lended=1 and bookid=?", bookId) == 1) { PreparedStatement stmt = connection.prepareStatement( "select recordid, lenddate from tb_record where lenddate=(" + "select max(lenddate) from tb_record where bid=? and rid=?) " + "and bid=? and rid=? "); stmt.setInt(1, bookId); stmt.setInt(2, readerId); stmt.setInt(3, bookId); stmt.setInt(4, readerId); ResultSet rs = stmt.executeQuery(); PreparedStatement statement=connection.prepareStatement("select" + " maxlendeddate from tb_reader where readerid=?");//获取读者最大天数和当前借书数量 statement .setInt(1, readerId); ResultSet rSet=statement .executeQuery(); int maxlendeddate = 0; if(rSet.next()){ maxlendeddate=rSet.getInt("maxlendeddate"); } if (rs.next()) { int recordId = rs.getInt("recordid"); Date lendDate = rs.getDate("lenddate"); Date backDate = new Date(); double days = Math.ceil((backDate.getTime() - lendDate.getTime()) / 86400000.0); pulishment = days > maxlendeddate ? Math.round((days -maxlendeddate) * 0.2 * 100) / 100.0 : 0; JdbcUtil.executeUpdate(connection, "update tb_record set backdate=?, pulishment=? where recordid=?", backDate, pulishment, recordId); JdbcUtil.executeUpdate(connection, "update tb_reader set lendednum=lendednum-1");//还书成功后,当前借书书减1 } } JdbcUtil.commitTx(connection); return pulishment; } catch (SQLException e) { e.printStackTrace(); JdbcUtil.rollbackTx(connection); } finally { JdbcUtil.closeConnection(connection); } return -1; } /** * 根据图书编号查找图书 * @param id 图书编号 * @return 图书对象或null */ @SuppressWarnings("resource") public Book searchBookById(int id) { try (Connection connection = JdbcUtil.getConnection()) { PreparedStatement stmt = connection.prepareStatement( "select bookid, isbn, bname, price, author, publisher, pubdate, lended, counter from tb_book where bookid=?"); stmt.setInt(1, id); ResultSet rs = stmt.executeQuery(); if (rs.next()) { return handleResultSet(rs); } } catch (SQLException e) { e.printStackTrace(); } return null; } /** * 根据ISBN号查找图书 * @param isbn * @return 保存查询结果的列表容器 */ public List<Book> searchBookByIsbn(String isbn) { List<Book> bookList = new ArrayList<>(); try (Connection connection = JdbcUtil.getConnection()) { @SuppressWarnings("resource") PreparedStatement stmt = connection.prepareStatement( "select bookid, isbn, bname, price, author, publisher, pubdate, lended, counter from tb_book where isbn=?"); stmt.setString(1, isbn); @SuppressWarnings("resource") ResultSet rs = stmt.executeQuery(); while (rs.next()) { Book book = handleResultSet(rs); bookList.add(book); } } catch (SQLException e) { e.printStackTrace(); } return bookList.size() > 0 ? bookList : Collections.emptyList(); } /** * 根据分类查找图书 */ public List <Book> ground(String type,Object...params){ List<Book> sametype=new ArrayList<Book>(); try(Connection connection =JdbcUtil.getConnection()){ /*PreparedStatement statement=connection.prepareStatement( "select bookid, isbn," + " bname, price, author, publisher, pubdate, lended," + " counter from tb_book where type=?)"); statement.setString(1,type); ResultSet rSet=statement.executeQuery();*/ ResultSet rSet=JdbcUtil.executeSelect(connection,"select bookid, isbn," + " bname, price, author, publisher, pubdate, lended," + " counter from tb_book where type=? ",type); while(rSet.next()){ Book book=handleResultSet(rSet); sametype.add(book); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return sametype.size() > 0 ? sametype : Collections.emptyList(); } /** * * 根据书名查找图书 * @param name 书名(支持模糊查找) * @return 保存查询结果的列表容器 */ public List<Book> searchBookByName(String name) { List<Book> bookList = new ArrayList<>(); try (Connection connection = JdbcUtil.getConnection()) { @SuppressWarnings("resource") PreparedStatement stmt = connection.prepareStatement( "select bookid, isbn, bname, price, author, publisher, pubdate, lended, counter from tb_book where bname like ?"); stmt.setString(1, "%" + name + "%"); @SuppressWarnings("resource") ResultSet rs = stmt.executeQuery(); while (rs.next()) { Book book = handleResultSet(rs); bookList.add(book); } } catch (SQLException e) { e.printStackTrace(); } return bookList.size() > 0 ? bookList : Collections.emptyList(); } /** * 根据作者查找图书 * @param author 作者 * @return 保存查询结果的列表容器 */ public List<Book> searchBookByAuthor(String author) { List<Book> bookList = new ArrayList<>(); try (Connection connection = JdbcUtil.getConnection()) { @SuppressWarnings("resource") PreparedStatement stmt = connection.prepareStatement( "select bookid, isbn, bname, price, author, publisher, pubdate, lended, counter from tb_book where author like ?"); stmt.setString(1, "%" + author + "%"); @SuppressWarnings("resource") ResultSet rs = stmt.executeQuery(); while (rs.next()) { Book book = handleResultSet(rs); bookList.add(book); } } catch (SQLException e) { e.printStackTrace(); } return bookList.size() > 0 ? bookList : Collections.emptyList(); } /** * 查询借阅排行榜前10名 * @return 保存查询结果的列表容器 */ public List<Book> searchTop10Books() { List<Book> bookList = new ArrayList<>(); try (Connection connection = JdbcUtil.getConnection()) { @SuppressWarnings("resource") PreparedStatement stmt = connection.prepareStatement( "select bookid, isbn, bname, price, author, publisher," + " pubdate, lended, sum(counter) as counter" + " from tb_book group by isbn order by counter desc limit 10"); @SuppressWarnings("resource") ResultSet rs = stmt.executeQuery(); while (rs.next()) { Book book = handleResultSet(rs); bookList.add(book); } } catch (SQLException e) { e.printStackTrace(); } return bookList.size() > 0 ? bookList : Collections.emptyList(); } // 处理结果集 private Book handleResultSet(ResultSet rs) throws SQLException { Book book = new Book(); book.setId(rs.getInt("bookid")); book.setIsbn(rs.getString("isbn")); book.setName(rs.getString("bname")); book.setPrice(rs.getDouble("price")); book.setAuthor(rs.getString("author")); book.setPublisher(rs.getString("publisher")); book.setPubDate(rs.getDate("pubdate")); book.setLended(rs.getBoolean("lended")); book.setCounter(rs.getInt("counter")); return book; }
}
3.2 readerManager类
package com.qfedu;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Date;
/**
* @author 李海明
* 为了找个漂亮
又会调bug
的女朋友
请努力学习!
*/
public class ReaderManager {
/** * 新增一个读者 * @param reader 读者 * @return 新增成功返回true 否则返回false */ public boolean createNewReader(Reader reader) { try (Connection connection = JdbcUtil.getConnection()) { return JdbcUtil.executeUpdate(connection, "insert into tb_reader (readerid, rname, gender, tel, regdate) values (?,?,?,?,?)", reader.getId(), reader.getName(), reader.isGender(), reader.getTel(), new Date()) == 1; } catch (SQLException e) { e.printStackTrace(); } return false; } /** * 注销一个读者 * @param id 读者编号 * @return 注销成功返回true 否则返回false */ public boolean cancelReaderById(int id) { try (Connection connection = JdbcUtil.getConnection()) { return JdbcUtil.executeUpdate(connection, "update tb_reader set available=0 where readerid=? and lendednum=0", id) == 1; } catch (SQLException e) { e.printStackTrace(); } return false; } /** * 编辑读者电话 * @param reader 读者 * @return 编辑成功返回true 否则返回false */ public boolean editReaderInfo(Reade a1b3 r reader) { try (Connection connection = JdbcUtil.getConnection()) { return JdbcUtil.executeUpdate(connection, "update tb_reader set tel=? where readerid=? ", reader.getTel(), reader.getId()) == 1; } catch (SQLException e) { e.printStackTrace(); } return false; } /** * 注册会员 */ public void upToVip(int readerid){ try(Connection connection =JdbcUtil.getConnection()){ if(JdbcUtil .executeUpdate(connection, "update " + "tb_reader set isVip=1,maxlendeddate=60,maxlendednum=10 where readerid=?",readerid)==1){ System.out.println("注册成功!!!"); }else{ System.out.println("注册失败!"); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("注册失败!"); } }
}
管理系统类(控制台显示)
BookMISpackage com.qfedu;
import java.util.Date;
import java.util.List;
import java.util.Scanner;
public class BookMIS {
private static BookManager bookManager = new BookManager();
private static ReaderManager readerManager= new ReaderManager();
private static Scanner scanner = new Scanner(System.in); public static void main(String[] args) { boolean isRunning = true; System.out.println("===欢迎使用ABC图书管理系统==="); while (isRunning) { int choice; System.out.println("1. 管理读者"); System.out.println("2. 管理图书"); System.out.println("3. 退出系统"); do { System.out.print("请选择: "); choice = scanner.nextInt(); } while (choice < 1 || choice > 3); switch (choice) { case 1: showReaderSubMenu(); break; case 2: showBookSubMenu(); break; case 3: System.out.println("感谢使用本系统, 欢迎下次再来"); isRunning = false; break; } } scanner.close(); } private static void showReaderSubMenu() { System.out.println("======读者管理子系统======"); boolean flag = true; int choice; while (flag) { System.out.println("1. 新增读者"); System.out.println("2. 注销读者"); System.out.println("3. 修改信息"); System.out.println("4. 返回主菜单"); System.out.println("5. 注册会员"); do { System.out.print("请选择: "); choice = scanner.nextInt(); } while (choice < 1 || choice > 5); switch (choice) { case 1: addReader(); break; case 2: cancelReader(); break; case 3: editReader(); break; case 4: flag = false; break; case 5: addvip(); break; } } } private static void addvip(){ System.out.println("请输入要注册会员的读者编号"); int id=scanner.nextInt(); readerManager.upToVip(id); } private static void addReader() { System.out.print("编号: "); int id = scanner.nextInt(); System.out.print("姓名: "); String name = scanner.next(); System.out.print("性别(1. 男, 0. 女): "); int gender = scanner.nextInt(); System.out.print("电话: "); String tel = scanner.next(); Reader reader = new Reader(); reader.setId(id); reader.setName(name); reader.setGender(gender == 1); reader.setTel(tel); if (readerManager.createNewReader(reader)) { System.out.println("添加读者成功!"); } else { System.out.println("操作失败!!!"); } } private static void cancelReader() { System.out.print("编号: "); int id = scanner.nextInt(); if (readerManager.cancelReaderById(id)) { System.out.println("注销成功!"); } else { System.out.println("注销失败!"); } } private static void editReader() { System.out.print("编号: "); int id = scanner.nextInt(); System.out.print("电话: "); String tel = scanner.next(); Reader reader = new Reader(); reader.setId(id); reader.setTel(tel); if (readerManager.editReaderInfo(reader)) { System.out.println("更新读者电话成功!"); } else { System.out.println("更新读者电话失败!"); } } private static void showBookSubMenu() { System.out.println("======图书管理子系统======"); boolean flag = true; int choice; while (flag) { System.out.println("1. 新增图书"); System.out.println("2. 下架图书"); System.out.println("3. 借出图书"); System.out.println("4. 归还图书"); System.out.println("5. 按编号查找图书"); System.out.println("6. 按书名查找图书"); System.out.println("7. Top10排行榜"); System.out.println("8. 返回主菜单"); System.out.println("9. 按类型查找图书"); do { System.out.print("请选择: "); choice = scanner.nextInt(); } while (choice < 1 || choice > 9); switch (choice) { case 1: addBook(); break; case 2: removeBook(); break; case 3: lendBook(); break; case 4: returnBook(); break; case 5: getBookById(); break; case 6: listBooksByIsbn(); break; case 7: listTop10Books(); break; case 8: flag = false; break; case 9: listSameType(); break; } } } private static void addBook() { System.out.print("编号: "); int id = scanner.nextInt(); System.out.print("ISBN: "); String isbn = scanner.next(); System.out.print("书名: "); String name = scanner.next(); System.out.print("价格: "); double price = scanner.nextDouble(); System.out.print("作者: "); String author = scanner.next(); System.out.print("出版社: "); String publisher = scanner.next(); System.out.print("出版日期: "); Date pubDate = CommonUtil.stringToDate(scanner.next()); Book book = new Book(); book.setId(id); book.setIsbn(isbn); book.setName(name); book.setPrice(price); book.setAuthor(author); book.setPublisher(publisher); book.setPubDate(pubDate); if (bookManager.addNewBook(book)) { System.out.println("新增图书成功!"); } else { System.out.println("新增图书失败!"); } } private static void removeBook() { System.out.print("编号: "); int id = scanner.nextInt(); if (bookManager.removeBookById(id)) { System.out.println("下架成功!"); } else { System.out.println("下架失败!"); } } private static void lendBook() { System.out.print("图书编号: "); int bookId = scanner.nextInt(); System.out.print("读者编号: "); int readerId = scanner.nextInt(); if (bookManager.lendOut(bookId, readerId)) { System.out.println("借书成功!!!"); } else { System.out.println("借书失败!!!"); } } private static void returnBook() { System.out.print("图书编号: "); int bookId = scanner.nextInt(); System.out.print("读者编号: "); int readerId = scanner.nextInt(); double pulishment = bookManager.returnBack(bookId, readerId); if (pulishment >= 0) { System.out.println("还书成功!!!"); if (pulishment > 0) { System.out.printf("请缴纳罚款: %.1f元\n", pulishment); } } else { System.out.println("还书失败!!!"); } } private static void getBookById() { System.out.print("编号: "); int id = scanner.nextInt(); Book book = bookManager.searchBookById(id); displayTitle(); displayBook(book); } private static void listBooksByIsbn() { System.out.print("书名: "); String name = scanner.next(); List<Book> list = bookManager.searchBookByName(name); displayBookList(list); } private static void listSameType(){ System.out.println("请输入你要查找的图书类型"); String type =scanner.next(); List<Book> list=bookManager.ground(type); displayBookList(list); } private static void listTop10Books() { List<Book> list = bookManager.searchTop10Books(); displayBookList(list); } private static void displayBookList(List<Book> list) { displayTitle(); for (Book book : list) { displayBook(book); } } private static void displayTitle() { System.out.printf("%-50s%-20s%-10s\n", "书名", "作者", "借阅量"); } private static void displayBook(Book book) { System.out.printf("%-50s%-20s%-10d\n", book.getName(), book.getAuthor(), book.getCounter()); }
}
相关文章推荐
- java中利用IO流实现简单的图书管理系统(利用数组和IO实现)
- java中用xml文件的形式实现简单的图书管理系统
- Java实现简单的图书管理系统
- 从零开始学Java自己利用接口和集合框架做的简单图书管理系统
- 用c++编写简单的图书管理系统怎么弄
- 我是个在校生,现在想用java作为前台代码,连接到SQL server数据库上去,项目是;图书管理系统,现在没有好的java源代码,各位大侠能不能帮个忙?
- 图书管理系统基于JAVA
- 五分钟制作ASP图书管理系统 ASPMaker简单教程
- 简单的c++图书管理系统
- 简单的java学生管理系统
- javaweb开发之---在线图书管理系统
- C# 实现一个简单的图书管理系统(无数据库)新手教程1
- log4j日志管理系统简单使用说明 - open java project(转载)
- 简单学生成绩管理系统(Java实现)
- 图书管理系统(Java)
- 简单的图书管理系统
- 图书管理系统的部分操作(java)
- JAVA 面向对象编程开发--------初学者---------------------彩票系统----图书管理系统
- 图书管理系统(java)
- Java图书管理系统-项目编写