通过Java程序实现图书管理系统。
一、功能如下:使用一维数组
1、实现新增图书功能
2、实现查询图书功能
3、删除图书功能
二、具体实现:
图书类包括:图书名称,价格,借出状态(int类型0表示己借出1表示未借出),借出日期。
4个数组;
管理类包括以下方法:
Initial() 初始化图书信息方法
showMenu() 主菜单方法
add() 新增图书方法
search() 查询图书方法
delete() 删除图书方法
returnMain() 输入0返回主菜单
三、新增功能如图
四、查询图书功能如图
五、删除图书功能如图
注意:删除图书名称没有找到或己借出给出相应的错误提示
三层架构模式:
三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:界面层(User Interface layer)、业务逻辑层(Business Logic Layer)、数据访问层(Data access layer)。区分层次的目的即为了 “高内聚低耦合” 的思想。在软件体系架构设计中,分层式结构是最常见,也是最重要的一种结构。微软推荐的分层式结构一般分为三层,从下至上分别为:数据访问层、业务逻辑层(又或称为领域层)、表示层。
表现层(JSP):
表现层也称为界面层,位于最外层(最上层),离用户最近。用于显示数据和接收用户输入的数据,为用户提供一种交互式操作的界面。
业务层(逻辑层、service层):
业务层(Business Logic Layer)无疑是系统架构中体现核心价值的部分。它的关注点主要集中在业务规则的制定、业务流程的实现等与业务需求有关的系统设计,也即是说它是与系统所应对的领域(Domain)逻辑有关,很多时候,也将业务逻辑层称为领域层。例如Martin Fowler在《Patterns of Enterprise Application Architecture》一书中,将整个架构分为三个主要的层:表示层、领域层和数据源层。作为领域驱动设计的先驱Eric Evans,对业务逻辑层作了更细致地划分,细分为应用层与领域层,通过分层进一步将领域逻辑与领域逻辑的解决方案分离。 业务层在体系架构中的位置很关键,它处于数据访问层与表示层中间,起到了数据交换中承上启下的作用。由于层是一种弱耦合结构,层与层之间的依赖是向下的,底层对于上层而言是“无知”的,改变上层的设计对于其调用的底层而言没有任何影响。如果在分层设计时,遵循了面向接口设计的思想,那么这种向下的依赖也应该是一种弱依赖关系。因而在不改变接口定义的前提下,理想的分层式架构,应该是一个支持可抽取、可替换的“抽屉”式架构。正因为如此,业务层的设计对于一个支持可扩展的架构尤为关键,因为它扮演了两个不同的角色。对于数据访问层而言,它是调用者;对于表示层而言,它却是被调用者。依赖与被依赖的关系都纠结在业务层上,如何实现依赖关系的解耦,则是除了实现业务逻辑之外留给设计师的任务。
持久层(DAO):
持久层,有时候也称为是数据访问层,其功能主要是负责数据库的访问,可以访问数据库系统、二进制文件、文本文档或是XML文档。采用DAO模式,建立实体类和数据库表映射(ORM映射)。简单的说法就是实现对数据表的select、insert、update以及delete的操作。如果要加入ORM的元素,那么就会包括对象和数据表之间的mapping,以及对象实体的持久化。
图书实体类
package com.icss.javaSE10.entity;
import java.util.Date;
/**
- 图书实体类
- @author apple
*/
public class Book {
private int id;// 图书编号
private String name;// 图书名称
private double price;// 图书价格
private int state;// 借出状态(int类型0表示已借出1表示未借出)
private Date borrowdate;// 借出日期
public Book() {
super();
}
public Book(String name, double price, int state, Date borrowdate) {
super();
this.name = name;
this.price = price;
this.state = state;
this.borrowdate = borrowdate;
}
public Book(int id, String name, double price, int state, Date borrowdate) {
super();
this.id = id;
this.name = name;
this.price = price;
this.state = state;
this.borrowdate = borrowdate;
}
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;
}
@Override
public String toString() {
return "Book [id=" + id + ", name=" + name + ", price=" + price + ", state=" + state + ", borrowdate="
+ borrowdate + "]";
}
public double getPrice() {
return price;
}
public void setPrice(double price) {
this.price = price;
}
public int getState() {
return state;
}
public void setState(int state) {
this.state = state;
}
public Date getBorrowdate() {
return borrowdate;
}
public void setBorrowdate(Date borrowdate) {
this.borrowdate = borrowdate;
}
}
初始化图书数据
package com.icss.javaSE10.dao;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import com.icss.javaSE10.entity.Book;
public class BookInit {
private static List<Book> bookList;
/**
* 初始化图书数据
*/
public static List<Book> getBookList() {
bookList = new ArrayList<Book>();
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
bookList.add(new Book(1, "java SE", 44.5, 1, null));
bookList.add(new Book(2, "最美的时光", 68.8, 1, null));
bookList.add(new Book(3, "离歌", 345.7, 1, null));
try {
bookList.add(new Book(4, "Spring", 68.5, 0, df.parse("2016-02-30")));
} catch (ParseException e) {
e.printStackTrace();
}
return bookList;
}
}
图书数据层接口-增删改查
package com.icss.javaSE10.dao;
import java.util.List;
import com.icss.javaSE10.entity.Book;
/**
- 图书数据层接口-增删改查
- @author apple
*/
public interface BookDao {
public int addBook(Book book)throws Exception;//增加图书
public List<Book> findAllBooks()throws Exception;//查询所有图书
public int deleteBook(String name)throws Exception;//删除图书
public Book findById(int id)throws Exception;//查询图书详情
}
package com.icss.javaSE10.dao.Impl;
import java.util.List;
import com.icss.javaSE10.dao.BookDao;
import com.icss.javaSE10.dao.BookInit;
import com.icss.javaSE10.entity.Book;
public class BookDaoImpl implements BookDao{
private List<Book> bookList = BookInit.getBookList();
/**
* 添加图书
*/
@Override
public int addBook(Book book)throws Exception {
int row = 0;
book.setId(bookList.size()+1);
boolean flag = bookList.add(book);
if(flag) {
row = 1;
}
return row;
}
/**
* 查询所有图书
*/
@Override
public List<Book> findAllBooks() throws Exception {
return bookList;
}
/**
* 删除图书
*/
@Override
public int deleteBook(String name) throws Exception {
int row = 0;
for(int i=0;i<bookList.size();i++) {
Book book = bookList.get(i);
if(book.getName().equals(name)) {//注意equals与==的区别
if(book.getState()==0) {
row=2;//已借出
break;
}
bookList.remove(book);
row = 1;//可以删除
break;
}
}
return row;
}
/**
* 查看图书详情
*/
@Override
public Book findById(int id) throws Exception {
Book book = null;
for(int i=0;i<bookList.size();i++) {
Book book1 = bookList.get(i);
if(book1.getId() == id) {
book = book1;
break;
}
}
return book;
}
}
图书业务处理层接口
package com.icss.javaSE10.service;
import java.util.List;
import com.icss.javaSE10.entity.Book;
/**
- 图书业务处理层接口
- @author apple
*/
public interface BookService {
public int addBook(Book book)throws Exception;//添加图书
public List<Book> findAllBooks()throws Exception;//查看图书
public int deleteBook(String name)throws Exception;//删除图书
public Book findByBook(int id)throws Exception;//查询图书详情
}
package com.icss.javaSE10.service.Impl;
import java.util.List;
import com.icss.javaSE10.dao.BookDao;
import com.icss.javaSE10.dao.Impl.BookDaoImpl;
import com.icss.javaSE10.entity.Book;
import com.icss.javaSE10.service.BookService;
public class BookServiceImpl implements BookService {
private BookDao bookDao = new BookDaoImpl();
/**
* 添加图书
*/
@Override
public int addBook(Book book) throws Exception {
return bookDao.addBook(book);
}
@Override
public List<Book> findAllBooks() throws Exception {
return bookDao.findAllBooks();
}
@Override
public int deleteBook(String name) throws Exception {
return bookDao.deleteBook(name);
}
@Override
public Book findByBook(int id) throws Exception {
return bookDao.findById(id);
}
}
package com.icss.javaSE10.ui;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Scanner;
import com.icss.javaSE10.entity.Book;
import com.icss.javaSE10.service.BookService;
import com.icss.javaSE10.service.Impl.BookServiceImpl;
public class Test {
Scanner scanner = new Scanner(System.in);
public int showMenu() {
System.out.println("欢迎使用图书管理系统");
System.out.println("-----------------------------------------------------------");
System.out.println("1.新增图书");
System.out.println("2.查看所有图书");
System.out.println("3.删除图书");
System.out.println("4.查看图书详情");
System.out.println("5.退出");
System.out.println("-------------------------------------------------------------");
System.out.println("请选择");
return scanner.nextInt();
}
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
Test test = new Test();
BookService bookService = new BookServiceImpl();
int num = 0;
while (true && num == 0) {
int menuNum = test.showMenu();
if (menuNum == 1) {
// 新增
System.out.println("请输入图书名称:");
String bookName = scanner.next();
System.out.println("请输入图书价格:");
double bookPrice = scanner.nextDouble();
Book book = new Book(bookName, bookPrice, 1, new Date());
int row = 0;
try {
row = bookService.addBook(book);
} catch (Exception e) {
System.out.println("添加图书出现异常");
e.printStackTrace();
}
if (row > 0) {
System.out.println("《" + bookName + "》添加成功!!!");
}
} else if (menuNum == 2) {
// 查看所有图书
List<Book> bookList = null;
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
try {
bookList = bookService.findAllBooks();
} catch (Exception e) {
System.out.println("查询图书出现异常");
e.printStackTrace();
}
if (bookList != null && bookList.size() > 0) {
System.out.println("序号\t状态\t名称\t价格\t借出日期");
int number = 1;
for (Book book : bookList) {
String state = book.getState() == 1 ? "未借出" : "已借出";
String date = book.getBorrowdate() == null ? "未借出" : df.format(book.getBorrowdate());
System.out.println(
number++ + "\t" + state + "\t" + book.getName() + "\t" + book.getPrice() + "\t" + date);
}
}
} else if (menuNum == 3) {
// 删除图书
System.out.println("请输入要删除的图书名称:");
String bookName = scanner.next();
int row = 0;
try {
row = bookService.deleteBook(bookName);
} catch (Exception e) {
System.out.println("删除图书异常");
e.printStackTrace();
}
if (row == 0) {
System.out.println("未找到图书");
}
if (row == 1) {
System.out.println("图书编号为《" + bookName + "》的图书删除成功");
}
if (row == 2) {
System.out.println("该图书已借出");
}
} else if (menuNum == 4) {
// 查看图书详情
System.out.println("请输入要查询的图书编号:");
int bookNo = scanner.nextInt();
Book book = null;
try {
book = bookService.findByBook(bookNo);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (book != null) {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
System.out.println("序号\t状态\t名称\t价格\t借出日期");
String state = book.getState() == 1 ? "未借出" : "已借出";
String date = book.getBorrowdate() == null ? "未借出" : df.format(book.getBorrowdate());
System.out.println(
book.getId() + "\t" + state + "\t" + book.getName() + "\t" + book.getPrice() + "\t" + date);
}
} else {
System.out.println("谢谢您的使用");
break;
}
System.out.print("输入0返回上一级:");
num = scanner.nextInt();
} // 循环结束
}
}
三层开发模式的优缺点
优点:
1、开发人员可以只关注整个结构中的其中某一层;
2、可以很容易的用新的实现来替换原有层次的实现;
3、可以降低层与层之间的依赖;
4、有利于标准化;
5、利于各层逻辑的复用。
6、结构更加的明确
7、在后期维护的时候,极大地降低了维护成本和维护时间
缺点:
1、降低了系统的性能。这是不言而喻的。如果不采用分层式结构,很多业务可以直接造访数据库,以此获取相应的数据,如今却必须通过中间层来完成。
2、有时会导致级联的修改。这种修改尤其体现在自上而下的方向。如果在表示层中需要增加一个功能,为保证其设计符合分层式结构,可能需要在相应的业务逻辑层和数据访问层中都增加相应的代码。