博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java迷你图书管理_JAVA高级特性——迷你图书管理系统(DOM4J操作存储集合中的对象)...
阅读量:6454 次
发布时间:2019-06-23

本文共 8573 字,大约阅读时间需要 28 分钟。

要求:使用XML保存图书信息,使用DOM4J操作XML,进行图书的增删改查。

使用技术:XML/DOM4j/集合/对象

部分实现效果如果下:

f0e9066610248a89a7a5eeeac8986222.png

574a8206ad5a662973ee5e11df8d3986.png

实现思路

首先需要创建一个图书类(Book类),保存图书的属性(属性和XML文件一致,因为最终修改的是XML文件),将图书对象放到泛型集合里面去,直接操作集合就可以了,因为需要修改XML文件,每一次对图书的操作都需要保存到XML文件中去,所以可以写一个XmlUtil工具类,专门进行文件的读取和存储,将对文件的操作(增删改查)的方法写一个BookMsg类,最后需要一个测试类,所以这个项目整体需要四个类 ——图书类(Book)、XML文件的读取的和存储(XmlUtil)、XML文件的操作(BookMsg)、测试类(BookText)、XML文件

图书类:

根据项目要求赋予属性,创建构造函数

packagecom.book;public classBook {private Integer id; //图书ID

private String name; //图书名字

private String author; //图书作者

private float price; //图书日租金

private int status; //图书状态(0为未借出,1为借出)

private int count; //图书借出次数

private String times; //借出的日期

publicBook() {}public Book(Integer id, String name, String author, float price, int status, intcount, String times) {this.id =id;this.name =name;this.author =author;this.price =price;this.status =status;this.count =count;this.times =times;

}publicInteger getId() {returnid;

}public voidsetId(Integer id) {this.id =id;

}publicString getName() {returnname;

}public voidsetName(String name) {this.name =name;

}publicString getAuthor() {returnauthor;

}public voidsetAuthor(String author) {this.author =author;

}public floatgetPrice() {returnprice;

}public void setPrice(floatprice) {this.price =price;

}public intgetStatus() {returnstatus;

}public void setStatus(intstatus) {this.status =status;

}public intgetCount() {returncount;

}public void setCount(intcount) {this.count =count;

}publicString getTimes() {returntimes;

}public voidsetTimes(String times) {this.times =times;

}

//重写toStringpublicString toString() {return "Book [id=" + id + ", name=" + name + ", author=" + author + ", price=" + price + ", status=" +status+ ", count=" + count + ", times=" + times + "]";

}

//重写equals方法public booleanequals(Object obj) {

Book ob=(Book) obj;return this.name.equals(ob.getName());

}

}

XML文件

先根据要求初始化一个XML文件

西游记

吴承恩

23

1

45.2

0

红楼梦

曹雪芹

2018-5-16

23

2

68.5

1

白雪公主

迪士尼

37

3

35.8

0

皮皮鸟

zyh

3

4

32.0

0

XmlUtil类

这个类主要实现对XML文件的读取和存储,因为进行操作的时候都需要调用这两个方法,所以可以写为静态方法,而我们读取Xml文件的时候是用集合去保存的,所以读取方法可以返回一个集合,保存XML文件的时候也是保存集合的,所以可以给个集合参数。

难点是我们在BookMsg中写增删改查的方法虽然是用下面写的读取方法qurrybooks()去操作一个集合,但是我们要清楚这个最终修改的是集合里面的每一个Book对象,所以文件的读取保存也是一样,我们要在集合里面的对象和使用DOM4J拿元素的值和创建元素并赋值的方法中切换,实际上是通过了一个集合的转换,将对象的属性和使用DOM4J结合。

packagecom.book;importjava.io.File;importjava.io.FileNotFoundException;importjava.io.FileOutputStream;importjava.io.IOException;importjava.io.OutputStreamWriter;importjava.io.UnsupportedEncodingException;importjava.util.ArrayList;importjava.util.List;importorg.dom4j.Document;importorg.dom4j.DocumentException;importorg.dom4j.Element;importorg.dom4j.io.OutputFormat;importorg.dom4j.io.SAXReader;importorg.dom4j.io.XMLWriter;/***

* XML文件读取/保存

**/

