DAO模式

来源:互联网 发布:it产品包装 编辑:程序博客网 时间:2024/05/01 21:57

DAO模式的主要作用是提供给开发人员一个与存储方式无关的数据访问层。这里的存储方式可以是文本text,关系数据库rdb,xml等。

开发人员和DAO(即数据访问层)发生联系。而不关心数据的具体访问方法。无论你使用JDBC,封装过得JDBC,hibernate,JDO等等。

比如下面的一个程序。就是个与存储方式无关的DAO模式的简单实现。

=============Student.java==========
import java.sql.*;
public class Student implements java.io.Serializable{
private String id;
private String name;
private Date birthday;

public Student(){}
public Student(String id, String name, Date birthday){
this.id = id;
this.name = name;
this.birthday = birthday;
}

public String getId() { return id; }
public void setId(String id) { this.id = id; }

public String getName() { return name; }
public void setName(String name) { this.name = name; }

public Date getBirthday() { return birthday; }
public void setBirthday(Date birthday) { this.birthday = birthday; }
}

=================Course.java======================
public class Course implements java.io.Serializable{
private String id;
private String name;
private String description;

public Course() {}
public Course(String id, String name, String description){
this.id = id;
this.name = name;
this.description = description;
}

public String getId() { return id; }
public void setId(String id) { this.id = id; }

public String getName() { return name; }
public void setName(String name ) { this.name = name; }

public String getDescription() { return description; }
public void setDescription(String description) { this.description = description; }
}

==============SMdao.java==================
import java.sql.*;
public interface SMdao {
public Student createStudent(String id, String name, Date birthday);
publc Course createCourse(String id, String name, String description);

public Student findStudent(String id);
public Course findCourse(String id);

public void clean();
}

==============FileSMdaoImpl.java==============
import java.util.Properties;
import java.sql.*;
import java.io.*;

public class FileSMdaoImpl implements SMdao {
private Properties pro;
private final static String SFILE_URL = "student.file.url";
private final static String CFILE_URL = "course.file.url";
public FileSMdaoImpl(Properties pro){
this.pro = pro;
}

public Student createStudent(String id, String name, Date birthday) {
FileOutputStream fos = null;
ObjectOutputStream oos = null;
Student stu = null;

try {
fos = new FileOutputStream(pro.getProperty(FILE_URL), true);
oos = new ObjectOutputStream(fos);
stu = new Student(id, name, birthday);
oos.writeObject(stu);
} catch(Exception e) { stu = null; }
finally{
try { if(oos != null) oos.close(); } catch(Exception e){}
try { if(fos != null) oos.close(); } catch(Exception e) {}
}

return stu;
}

public Course createCourse(String id, String name, String description){
return null;
}

public Student findStudent(String id) {
return null;
}

public Course findCourse(String id) {
return null;
}

public void clean() {}
}
==============DBSMdaoImpl.java==============
import java.sql.*;
import java.util.Properties;

public class DBSMdaoImpl implements SMDao {
private Connection con;
private final static String DBDRV = "db.driver";
private final static String DBURL = "db.url";
private final static String DBUSER = "db.user";
private final static String DBPASSWD = "db.password";

public DBSMdaoImpl(Properties pro) {
try {
Class.forName(pro.getProperty(DBDRV));
String user = pro.getProperty(DBUSER);
String passwd = pro.getProperty(DBPASSWD);
if(user != null)
con = DriverManager.getConnection(pro.getProperty(DBURL),
user, passwd);
else
con = DriverManager.getConnection(pro.getProperty(DBURL));
} catch(Exception e){}
}

public Student createStudent(String id, String name, Date birtyday) {
if(con == null) return null;
Student stu = null;
PreparedStatement stm = null;

try {
stm = con.prepareStatement("insert into student(id, name, birthday) " +
                                                            "values(?, ?, ?)");
stm.setString(1, id);
stm.setString(2, name);
stm.setDate(3, birthday);

if(stm.executeUpdate() > 0)
stu = new Student(id, name, birthday);
}catch(Exception e){}
finally{
try {if(stm != null) stm.close();}
catch(Exception e) {}
}

return stu;
}

public Course createCourse(String id, String name, String desc) { return null; }
public Student findStudent(String id) { return null; }
public Course findCourse(String id) { return null; }

public void clean() {
try {
if(con != null) con.close();
}catch(Exception e) {}
}
}

