DAO模式代码阅读及应用
疑难问题
1.StudenDaoListImpl.java与StudentDaoArrayImpl.java有何不同?
答:StudenDaoListImpl.java文件是用链表来存储学生信息而,StudentDaoArrayImpl.java文件使用数组存储学生信息。都是实现了查找学生的方法,但由于StudenDaoListImpl.java文件是用链表,所以从头开始直接判断,到空为结束,直到找到学生返回。而StudentDaoArrayImpl.java文件是用数组,在遍历过程中,有可能会遇到姓名为空的情况,这时就要判断是否为空,不为空才能比较是否找到学生。在实现增加增加学生的方法,链表直接使用自带add方法增加。而数组要遍历整个数组,找到空的地方进行存储,有可能会遇到数组满的情况。在实现输出所有学生信息的方法,两者大致相同。
2.StudentDao.java文件是干什么用的?为什么里面什么实现代码都没有?
答:在StudentDao.java文件中定义了一个StudentDao接口,里面有三个方法的声明,其他类通过继承StudentDao类,实现StudentDao.java文件中的方法,这样可以子类有着相同的三个方法声明,不同的子类根据不同的数据不同的存储方式写出不一样的方法代码。
3.使用搜索引擎搜索“Java DAO”,选出几句你能看懂的、对你最有启发的话。请结合接口知识去理解。
答:隔离了数据访问代码和业务逻辑代码。业务逻辑代码直接调用DAO方法即可,完全感觉不到数据库表的存在。分工明确,数据访问层代码变化不影响业务逻辑代码,这符合单一职能原则,降低了藕合性,提高了可复用性。通过DAO接口,访问DAO方法来解决问题,子类继承针对出不同的数据库可以写出不同的内部方法,通过DAO接口访问子类,使用子类方法,修改子类数据库代码数据,不会影响到DAO接口的使用,不同数据库对应不同的DAO方法代码,是的数据访问代码与业务逻辑代码隔离。
4.尝试运行Test.java。根据注释修改相应代码。结合参考代码回答使用DAO模式有什么好处?
数组实现
package stumanagement;
public class Test {
public static void main(String[] args) {
Student[] students = new Student[4];
students[0] = new Student("Tom");
students[1] = new Student("Jerry");
students[2] = new Student("Sophia");
students[3] = new Student("ding");
StudentDao sdm = new StudentDaoArrayImpl(50);// 使用数组实现
//StudentDao sdm = new StudenDaoListImpl();//使用列表实现
// 往后台写数据,无需考虑后台是什么(到底是数据库、文件、数组、List)
// 因为这里是面向StudentDao接口
System.out.println("===========写入学生========");
for (Student e : students) {
if (!sdm.addStudent(e)) {
System.out.println("添加学生失败");
} else {
System.out.println("插入成功!!");
}
}
System.out.println("===========显示所有学生========");
sdm.diplayAllStudents();
System.out.println("===========查询学生========");
Student temp = sdm.getStuByName("Tom");
if (temp == null) {
System.out.println("查无此人");
} else {
System.out.println(temp);
}
}
}
列表实现
package stumanagement;
public class Test {
public static void main(String[] args) {
Student[] students = new Student[4];
students[0] = new Student("Tom");
students[1] = new Student("Jerry");
students[2] = new Student("Sophia");
students[3] = new Student("ding");
//StudentDao sdm = new StudentDaoArrayImpl(50);// 使用数组实现
StudentDao sdm = new StudenDaoListImpl();//使用列表实现
// 往后台写数据,无需考虑后台是什么(到底是数据库、文件、数组、List)
// 因为这里是面向StudentDao接口
System.out.println("===========写入学生========");
for (Student e : students) {
if (!sdm.addStudent(e)) {
System.out.println("添加学生失败");
} else {
System.out.println("插入成功!!");
}
}
System.out.println("===========显示所有学生========");
sdm.diplayAllStudents();
System.out.println("===========查询学生========");
Student temp = sdm.getStuByName("Tom");
if (temp == null) {
System.out.println("查无此人");
} else {
System.out.println(temp);
}
}
}
两种不同的子类实现同样的结果,子类内部存储不同,代码方式不同。
答:通过DAO接口,访问子类,建立子类的数据数组,就想StudentDao sdm = new StudentDaoArrayImpl(50);通过子类建立了子类数组,通过子类自己内部特定方法进行使用,插入、显示、查询学生,然后换成StudentDao sdm = new StudenDaoListImpl();建立子类链表数据,也还是根据链表子类自身内部方法来实现插入、显示、查询方法,通过DAO接口,使用不同的子类,使用子类内部方法,这样使得可以在不同数据处理更加方便,通过写出DAO接口,根据接口方法,写出不同数据存储方式的方法,使用不同数据处理更加便捷。