簡單的DAO設計模式
這兩天學習到了DAO(Data Access Object 數據存取對象)設計模式。想談談自己的感受,剛開始接觸是感覺有點難,覺得自己邏輯理不清,主要是以前學的知識比較零散沒有很好的把它們結合起來運用。我個人比較喜歡有挑戰的東西,比如項目,在學iOS階段做了個項目感覺那段時間自己的思維和邏輯提升很快。我個人認為遇到困難不要怕,而應該感到高興,因為只有遇到了困難才知道自己的不足,當困難解決的時候你必定會收獲不少,困難解決時一陣欣喜必會涌上心頭。也許是很久沒遇到邏輯性很強的東西了,所以剛接觸到DAO模式感覺還是有點懵,但是當我花時間好好梳理的時候,其實發現也並沒有想象的那么難,雖然也遇到了困難,但是困難解決時感覺一陣欣喜涌上心頭。DAO模式主要是分層原理,主要有數據庫訪問層、DAO層(主要是轉換器的作用)、服務層、客戶層(用戶的操作等功能);每一層各司其職互不干涉,當維護或者新增功能時會比較方便,不需要更改很多的代碼,只需要實現公共的接口方法,如果需要實現特有的方法,就定義一個接口繼承公共的接口在里面定義特有的方法然后實現即可。這是我個人對DAO模式的理解,如果有不恰當的地方希望大神不要噴,希望多指教。
下面是簡單DAO模式的代碼
定義一個公共的接口實現增、刪、改
public interface BaseDao { public int executeUpdate(String sql,Object[] prame); }
定義一個用戶類,里面實現了封裝,會了序列化,還實現了Serializable接口,這是一個特殊的接口,里面沒有方法,只是標記作用,在數據庫建表就靠自己了。

public class master implements Serializable { /** * */ private static final long serialVersionUID = 1L; private int id; private String loginid; private String passWord; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getLoginid() { return loginid; } public void setLoginid(String loginid) { this.loginid = loginid; } public String getPassWord() { return passWord; } public void setPassWord(String passWord) { this.passWord = passWord; } }
用戶特有的方法:只實現了登錄功能用到查找的方法,其他沒實現,所以上面的接口方法並沒有用到,只是為了更好的理解而已
public interface MaterDao { /** * 根據對象進行查詢*/ public master findMaster(master master); }
服務層的公共接口類對它的實現
public interface MasterServer { //用於訪問Dao的實現類 public boolean login(master ma); }

public class MasterServerImpl implements MasterServer{ @Override public boolean login(master ma) { boolean isLoginid=false; MaterDao md=new MasterDaoMysqlImpl(); master ma2=md.findMaster(ma); // System.out.println(ma2); if(null!=ma2){ isLoginid=true; } return isLoginid; } }
訪問數據庫的幫助類,里面實現了訪問數據庫和關閉

public class Dbutils { //幫助類 private static String driverClass="com.mysql.jdbc.Driver"; private static String url="jdbc:mysql:///day02"; private static String user="root"; private static String password="root"; static{ //加載驅動 try { Class.forName(driverClass); } catch (ClassNotFoundException e) { e.printStackTrace(); } } //獲得connection對象 public static Connection getConn() throws SQLException{ return DriverManager.getConnection(url, user, password); } //關閉資源 public static void closeAll(ResultSet rs,Statement stmt,Connection conn){ if(null!=rs){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if(null!=stmt){ try { stmt.close(); } catch (SQLException e) { e.printStackTrace(); } } if(null!=conn){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
用戶DAO的實現,主要是訪問數據庫

public class MasterDaoMysqlImpl extends BaseDaoImpl implements MaterDao{ @Override public master findMaster(master master) { Connection conn=null; PreparedStatement pstmt=null; ResultSet rs=null; master ma2=null; String sql="SELECT * FROM master WHERE loginid=? AND passWord=?"; try { conn=Dbutils.getConn(); pstmt=conn.prepareStatement(sql); pstmt.setString(1,master.getLoginid()); pstmt.setString(2,master.getPassWord()); rs=pstmt.executeQuery(); if(rs.next()){ ma2=new master(); ma2.setId(rs.getInt("id")); ma2.setLoginid(rs.getString("loginid")); ma2.setPassWord(rs.getString("passWord")); } } catch (SQLException e) { e.printStackTrace(); }finally{ Dbutils.closeAll(rs, pstmt, conn); } return ma2; } }
最后就可以實現用戶的登錄功能,用一個測試類

public class TestMaster { @Test public void testLoginid(){ Scanner scanner = new Scanner(System.in,"UTF-8"); // 1.輸入用戶名 System.out.println("請輸入用戶名:"); String loginid = scanner.next(); // 2.輸入密碼 System.out.println("請輸入密碼:"); String password = scanner.next(); MasterServer ms=new MasterServerImpl(); master ma=new master(); ma.setLoginid(loginid); ma.setPassWord(password); boolean isLoginid=ms.login(ma); if(isLoginid){ System.out.println("登錄成功!"); }else{ System.out.println("賬號或密碼錯誤!"); } } }
這只是本人這兩天對DAO模式的理解,其實理解並不深刻,希望大家多多指教。