注意:该博客是在学习《黑马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;
}
@Override
public 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 Object
public 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>创建OutputFormat
OutputFormat format = OutputFormat.createPrettyPrint();
format.setEncoding("utf-8");
//2>创建xmlwriter
writer = 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文件 ==> doc
Document 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
+ "的学生,无法执行删除操作");
}
//执行删除操作
boolean isDeleteSuccess = 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();;
@Before
public void before() {
}
@Test
public void testGetAllStudents() {
List<Student> list = dao.getAllStudent();
System.out.println(list);
}
@Test
public void testSaveStudent() {
Student stu = new Student.Builder()
.number("itcast_0004").age(18)
.name("卡卡罗特").sex("男").build();
dao.saveStudent(stu);
}
@Test
public void testUpdateStudent() {
Student stu = new Student.Builder()
.number("itcast_0004").age(20).name("库林")
.sex("男").build();
dao.updateStudent(stu);
}
@Test
public void testDeleteByNumber() {
String number = "itcast_0004";
dao.deleteStudent(number);
}
@Test
public void testDeleteByModel() {
Student stu = new Student.Builder()
.number("itcast_0003").build();
dao.deleteStudent(stu);
}
}