Java DAO是啥?

DAO(Data Access Object)顾名思义是一个为数据库或其他持久化机制提供了抽象接口的对象,在不暴露底层持久化方案实现细节的前提下提供了各种数据访问操作。

在实际的开发中,应该将所有对数据源的访问操作进行抽象化后封装在一个公共API中。

   用程序设计语言来说,就是建立一个接口,接口中定义了此应用程序中将会用到的所有事务方法。在这个应用程序中,当需要和数据源进行交互的时候则使用这个接口,并且编写一个单独的类来实现这个接口,在逻辑上该类对应一个特定的数据存储。

DAO模式实际上包含了两个模式,

一是Data Accessor(数据访问器),解决如何访问数据的问题

二是Data Object(数据对象),解决如何用对象封装数据。


实例:
DAO层使应用程序更加容易地迁移到一个不同的数据库实现。业务对象不了解低层数据实现。因而,该迁移只涉及对DAO层的变化。更进一步说,如果使用工厂策略,则有可能为每一个低层存储实现提供一个具体工厂实现。在这种情况下,迁移到不同的迁移实现意味着给应用程序提供一个新的工厂实现。 同时,抽象DAO工厂可以指定需要创建的实例DAO,并交由不同的具体DAO工厂去创建。


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, userNameuserPwd);
       }  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 = SqlServerDAOFactory. 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);
    }
}

转载自:http://blog.csdn.net/classicbear/article/details/7086654

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值