文章目录
1. 由作业引入
作业中给到的阅读代码:
- DAO接口
package stumanagement;
public interface StudentDao {
public boolean addStudent(Student student);
public Student getStuByName(String name);
public void diplayAllStudents();
}
- List-ArrayList实现
package stumanagement;
import java.util.ArrayList;
import java.util.List;
public class StudenDaoListImpl implements StudentDao {
private List<Student> students = new ArrayList<Student>();
@Override
public Student getStuByName(String name) {
Student temp = null;
for(Student e:students){
if(e.getName().equals(name)){
temp = e;
}
}
return temp;
}
@Override
public boolean addStudent(Student student) {
students.add(student);
return true;
}
@Override
public void diplayAllStudents(){
for(Student e:students){
if (e != null)
System.out.println(e);
}
}
}
- 数组实现:
package stumanagement;
public class StudentDaoArrayImpl implements StudentDao {
private Student[] students;
public StudentDaoArrayImpl(int size) {
students = new Student[size];
}
@Override
public Student getStuByName(String name) {
Student temp = null;
for(int i=0; i<students.length;i++){
if(students[i]!= null){
if (students[i].getName().equals(name)){
temp = students[i];
break;
}
}
}
return temp;
}
@Override
public boolean addStudent(Student student) {
boolean success = false;
for(int i=0; i<students.length;i++){
if(students[i]==null){
students[i] = student;
success = true;
break;
}
}
return success;
}
@Override
public void diplayAllStudents(){
for(Student e:students){
if (e != null)
System.out.println(e);
}
}
}
- Student类的具体实现
package stumanagement;
public class Student {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Student(String name) {
this.name = name;
}
@Override
public String toString() {
return "Student [name=" + name + "]";
}
}
- Test文件:
package stumanagement;
public class Test {
public static void main(String[] args) {
Student[] students = new Student[3];
students[0] = new Student("Tom");
students[1]= new Student("Jerry");
students[2] = new Student("Sophia");
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);
}
}
}
2. 对作业问题的回答–初步了解Java Dao:
2.1 StudenDaoListImpl.java与StudentDaoArrayImpl.java有何不同?
- 两者对StudentDao接口内的方法进行实现时采用的数据结构不同,
- List采用的是List - ArrayList:
- 而Array采用的是数组:
- 而这两者最大的差别在于,List-ArrayList不需要事先指定长度大小,它的Size是可以动态变化的,但是数组Array却需要在初始化之时就指定所创建的数组的大小。其次,对于添加的操作,List-ArrayList只需要调用add方法就行,但是数组本身却需要先找到插入的位置,然后再添加进数组。
2.2 StudentDao.java文件是干什么用的?为什么里面什么实现代码都没有?
- 这个文件定义了一个接口,接口中声明了许多方法。(我更愿意称它为一类方法的集合)
- 而里面没有实现代码的原因是,接口不需要具体的实现方法的代码,接口中的方法的具体实现由implements这个接口的类去实现。
2.3 使用搜索引擎搜索“Java DAO”,选出几句你能看懂的、对你最有启发的话。请结合接口知识去理解。
- 一个典型的DAO 模式主要由以下几部分组成。
- 1、DAO接口: 把对数据库的所有操作定义成抽象方法,可以提供多种实现。
- 2、DAO 实现类: 针对不同数据库给出DAO接口定义方法的具体实现。
- 3、实体类:用于存放与传输对象数据。
- 4、数据库连接和关闭工具类: 避免了数据库连接和关闭代码的重复使用,方便修改。
以上是通过资料选出的语句。
- 分析第一点,这个部分类似于老师代码给出的例子的StudentDao的文件,这个文件就是一个类似于DAO接口的存在,该接口文件抽象出了几个关于学生信息管理系统的一些基础的方法。这一部分和接口的本质是相同的,都是抓住共同方法来编程, 并且考虑到具体实现可以有多样性,所以并不直接在接口处进行实现,给具体问题具体分析留下了好的结构基础。
- 分析第二点,老师在本题中给出的List和数组的实现类就是基于StudentDao接口的实现类,用两种不同的数据结构,List和数组去实现Dao接口中定义好的抽象方法。
- 分析第三点,资料中能体现实体类的我个人的理解是List类-ArrayList类 和 数组这个基础引用类型。
- 最后总得来说,我个人认为,Java DAO模式是以接口为基础的一种针对数据库管理的特殊的接口及其衍生类的一个共同体。 在实际解决问题的过程中,数据量一大起来,使用数据库来存储数据是必然的事情,而当开始使用数据库的时候,这时,对数据库的管理问题就迎面而来了,而特别划归出Java DAO模式来管理数据库,抓住使用数据库的核心方法来进行程序设计,同时又以DAO接口为基础,把对数据库的代码的管理和其他程序中主要功能实现的代码区分开来,我个人觉得,在代码的维护和管理上这是一种很棒的方法,很有逻辑意味。
2.4 尝试运行Test.java。根据注释修改相应代码。结合参考代码回答使用DAO模式有什么好处?
- 由上面所给出的测试图可知,DAO模式的好处是将方法和具体实现方法的部分抽离开了,一个接口可以被多次实现,这样的好处是,在最终的测试流程中,当我想要变换新的数据结构来存储我的数据的时候,我不需要对我的代码有很大的改动, 具体代码的编写我可以另外新建一个类去具体实现,而不需要在原本的数据结构的代码中去重构,在主要的流程控制模块中,也仅仅是用于创建的对象的创建方法不同而已,这样的模式极大地方便了我们对代码的管理和修改:
- 比如在初期我可以用简单的数据结构来测试我对具体方法的实现的结果是否满足我的设想,而后期需要用更复杂的存储结构的时候,我不需要重写所有的代码,而仅仅需要针对现在所想要实现的存储方式去实现我定义好的接口就可以了。
2.5 可选:编写一些使用DAO模式的代码。比如使用文件作为购物车存储底层。
- 这里使用
HashMap
作为购物车存储底层来实现: - 接口定义:
- 实现类代码: