為了降低耦合性,提出了DAO封裝數據庫操作的設計模式。
它可以實現業務邏輯與數據庫訪問相分離。相對來說,數據庫是比較穩定的,其中DAO組件依賴於數據庫系統,提供數據庫訪問的接口。
一般的DAO的封裝由以下另個原則:
- 一個表對應一個表,相應地封裝一個DAO類。
- 對於DAO接口,必須由具體的類型定義。這樣可以避免被錯誤地調用。
在DAO模式中,將對數據的持久化抽取到DAO層,暴露出Service層讓程序員使用,這樣,一方面避免了業務代碼中混雜JDBC調用語句,使得業務落實實現更加清晰。
通常我們創建一個包,用於保存DAO接口,再創建一個包,用於保存DAO接口的實現類即可。
下面展示一個DAO接口實例Manage:
public interface Manage { /*插入(insert)操作--->方法名(插入的數據1,插入的數據2,……)-->返回T|F*/ public boolean insert(String name,String classes,String score); /*獲取全表(select *)操作-->利用Bean,一行對應一個Bean-->返回一個承載Bean的Collection*/ public Collection select(); /*刪除(delete)操作-->方法名(where處需要的數據)--->返回T|F*/ public boolean delete(String id); /*獲取指定行對象---->方法名(where處需要的數據)---->返回一個承載Bean的List*/ public List up_select(String id); /*修改指定行對象---->方法名(修改數據1,修改數據2,……,where處需要的數據)---->返回T|F*/ public boolean update(String name,String classes,String id); }
下面我們針對一張具體的表對Manage創建實現類,比如表名為test,數據庫名為bean。
public class ManageInfo implements Manage { final private String url="jdbc:mysql://localhost:3306/bean"; final private String user="root"; final private String password="root"; @Override public boolean insert(String name, String classes, String score) throws Exception { Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection(url, user, password); String sql="insert into test(name,classes,score) Values(?,?,?)"; PreparedStatement st=conn.prepareStatement(sql); st.setString(1,name); st.setString(2,classes); st.setString(3,score); int count=st.executeUpdate(); if(count<=1){ return true; }else { return false; } }
其余實現近乎相同,若返回Bean類型的Collection,則從ResultSet里讀取出每一行的數據。
將一行的數據,存入一個Java Bean中(為Bean 創建對應類型的成員變量),並將Set好的Bean存入Add入Collection。
再讀取下一行的數據,重復操作,最后返回Collection即可。