public classXmlUtil {/*** 读取XML、返回一个集合*/

public static Listqurrybooks(){//创建一个泛型集合,保存图书

List books = new ArrayList();//DOM4J读取文件

SAXReader reader = newSAXReader();try{

Document doc=reader.read(new File("Book.xml"));

Element root=doc.getRootElement();//将根元素下的所有book元素放到集合eleBooks中去

List eleBooks=root.elements("book");//遍历每一个book元素下的所有元素(相当于每一本书),把XML里面每一个元素都放到一个新的Book对象里面去

for(Element elembook : eleBooks) {

Book b=newBook();

b.setName(elembook.elementText("name"));

b.setAuthor(elembook.elementText("author"));

b.setId(Integer.parseInt(elembook.element("id").getText()));

b.setCount(Integer.parseInt(elembook.element("count").getText()));

b.setPrice(Float.parseFloat(elembook.element("price").getText()));

b.setStatus(Integer.parseInt(elembook.element("status").getText()));

b.setTimes(elembook.elementText("times"));//再把每一个Book对象放到集合中

books.add(b);

}

}catch(DocumentException e) {

e.printStackTrace();

}//返回一个的集合

returnbooks;

}/***保存XML文件,传一个集合,将集合中的Book对象写到XML文件中去*/

public static boolean SaveXML(Listbook) {

SAXReader read=newSAXReader();//创建一个DOC树,因为XML存文件是存储document树

Document doc=read.getDocumentFactory().createDocument();//创建根元素

Element root=doc.addElement("Books");try{//遍历集合中的所有Book对象,将每一个对象中的属性的值拿出来写到对应XML的属性中去

for(Book b : book) {//创建book元素,在book元素下再去创建对象相对于的元素并给元素的文本属性赋值

Element elebook=root.addElement("book");

elebook.addElement("name").setText(b.getName());

elebook.addElement("author").setText(b.getAuthor());

elebook.addElement("times").setText(b.getTimes()==null?"":b.getTimes());

elebook.addElement("count").setText(b.getCount()+"");

elebook.addElement("id").setText(b.getId()+"");

elebook.addElement("price").setText(b.getPrice()+"");

elebook.addElement("status").setText(b.getStatus()+"");

}//DOM4J的写的XMLWriter()方法,前面是路径,后面是按照漂亮格式写出

XMLWriter xmlw = new XMLWriter(new FileOutputStream("book.xml"), OutputFormat.createPrettyPrint());//将doc树写到xml文件中去

xmlw.write(doc);

xmlw.flush();

xmlw.close();

}catch (UnsupportedEncodingException |FileNotFoundException e) {//TODO Auto-generated catch block

e.printStackTrace();

}catch(IOException e) {//TODO Auto-generated catch block

e.printStackTrace();return false;

}return true;

}

}

BookMsg类

图书的 1.查阅图书功能  2.增加图书功能 3.删除图书功能 4.借阅图书功能 5.归还图书功能

