一、Dao設計思想及其優勢
Dao(Data Access Object)是一種數據訪問對象,屬於Java EE中的設計模式之一。Dao基本上是把數據訪問邏輯與業務邏輯分離開來。其本質是對業務邏輯的解耦,將底層數據庫的訪問與業務邏輯分離,從而實現了對這兩者之間的解耦。
優點:(1)將業務邏輯和數據訪問邏輯分離開來。使得業務邏輯層可以獨立於數據訪問層的變化而變化;(2)在Dao中可以使用一些特殊技術來提高數據訪問性能,如連接池、緩存等;(3)提高代碼的可讀性和可維護性,便於定義和使用數據訪問接口。
二、Dao設計模式的常見實現方式
Dao設計模式的實現方式主要有兩種:
1、基於實現的Dao設計模式。其實現方式是直接實現Dao接口,包括實現Dao接口的所有方法,並且在具體業務邏輯代碼中使用實現類來進行持久化操作。這種方式不利於代碼的維護,因為在業務需求變更時Dao接口和實現類都需要改變。
public interface UserDao {
List findAll();
User findById(Long id);
void save(User user);
void update(User user);
void delete(User user);
}
public class UserDaoImpl implements UserDao {
public void save(User user) {
//具體的實現
}
//其他方法的具體實現
}
2、基於代理的Dao設計模式。其實現方式是使用動態代理技術來生成Dao實現類,代碼可讀性高,具有良好的拓展性。該方式能夠將Dao的實現詳細信息封裝起來,隱藏了Dao的具體實現,不需要為每個Dao接口寫相應的實現類,同時在應用的運行階段動態生成Dao的實現類,使得Dao具有很好的靈活性。因此,本文主要介紹基於代理的Dao設計模式。
三、基於代理的Dao設計模式核心代碼實現
1、首先定義數據訪問對象的接口,包含了對於數據的增刪改查方法的抽象聲明。然後使用動態代理技術,在程序運行時生成該接口的代理類。
public interface UserDao {
List findAll();
User findById(Long id);
void save(User user);
void update(User user);
void delete(User user);
}
public class UserDaoProxyHandler implements InvocationHandler {
//通過構造器傳入真正要代理的對象
public UserDaoProxyHandler(Object obj) {
this.obj = obj;
}
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object result = null;
//在代理對象的方法中,調用真正的方法
result = method.invoke(obj, args);
return result;
}
//真正要代理的對象
private final Object obj;
}
public class DaoFactory {
public static Object createDaoProxy(Object obj) {
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(), new UserDaoProxyHandler(obj));
}
}
2、接下來,我們定義具體訪問數據的方法DaoImpl,它實現了上面定義的Dao接口,並根據具體情況去實現具體數據庫的SQL操作。
public class UserDaoImpl implements UserDao {
public List findAll() {
List list = new ArrayList();
Connection conn = null;
PreparedStatement psmt = null;
ResultSet rs = null;
try {
conn = getConnection();
String sql = "select * from user";
psmt = conn.prepareStatement(sql);
rs = psmt.executeQuery();
while (rs.next()) {
User user = new User();
user.setId(rs.getLong("id"));
user.setUsername(rs.getString("username"));
user.setPassword(rs.getString("password"));
list.add(user);
}
} catch (SQLException e) {
e.printStackTrace();
} finally {
closeAll(conn, psmt, rs);
}
return list;
}
//其他方法的具體實現
}
四、總結
基於Dao設計模式的高效數據訪問解決方案,旨在將業務邏輯與數據訪問邏輯分離,實現了對這兩者之間的解耦。本文主要闡述了Dao設計模式的實現方式,包括基於實現和基於代理兩種方式,並詳細介紹了基於代理的Dao設計模式的核心代碼實現。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/182130.html
微信掃一掃
支付寶掃一掃