===============SMdaoFactory.java===============
import java.util.*;

public class SMdaoFactory {
Properties pro;
public static final String TYPE_FILE = "file";
public static final String TYPE_DB = "database";
private String type;
      private static SMdaoFactory factory;
    static{  factory = new SMdaoFactory();}

private SMdaoFactory() {

}

public static SMdaoFactory newInstance() { return factory; }

public void setType(String type) { this.type = type; }

public void setProperties(Properties pro) { this.pro = pro; }

public SMdao createSMdao() {
if(type.equals(TYPE_FILE))
return new FileSMdaoImpl(pro);
else
return new DBSMdaoImpl(pro);
}
}


=================Main.java=========================================
import java.io.*;
import java.util.*;
import java.sql.*;
public class Main{
public static void main(String args[]){
Properties pro = new Properites();
try {
pro.load(Main.class.getResourceAsStream("conf.properties");
}catch(Exception e) {
e.printStackTrace();
System.exit(1);
}

SMdaoFactory factory = SMdaoFactory.newInstance();
factory.setType(SMdaoFactory.TYPE_DB);
factory.setProperties(pro);
SMdao dao = factory.createSMdao();
GregorainCalendar calendar = new GregorainCalendar();
calendar.set(Calendar.YEAR, 1975);
calendar.set(Calendar.MONTH, 2);
calendar.set(Calendar.DAY_OF_MONTH, 21);
java.sql.Date birthday = new java.sql.Date(calendar.getTimeInMills());
Student stu = dao.createStudent("12345", "George", birthday);
}
}
==============conf.properties===================
db.driver=COM.pointbase.jdbc.jdbcUniversalDriver
db.url=jdbc:pointbase:server://george/sample
db.user=pbpulic
db.password=pbpublic

student.file.url=student
course.file.url=course

可以看出DAO模式把数据存储的各种操作从业务对象中抽离出来,一切的操作均是面向业务对象Course,Student,这样OO的思想就可以得到更好的体现。

不过实战来说,他增加了程序的复杂程度,而且DAO对象的实现工作并不会因此而减少。如果是很小的系统,可以不用DAO,简单的使用JDBC或许也不失一种好方法。当然了,最主要的还是不要因为要用DAO模式而用DAO模式,而是因为DAO模式的确能开来开发的便捷性来采用它,这样才能感受到他的价值。

引用《J2EE体系结构设计》中的一句话

设计模式的优势:

  • 透明性好。业务对象可以在不知道数据源实现细节的情况下访问数据。由于一切数据访问细节被数据访问对象所隐藏,所以这种访问过程是透明的。
  • 可移植性好。在应用系统中添加数据访问对象,可以使得前者能够很方便地移植到另外一种数据库实现上。业务对象与数据实现是隔离的,所以在移植过程中,仅仅对数据访问对象进行一些变化即可。

  • 减少业务对象的代码复杂度。由于数据访问对象可以管理所有的数据访问复杂细节,这也就简化了业务模块和其他数据客户的代码。同时也提高了应用系统的整体可读性和开发率。

  • 集中处理所有数据访问。由于所有的数据访问操作都移交给数据访问对象,这样应用系统其他部分就与数据访问实现隔离开来,而全部相关操作都与数据访问对象集中处理,这样也使得相关操作更加容易被维护和管理。

这种设计模式的缺陷:

  • 对于容器管理的持久性不能利用。如果EJB容器采取容器管理的方式,那么所有对于持久性数据存储的管理都由容器负责。这样的话应用系统就无需实现数据访问对象了,因为应用服务将透明地提供这一功能。

  • 添加了额外的层面。数据访问对象在数据用户和数据源之间添加了一个层面,也就增加了一些额外的设计和实现的负担。当然,我们认为它是物有所值的。

以上评论我认为对于我经历的大部分都是小项目的情况。优点1,2根本对我没有意义,优点3,4和缺点2,是要衡量是否采用DAO的主要解决问题。如果缺点2的相关实现能自动生成,那就好了。

原创粉丝点击