packagecom.book;importjava.text.ParseException;importjava.text.SimpleDateFormat;importjava.util.ArrayList;importjava.util.Date;importjava.util.List;public classBookMsg {//将读取到的XML文件返回的集合设置为全局属性,下面所有方法都 可以直接使用集合book

List book=XmlUtil.qurrybooks();/*** 展示所有图书*/

public voidshowInfo() {

System.out.println("编号\t状态\t名称\t借出次数\t借出日期");for(Book b: book) {//如果图书未借出,借出日期 为空的字符串

if(b.getStatus()==0) {

b.setTimes("");

}//输出图书状态

System.out.println(b.getId()+"\t"+(b.getStatus()==0?"未借出":"已借出")+"\t"+b.getName()+"\t"+b.getCount()+"\t"+b.getTimes());

}

}/*** 增加图书,传一个新的Book对象,直接放到book集合里面去,保存到XML文件中*/

public voidaddBook(Book b) {if(book.size()==0) {

b.setId(1);

}else{

b.setId( book.get(book.size()-1).getId() +1);

}

book.add(b);

System.out.println("增加成功!");

XmlUtil.SaveXML(book);

}/*** 删除图书,将需要删除的Book对象传进来,判断集合中是否有这个对象且不为借出状态就可以删除 contains()

* 删除后保存*/

public voiddeleteBook(Book b) {//判断集合中是否有对象b,且该图书为借出状态时不可被删除

if(book.contains(b)&&b.getStatus()!=1) {

book.remove(b);

XmlUtil.SaveXML(book);

System.out.println("删除成功!");

}else{

System.out.println("图书不存在");

}

}/*** 借图书,传进来的Book对象判断一下集合中是否有这本书,要重写 equles方法,存在就修改状态并且改上当前借出时间

*@paramb*/

public voidborrowBook(Book b) {//转换器,设置格式

SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd");//创建现在的时间

Date nowdate=newDate();//将现在的时间转为字符串

String nowtime=format.format(nowdate);boolean f=false;for(Book book2 : book) {if(book2.getName().equals(b.getName())&&book2.getStatus()==0) {

f=true;

book2.setStatus(1);

book2.setTimes(nowtime);

XmlUtil.SaveXML(book);

System.out.println("借阅成功!");

}

}if(!f) {

System.out.println("图书不存在或已被借阅");

}

}/*** 归还图书,传进来的Book对象判断一下集合中是否有这本书借出,并修改相对应的属性*/

public voidreturnBook(Book b) {

SimpleDateFormat format=new SimpleDateFormat("yyyy-MM-dd");boolean f=false;for(Book book2 : book) {if(book2.getName().equals(b.getName())&&book2.getStatus()==1) {

f=true;try{

Date nowdate=newDate();

String nowtime=format.format(nowdate);//将借出 的时间转换成Date类型 进行计算

Date olddate=format.parse(book2.getTimes());//计算借出的天数

int date=(int)((nowdate.getTime()-olddate.getTime())/1000/3600/24);

book2.setStatus(0);

book2.setCount(book2.getCount()+1);

XmlUtil.SaveXML(book);

System.out.println("归还成功!");

System.out.println("借出日期为:"+book2.getTimes());

System.out.println("归还日期为:"+nowtime);

System.out.println("应付租金为:"+book2.getPrice()*date);

}catch(ParseException e) {

e.printStackTrace();

}

}

}if(!f) {

System.out.println("图书不存在或已归还");

}

}

}

Bookmain类

packagecom.book;importjava.util.ArrayList;importjava.util.List;importjava.util.Scanner;public classBookmain {public static voidmain(String[] args) {

Scanner input=newScanner(System.in);

BookMsg bsg=newBookMsg();int type=0;do{

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("6.退出系统");

type=input.nextInt();switch(type) {case 1:

bsg.showInfo();break;case 2:

Book book=newBook();

System.out.println("请输入图书名字");

book.setName(input.next());

System.out.println("请输入图书作者");

book.setAuthor(input.next());

System.out.println("请输入图书价格");

book.setPrice(input.nextFloat());

bsg.addBook(book);break;case 3:

Book b=newBook();

System.out.println("请输入要删除的图书名字");

b.setName(input.next());

bsg.deleteBook(b);break;case 4:

System.out.println("请输入要借阅的图书");

Book b2=newBook();

b2.setName(input.next());

bsg.borrowBook(b2);break;case 5:

System.out.println("请输入要归还的图书");

Book b3=newBook();

b3.setName(input.next());

bsg.returnBook(b3);break;case 6:

System.out.println("系统结束");return;

}

System.out.println("输入0返回:");

type=input.nextInt();

}while(type==0);

}

}

每一次进行图书的操作(增删改查)的时候,都需要对XML文件进行修改,XmlUtil类 的存在就是为了简化操作的时候每个方法还需要再写一遍对XML文件的读取和写出,而且通过集合的转换也简化了许多操作

转载地址:http://pcyzo.baihongyu.com/

你可能感兴趣的文章
【语法】数组Array
查看>>
WebBrowser一点心得,如果在Javascript和Winform代码之间实现双向通信
查看>>
vue elementUI之Form表单 验证
查看>>
Android程序完全退出的三种方法
查看>>
依赖注入和控制反转
查看>>
权限体系构建 - 平台权限
查看>>
线性表5 - 数据结构和算法10
查看>>
电子脉冲示例图
查看>>
通过cmp 指令执行后,相关标志位的值就可以看出比较的结果
查看>>
变量的原理
查看>>
Poj 1017 / OpenJudge 1017 Packets/装箱问题
查看>>
python 文件处理
查看>>
有氧运动 && 无氧运动
查看>>
mysql时间查看以及定时器相关操作
查看>>
【最大点独立集】【poj1419】【Graph Coloring】
查看>>
php5魔术函数、魔术常量
查看>>
Pusher 消息推送测试工具
查看>>
html&css中的文字对齐问题
查看>>
Qt基本布局(QLayout)
查看>>
springboot搭建的2种方式
查看>>