实现控制台下控制图书的增删改查的功能,说白了就是对xml文件内容的增删改查.直接上代码吧.
项目结构如下:
主程序入口:
package xmlbooksys;
import java.util.Scanner;
public class AppMain {
public static void main(String[] args) throws Exception {
Scanner sc = new Scanner(System.in);
BookDao bookDao = new BookDao();
System.out.println("欢迎使用累死你活该图书系统");
while (true) {
System.out.println("请选择功能: A(添加) B(查看所有图书) C(删除) D(更新) E(退出系统)");
String option = sc.next();
if (option.equalsIgnoreCase("A")) {
bookDao.addBook();
} else if (option.equalsIgnoreCase("B")) {
bookDao.showBook();
} else if (option.equalsIgnoreCase("C")) {
bookDao.removeBook();
} else if (option.equalsIgnoreCase("D")) {
bookDao.updateBook();
} else if (option.equalsIgnoreCase("E")) {
System.exit(0);
} else {
System.out.println("你的输入有误!!请重新输入!!");
}
}
}
}
图书CRUD操作类
package xmlbooksys;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Scanner;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;
public class BookDao {
private static String option; // 记录用户的选择
private static Scanner sc = new Scanner(System.in); // 记录用户的输入
private static Document document = null;
static {
try {
File file = new File("books.xml");
if (file.exists()) {
document = new SAXReader().read(file);
} else {
Element rootEle = DocumentHelper.createElement("书架");
document = DocumentHelper.createDocument(rootEle);
}
} catch (Exception e) {
}
}
// 刷新当前xml文件
private static void writeXml() throws Exception {
// 创建格式化对象,并指定xml的编码格式
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("gbk");
// 使用document对象更新xml目标文件
FileWriter fileWriter = new FileWriter("books.xml");// 文件输入字符流
XMLWriter xmlwriter = new XMLWriter(fileWriter, format);
xmlwriter.write(document);
xmlwriter.close();
}
// 添加图书
public void addBook() throws Exception {
System.out.println("——>你选则了添加图书功能");
System.out.println("请输入书的编号");
String id = sc.next();
System.out.println("请输入书名");
String name = sc.next();
System.out.println("请输入价格");
String price = sc.next();
System.out.println("请输入出版社名字");
String publish = sc.next();
System.out.println("请输入出版日期");
String date = sc.next();
// 获取根节点
Element rootEle = document.getRootElement();
// 添加子节点
Element bookEle = rootEle.addElement("书");
bookEle.addElement("书号").setText(id);
bookEle.addElement("书名").setText(name);
bookEle.addElement("价格").setText(price);
bookEle.addElement("出版社").setText(publish);
bookEle.addElement("日期").setText(date);
System.out.println("添加图书成功!!");
writeXml();
}
// 显示book
StringBuilder sb = null;// 添加一个字符串缓冲区
public void showBook() throws Exception {
System.out.println("——>你选择了查看图书的功能");
Element rootEle = document.getRootElement();
// 通过根节点获取所有书子节点
List<Element> bookEles = rootEle.elements("书");
int count = 0;
for (Element item : bookEles) {
sb = new StringBuilder();
sb.append("========第" + (++count) + "本书=======\r\n");
sb.append("书号:" + item.elementText("书号"));
sb.append(" 书名:" + item.elementText("书名"));
sb.append(" 价格:" + item.elementText("价格"));
sb.append(" 出版社:" + item.elementText("出版社"));
sb.append(" 日期:" + item.elementText("日期") + "\r\n");
System.out.println(sb.toString());
sb = null;
}
if (count == 0) {
System.out.println("当前还没有图书,赶紧添加吧!!");
}
}
// 删除书 根据书名删除
public void removeBook() throws Exception {
System.out.println("——>你选择了删除图书的功能");
System.out.println("请输入你要删除的书名");
String name = sc.next();
// 获取当前需要操作的图书的书节点
Element currentBookNode = null;
outer: while (true) {
// 获取所有的书节点
List<Element> bookEles = document.getRootElement().elements("书");
// 遍历所有的书节点
for (Element bookItem : bookEles) {
// 判断书名节点的内容是否与用户输入的内容相同
if (name.equals(bookItem.elementText("书名"))) {
currentBookNode = bookItem;
break outer;
}
}
System.out.println("不存在" + name + "请重新输入,返回上级输入Q");
name = sc.next();
if (name.equalsIgnoreCase("q")) {
return;
}
}
if (null != currentBookNode) {
// 如果内容相同,则开始删除图书
document.getRootElement().remove(currentBookNode);
writeXml();// 操作完后刷新xml文件
System.out.println("删除图书成功...");
}
}
// 更新book
public void updateBook() throws Exception { // 更新价格、 出版日期、 名字
System.out.println("——>你选则了更新功能");
System.out.println("请输入你要更新的书号");
String id = sc.next();
// 获取当前需要操作的图书的书节点
Element currentBookNode = null;
List<Element> bookEles = document.getRootElement().elements("书");
outer: while (true) {
for (Element bookEle : bookEles) {
if (id.equals(bookEle.elementText("书号"))) {
currentBookNode = bookEle;
break outer;
}
}
System.out.println("书号" + id + "不存在请重新输入,返回上级输入Q");
id = sc.next();
if (id.equalsIgnoreCase("q")) {
return;
}
}
if (null != currentBookNode) {
System.out.println("请选择更新方式: 【1】更新价格 【2】更新出版日期 【3】更新名字");
while (true) {
option = sc.next();
if (option.equalsIgnoreCase("1")) {
System.out.println("请输入新的价格");
String price = sc.next();
currentBookNode.element("价格").setText(price);
break;
} else if (option.equalsIgnoreCase("2")) {
System.out.println("请输入新的出版日期");
String date = sc.next();
currentBookNode.element("日期").setText(date);
break;
} else if (option.equalsIgnoreCase("3")) {
System.out.println("请输入新的名字");
String name = sc.next();
currentBookNode.element("书名").setText(name);
break;
} else {
System.out.println("输入有误,请重新选择!!");
}
}
// 更新完后需要重新写入数据
writeXml();
System.out.println("修改成功");
}
}
}