DAO-數據訪問對象(Data Access Object) 模式

業務對象只應該關注業務邏輯,不該該關心數據存取的細節。數據訪問對象必須實現特定的持久化策略(如,基於JDBC或Hibernate的持久化邏輯), 這樣就抽出來了 DAO 層,做爲數據源層,而之上的 Domain Model 層與之通信而已,若是將那些實現了數據訪問操做的全部細節都放入高層 Domain model( 領域模型 ) 的話,系統的結構必定層次上來講就變得有些混亂。低級別的數據訪問邏輯與高級別的業務邏輯分離,用一個 DAO 接口隱藏持久化操做的細節,這樣使用的最終目的就是讓業務對象無需知道底層的持久化技術知識,這是標準 j2ee 設計模式之一。
 
1.       DAO 模式使用環境
具體類圖以下。
參與者和職責
1)      BusinessObject( 業務對象 )
表明數據客戶端。正是該對象須要訪問數據源以獲取和存儲數據。
2)      DataAccessObject( 數據訪問對象 )
是該模式的主要對象。 DataAccessObject 抽取該 BusinessObject 的低層數據訪問實現,以保證對數據源的透明訪問。 BusinessObject 也能夠把數據加載和存儲操做委託給 DataAccessObject
3)      DataSource( 數據源 )
表明數據源實現。數據源能夠是各 RDBMSR 數據庫, OODBMS,XML 文件等等。
4)      ValueObject( 值對象 )
表明用作數據攜帶着的值對象。 DataAccessObject 可使用值對象來把數據返回給客戶端。
DataAccessObject 也許會接受來自於客戶端的數據,其中這些用於更新數據源的數據存放於值對象中來傳遞。
 
2. 數據訪問對象的工廠策略
經過調整抽象工廠和工廠方法模式, DAO 模式能夠達到很高的靈活度。具體類圖以下。
DAO 層使應用程序更加容易地遷移到一個不一樣的數據庫實現。業務對象不瞭解低層數據實現。於是,該遷移只涉及對 DAO 層的變化。更進一步說,若是使用工廠策略,則有可能爲每個低層存儲實現提供一個具體工廠實現。在這種狀況下,遷移到不一樣的遷移實現意味着給應用程序提供一個新的工廠實現。
同時,抽象 DAO 工廠能夠指定須要建立的實例 DAO ,並交由不一樣的具體 DAO 工廠去建立。
 
3.DAO 代碼實例(工程代碼見附件)
一個典型的 DAO 組成: DAO 工廠類, DAO 接口,實現 DAO 接口的具體類 ( 每一個 DAO 實例負責一個主要域對象或實體 ) VO Value Object )。
VO Student 類,將全部關於持久化的操做納入 StudentDAO 類中。
Student.java
public class Student {
    private String id ;
    private String name ;
    private String cardId ;
    private int age ;
 
    getter/setter() 。。。
}
StudentDAO.java
public interface StudentDAO {
    public boolean insertStudent(Student student);
    public boolean deleteStudent( int id);
    public Student findStudent( int id);
}
抽象 DAO 工廠 DAOFactory 指定了可能的具體 DAO 工廠,並指定須要建立的具體 DAO
DAOFactory.java
public abstract class DAOFactory {
    // List of DAO types supported by the factory
    public static final int SQLSERVER = 1;
    public static final int MYSQL = 2;
    // There will be a method for each DAO that can be
    // created. The concrete factories will have to
    // implement these methods.
    public abstract StudentDAO getStudentDAO();
 
    public static DAOFactory getDAOFactory( int whichFactory) {
       switch (whichFactory) {
       case SQLSERVER :
           return new SqlServerDAOFactory();
       case MYSQL :
           return new MySqlDAOFactory();
       default :
           return null ;
       }
    }
}
這裏提供兩個具體 DAO 工廠, SqlServerDAOFactory MySqlDAOFactory 。提供它們來獲得具體的 DAO 實現。
SqlServerDAOFactory.java
public class SqlServerDAOFactory extends DAOFactory{
    public static final String DRIVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver" ;
    public static final String DBURL = "jdbc:sqlserver://localhost:1025; DatabaseName=tmp" ;
    private static String userName = "sa" ;
    private static String userPwd = "root" ;
 
    public static Connection createConnection() {
       Connection dbConn = null ;
       try {
           Class.forName( DRIVER );
           dbConn = DriverManager.getConnection( DBURL , userName , userPwd );
       } catch (ClassNotFoundException e) {
           e.printStackTrace();
       } catch (SQLException e) {
           e.printStackTrace();
       }
       return dbConn;
    }
 
    public StudentDAO getStudentDAO() {
       return new SqlServerStudentDAO(createConnection());
    }
 
    。。。。。。
}
MySqlDAOFactory.java
這裏提供一個缺省的 StudentDAO 實現 StudentDAODefaultImpl 它依據特定的 Connection ,來實現數據庫相關操做。
StudentDAODefaultImpl.java
public abstract class StudentDAODefaultImpl implements StudentDAO {
    private Connection dbConn ;
 
    public StudentDAODefaultImpl(Connection dbConn) {
       this . dbConn = dbConn;
    }
 
    public boolean deleteStudent( int id) {
       Statement stmt;
       try {
           stmt = dbConn .createStatement();
           String sql = "DELETE FROM student_table WHERE id = '" + id + "'" ;
           int delete = stmt.executeUpdate(sql);
           if (delete == 1)
              return true ;
       } catch (SQLException e) {
           e.printStackTrace();
       }
       return false ;
    }
 
    public Student findStudent( int id) { 。。。 }
    public boolean insertStudent(Student stu) { 。。。 }
}
兩個特定的 DAO 類分別從兩個具體 DAO 工廠, SqlServerDAOFactory MySqlDAOFactory 中獲得鏈接對象。
SqlServerStudentDAO.java
public class SqlServerStudentDAO extends StudentDAODefaultImpl {
    private Connection dbConn = SqlServer DAOFactory.createConnection();
   
    public SqlServerStudentDAO(Connection dbConn) {
       super (dbConn);
    }
 
    public Connection getDbConn() {
       return dbConn ;
    }
}
MySqlStudentDAO.java
測試類 Test.java
public class Test {
    public static void main(String[] args) {
       Student student = new Student( "1" , "zj" , "0901" , 27);
       DAOFactory mysqlDAOFactory = DAOFactory.getDAOFactory(DAOFactory. MYSQL );
       StudentDAO studentDAO = mysqlDAOFactory.getStudentDAO();
       studentDAO.insertStudent(student);
    }
}
4. 參考
[2] 所使用的數據庫表見 Java鏈接SqlServer2005MySQL5
相關文章
相關標籤/搜索