DAO設計模式,dao設計
DAO設計模式
DAO設計模式簡介: DAO設計模式可以減少代碼量,增強程式的可移植性,提高代碼的可讀性。
DAO(資料庫操作對象)設計模式是 JavaEE 資料層的操作.主要由五部分組成:
1.資料庫連接類:串連資料庫並擷取連線物件。
2.VO實體類:包含屬性和表中欄位完全對應的類。
3.DAO介面:提供了使用者所有的操作方法(就如老師給學生提供一些學習方法)。
4.DAO實作類別:實現DAO中所有的方法(就如老師給提供的方法看你如何去完成)。
5.DAO工廠類:為程式提供方法,如果要替換DAO實作類別,只需要修改該Dao工廠類中的方法代碼,
而不必邀修改所有的操作資料庫代碼(如代理人專門為需要的公司提供人才,也叫做服務層)。
下面以一個使用者登入狀態例:
1.資料庫建表:
2.資料庫連接類 com.util(記得匯入c3p0架構套件)
package com.util;import java.sql.Connection;import java.sql.ResultSet;import java.sql.Statement;import javax.sql.DataSource;import com.mchange.v2.c3p0.ComboPooledDataSource;public class C3P0Util { // C3P0資料來源 private static ComboPooledDataSource dataSource = new ComboPooledDataSource(); public static DataSource getDataSource() { return dataSource; } public static Connection getConn() { Connection conne = null; try { conne = dataSource.getConnection(); } catch (Exception e) { e.printStackTrace(); } return conne; } // 關閉資源 public static void closeAll(ResultSet rs, Statement st, Connection conne) { try { if (null != rs) { rs.close(); } } catch (Exception e) { e.printStackTrace(); } try { if (null != st) { st.close(); } } catch (Exception e) { e.printStackTrace(); } try { if (conne != null) { conne.close(); } } catch (Exception e) { e.printStackTrace(); } }}
3.VO實體類 com.entity
package com.entity;import java.io.Serializable;public class Person implements Serializable { private static final long serialVersionUID = 1L; private int id; private String name; private String password; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; }}
4.DAO介面類 com.dao
package com.dao;import com.entity.Person;public interface PersonDao { //根據物件查詢 public Person findMaster(Person person);}
5.DAO實作類別 com.daoImpl
package com.daoImpl;import java.sql.Connection;import java.sql.PreparedStatement;import java.sql.ResultSet;import com.dao.PersonDao;import com.entity.Person;import com.util.C3P0Util;public class PersonDaoImpl implements PersonDao { @Override public Person findMaster(Person person) { Connection conne = null; PreparedStatement pstmt = null; ResultSet rs = null; Person person2 = null; String sql = "SELECT * FROM person WHERE name = ? AND password = ?"; try { conne = C3P0Util.getConn(); // 建立了到特定資料庫的串連之後,就可用該串連發送 SQL 陳述式。 pstmt = conne.prepareStatement(sql); pstmt.setString(1, person.getName()); pstmt.setString(2, person.getPassword()); rs = pstmt.executeQuery(); if (rs.next()) { person2 = new Person(); person2.setId(rs.getInt("id")); person2.setName(rs.getString("name")); person2.setPassword(rs.getString("password")); } } catch (Exception e) { e.printStackTrace(); } finally { C3P0Util.closeAll(rs, pstmt, conne); } return person2; }}
6.DAO工廠介面 com.service
package com.service;import com.entity.Person;public interface PersonService { public boolean login (Person person);}
7.DAO工廠實作類別 com.serviceImpl
package com.serviceImpl;import com.dao.PersonDao;import com.daoImpl.PersonDaoImpl;import com.entity.Person;import com.service.PersonService;public class PersonServiceImpl implements PersonService { @Override public boolean login(Person person) { boolean islogin = false; PersonDao pd = new PersonDaoImpl(); Person ps2 = pd.findMaster(person); if (null != ps2) { islogin = true; } return islogin; }}
8.測試
package com.test;import java.util.Scanner;import org.junit.Test;import com.entity.Person;import com.service.PersonService;import com.serviceImpl.PersonServiceImpl;public class LoginTest { @Test public void loginTest() { Scanner sc = new Scanner(System.in, "UTF-8"); System.out.println("請輸入使用者名稱"); String loginName = sc.next(); System.out.println("請輸入密碼"); String loginPassword = sc.next(); Person person = new Person(); person.setName(loginName); person.setPassword(loginPassword); PersonService ps = new PersonServiceImpl(); boolean isLoginid = ps.login(person); if (isLoginid) { System.out.println("登入成功"); } else { System.out.println("使用者名稱或密碼錯誤"); } }}
運行結果如下: