采用DOM4j操作XML数据库完整实例

来源:互联网 发布:韩国社交软件排名 编辑:程序博客网 时间:2024/05/17 08:05

注意:该博客是在学习《黑马JavaEE12期》时,dom4j部分讲师留下来的作业。我自己做了改进,并且完成了剩余的部分。

1、项目目录结构(标注为红色框的是相关代码)



2、实体Student.java中的代码如下

package cn.itcast.dom4j.homework;/** * 该类的写法参照Effective Java第二版 * 中的Item 2,用于封装实体 */public class Student {private String number;private String name;private String sex;private int age;private Student(Builder builder) {this.number = builder.number;this.name = builder.name;this.sex = builder.sex;this.age = builder.age;}public String getNumber() {return number;}public void setNumber(String number) {this.number = number;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}@Overridepublic String toString() {return "Student [number=" + number + ", name=" + name + ", sex=" + sex+ ", age=" + age + "]";}/** * 使用内部类,构造属性 */public static class Builder {private String number = null;private String name = null;private String sex = null;private int age = 0;public Builder() {}public Student build() {return new Student(this);}public Builder number(String number) {this.number = number;return this;}public Builder name(String name) {this.name = name;return this;}public Builder sex(String sex) {this.sex = sex;return this;}public Builder age(int age) {this.age = age;return this;}}}

3、students_copy.xml中的内容

<?xml version="1.0" encoding="utf-8"?><students>   <student number="itcast_0001">     <name>rose</name>      <age>16</age>      <sex>female</sex>   </student>    <student number="itcast_0002">     <name>jerry</name>      <age>16</age>      <sex>female</sex>   </student> </students>

4、接口StudentDao.java中的代码

package cn.itcast.dom4j.homework;import java.util.List;//Dao ==> Data Access Objectpublic interface StudentDao {// 增void saveStudent(Student stu);// 删void deleteStudent(String number);void deleteStudent(Student stu);// 改void updateStudent(Student stu);// 查Student getStudentByNumber(String number);List<Student> getAllStudent();}

5、实现类StudentDaoImpl.java中的代码

package cn.itcast.dom4j.homework;import java.io.File;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.io.UnsupportedEncodingException;import java.util.ArrayList;import java.util.List;import org.dom4j.Document;import org.dom4j.DocumentException;import org.dom4j.Element;import org.dom4j.io.OutputFormat;import org.dom4j.io.SAXReader;import org.dom4j.io.XMLWriter;public class StudentDaoImpl implements StudentDao {/** * 保存学生 */public void saveStudent(Student stu) {try {Document doc = getDocument();Element root = doc.getRootElement();//4.在根元素上添加student子元素,添加属性Element studentEle = root.addElement("student").addAttribute("number", stu.getNumber());//5. 在student上添加name,age,sex子元素并添加内容studentEle.addElement("name").setText(stu.getName());studentEle.addElement("age").setText(stu.getAge()+"");studentEle.addElement("sex").setText(stu.getSex());save2File(doc);} catch (Exception e) {e.printStackTrace();}}/** * 保存文档到XML文档中 * @param doc * @throws UnsupportedEncodingException * @throws FileNotFoundException * @throws IOException */private void save2File(Document doc) throws UnsupportedEncodingException,FileNotFoundException, IOException {XMLWriter writer = null;try{//1>创建OutputFormatOutputFormat format = OutputFormat.createPrettyPrint();format.setEncoding("utf-8");//2>创建xmlwriterwriter = new XMLWriter(new FileOutputStream("src/students_copy.xml"), format);//3>写入writer.write(doc);}finally{//4>释放资源if(writer != null) {writer.close();}}}/** * 获取文档 * @return * @throws DocumentException */private Document getDocument() throws DocumentException {//1.创建解析器SAXReader reader = new SAXReader();//2.加载xml文件 ==> docDocument doc =  reader.read(new File("src/students_copy.xml"));//3.返回文档return doc;}/** * 根据学号删除学生 */public void deleteStudent(String number) {if((number == null) || ("".equals(number.trim()))){throw new RuntimeException("学生学号为空,无法删除操作");}try {Document doc = getDocument();String xpath = "//student[@number='" + number.trim() + "']";Element studentEle = (Element) doc.selectSingleNode(xpath);if(studentEle == null) {throw new RuntimeException("没有学号为" + number + "的学生,无法执行删除操作");}//执行删除操作    booleanisDeleteSuccess = studentEle.getParent().remove(studentEle);    System.out.println(isDeleteSuccess?"删除成功":"删除失败");    save2File(doc);} catch (DocumentException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}/** * 删除学生 */public void deleteStudent(Student stu) {String number = stu.getNumber();deleteStudent(number);}/** * 更新学生 */public void updateStudent(Student stu) {String number = stu.getNumber();String name = stu.getName();int age = stu.getAge();String sex = stu.getSex();String xpath = "//student[@number='" + number + "']";try {Document document = document = getDocument();Element studentEle = (Element) document.selectSingleNode(xpath);//3、修改student元素的子元素的name,age,sex内容studentEle.element("name").setText(name);studentEle.element("age").setText(String.valueOf(age));studentEle.element("sex").setText(sex);save2File(document);} catch (DocumentException e) {e.printStackTrace();} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}/** * 通过学号查询学生 */public Student getStudentByNumber(String number) {if(null == number) {return null;}try {Document doc = getDocument();String xpath = "//student[@number='" + number.trim() + "']";Element studentEle = (Element) doc.selectSingleNode(xpath);String name = studentEle.elementText("name");String age = studentEle.elementText("age");String sex = studentEle.elementText("sex");//当构造器有多个参数时使用创建者创建对象Student student = new Student.Builder().number(number).name(name).sex(sex).age(Integer.valueOf(age)).build();System.out.println(student);return student;} catch (DocumentException e) {e.printStackTrace();}return null;}/** * 查询所有学生 */public List<Student> getAllStudent() {try {Document doc = getDocument();//获取根元素Element rootEle = doc.getRootElement();List<Element> studentsEle = rootEle.elements("student");if(studentsEle == null || studentsEle.size() == 0)throw new RuntimeException("文档中不存在需要查找的元素");List<Student> list = new ArrayList<Student>();for (Element stuEle : studentsEle) {String number = stuEle.attributeValue("number");String name = stuEle.elementText("name");String age = stuEle.elementText("age");String sex = stuEle.elementText("sex");Student student = new Student.Builder().number(number).name(name).sex(sex).age(Integer.valueOf(age.trim())).build();list.add(student);}return list;} catch (DocumentException e) {e.printStackTrace();}return null;}}

6、单元测试类TestDemo.java中的代码(全部测试成功)

package cn.itcast.dom4j.homework;import java.util.List;import org.junit.Before;import org.junit.Test;public class TestDemo {private static StudentDao dao = new StudentDaoImpl();;@Beforepublic void before() {}@Testpublic void testGetAllStudents() {List<Student> list = dao.getAllStudent();System.out.println(list);}@Testpublic void testSaveStudent() {Student stu = new Student.Builder().number("itcast_0004").age(18).name("卡卡罗特").sex("男").build();dao.saveStudent(stu);}@Testpublic void testUpdateStudent() {Student stu = new Student.Builder().number("itcast_0004").age(20).name("库林").sex("男").build();dao.updateStudent(stu);}@Testpublic void testDeleteByNumber() {String number = "itcast_0004";dao.deleteStudent(number);}@Testpublic void testDeleteByModel() {Student stu = new Student.Builder().number("itcast_0003").build();dao.deleteStudent(stu);}}







原创粉丝点击