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,
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 = 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.youkuaiyun.com/classicbear/article/details/7086654