欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java之dao模式詳解及代碼示例

 更新時(shí)間:2017年11月02日 09:46:02   作者:gz153016  
這篇文章主要介紹了Java之dao模式詳解及代碼示例,具有一定參考價(jià)值,需要的朋友可以了解下。

什么是dao模式?

DAO(Data Access Object)顧名思義是一個(gè)為數(shù)據(jù)庫或其他持久化機(jī)制提供了抽象接口的對(duì)象,在不暴露底層持久化方案實(shí)現(xiàn)細(xì)節(jié)的前提下提供了各種數(shù)據(jù)訪問操作。在實(shí)際的開發(fā)中,應(yīng)該將所有對(duì)數(shù)據(jù)源的訪問操作進(jìn)行抽象化后封裝在一個(gè)公共API中。用程序設(shè)計(jì)語言來說,就是建立一個(gè)接口,接口中定義了此應(yīng)用程序中將會(huì)用到的所有事務(wù)方法。在這個(gè)應(yīng)用程序中,當(dāng)需要和數(shù)據(jù)源進(jìn)行交互的時(shí)候則使用這個(gè)接口,并且編寫一個(gè)單獨(dú)的類來實(shí)現(xiàn)這個(gè)接口,在邏輯上該類對(duì)應(yīng)一個(gè)特定的數(shù)據(jù)存儲(chǔ)。DAO模式實(shí)際上包含了兩個(gè)模式,一是Data Accessor(數(shù)據(jù)訪問器),二是Data Object(數(shù)據(jù)對(duì)象),前者要解決如何訪問數(shù)據(jù)的問題,而后者要解決的是如何用對(duì)象封裝數(shù)據(jù)。

一、信息系統(tǒng)的開發(fā)架構(gòu)

客戶層-------顯示層-------業(yè)務(wù)層---------數(shù)據(jù)層---------數(shù)據(jù)庫

1.客戶層:客戶層就是客戶端,簡單的來說就是瀏覽器。
2.顯示層:JSP/Servlet,用于給瀏覽器顯示。
3.業(yè)務(wù)層:對(duì)于數(shù)據(jù)層的原子操作進(jìn)行整合。
4.數(shù)據(jù)層:對(duì)于數(shù)據(jù)庫進(jìn)行的原子操作,增加、刪除等;

二、DAO(Data Access Object)介紹

DAO應(yīng)用在數(shù)據(jù)層那塊(對(duì)于數(shù)據(jù)庫進(jìn)行的原子操作,增加、刪除等;),用于訪問數(shù)據(jù)庫,對(duì)數(shù)據(jù)庫進(jìn)行操作的類。

三、DAO設(shè)計(jì)模式的結(jié)構(gòu)

DAO設(shè)計(jì)模式一般分為幾個(gè)類:

1.VO(Value Object):一個(gè)用于存放網(wǎng)頁的一行數(shù)據(jù)即一條記錄的類,比如網(wǎng)頁要顯示一個(gè)用戶的信息,則這個(gè)類就是用戶的類。
2.DatabaseConnection:用于打開和關(guān)閉數(shù)據(jù)庫。
3.DAO接口:用于聲明對(duì)于數(shù)據(jù)庫的操作。
4.DAOImpl:必須實(shí)現(xiàn)DAO接口,真實(shí)實(shí)現(xiàn)DAO接口的函數(shù),但是不包括數(shù)據(jù)庫的打開和關(guān)閉。
5.DAOProxy:也是實(shí)現(xiàn)DAO接口,但是只需要借助DAOImpl即可,但是包括數(shù)據(jù)庫的打開和關(guān)閉。
6.DAOFactory:工廠類,含有g(shù)etInstance()創(chuàng)建一個(gè)Proxy類。

四、DAO的好處

DAO的好處就是提供給用戶的接口只有DAO的接口,所以如果用戶想添加數(shù)據(jù),只需要調(diào)用create函數(shù)即可,不需要數(shù)據(jù)庫的操作。

五、DAO包命名

對(duì)于DAO,包的命名和類的命名一定要有層次。

1.Emp.Java

package org.vo; 
import java.util.*; 
public class Emp{ 
  private int empno; 
  private String ename; 
  private String job; 
  private Date hireDate; 
  private float sal; 
  public Emp(){ 
  } 
  public int getEmpno(){ 
    return empno; 
  } 
  public void setEmpno(int empno){ 
    this.empno = empno; 
  } 
  public String getEname(){ 
    return ename; 
  } 
  public void setEname(String ename){ 
    this.ename = ename; 
  } 
  public Date getHireDate(){ 
    return hireDate; 
  } 
  public void setHireDate(Date hireDate){ 
    this.hireDate = hireDate; 
  } 
  public float getSal(){ 
    return sal; 
  } 
  public void setSal(float sal){ 
    this.sal = sal; 
  } 
  public String getJob(){ 
    return job; 
  } 
  public void setJob(String job){ 
    this.job = job; 
  } 
} 

2.DatabaseConnection.java

package org.dbc; 
import java.sql.*; 
public class DatabaseConnection{ 
  private Connection con = null; 
  private static final String DRIVER = "com.mysql.jdbc.Driver"; 
  private static final String USER = "root"; 
  private static final String URL = "jdbc:mysql://localhost:3306/mldn"; 
  private static final String PASS = "12345"; 
  public DatabaseConnection()throws Exception{ 
    Class.forName(DRIVER); 
    con = DriverManager.getConnection(URL,USER,PASS); 
  } 
  public Connection getConnection()throws Exception{ 
    return con; 
  } 
  public void close()throws Exception{ 
    if(con!=null){ 
      con.close(); 
    } 
  } 
} 

3.IEmpDAO.java

package org.dao; 
import java.util.List; 
import org.vo.*; 
public interface IEmpDAO{ 
  public boolean doCreate(Emp emp)throws Exception; 
  public List<Emp> findAll()throws Exception; 
  public Emp findById(int empno)throws Exception; 
} 

4.EmpDAOImpl.java

package org.dao.impl; 
import org.dao.*; 
import java.sql.*; 
import org.vo.*; 
import java.util.*; 
public class EmpDAOImpl implements IEmpDAO{ 
  private Connection con; 
  private PreparedStatement stat = null; 
  public EmpDAOImpl(Connection con){ 
    this.con = con; 
  } 
  public boolean doCreate(Emp emp)throws Exception{ 
    String sql = "INSERT INTO emp(empno,ename,job,hiredate,sal) VALUES(?,?,?,?,?)"; 
    stat = con.prepareStatement(sql); 
    stat.setInt(1,emp.getEmpno()); 
    stat.setString(2,emp.getEname()); 
    stat.setString(3,emp.getJob()); 
    stat.setDate(4,new java.sql.Date(emp.getHireDate().getTime())); 
    stat.setFloat(5,emp.getSal()); 
    int update = stat.executeUpdate(); 
    if(update>0){ 
      return true; 
    } 
    else{ 
      return false; 
    } 
  } 
  public List<Emp> findAll()throws Exception{ 
    String sql = "SELECT empno,ename,job,hiredate,sal FROM emp"; 
    stat = con.prepareStatement(sql); 
    ResultSet rs = stat.executeQuery(); 
    Emp emp = null; 
    List<Emp> list = new ArrayList<Emp>(); 
    while(rs.next()){ 
      int empno = rs.getInt(1); 
      String ename = rs.getString(2); 
      String job = rs.getString(3); 
      float sal = rs.getFloat(5); 
      emp = new Emp(); 
      emp.setEmpno(empno); 
      emp.setEname(ename); 
      emp.setJob(job); 
      emp.setHireDate(rs.getDate(4)); 
      emp.setSal(sal); 
      list.add(emp); 
    } 
    return list; 
  } 
  public Emp findById(int empno)throws Exception{ 
    String sql = "SELECT empno,ename,job,hiredate,sal FROM emp WHERE empno=?"; 
    stat = con.prepareStatement(sql); 
    stat.setInt(1,empno); 
    ResultSet rs = stat.executeQuery(); 
    Emp emp = null; 
    if(rs.next()){ 
      String ename = rs.getString(2); 
      String job = rs.getString(3); 
      float sal = rs.getFloat(5); 
      emp = new Emp(); 
      emp.setEmpno(empno); 
      emp.setEname(ename); 
      emp.setJob(job); 
      emp.setHireDate(rs.getDate(4)); 
      emp.setSal(sal); 
    } 
    return emp; 
  } 
} 

5.EmpDAOProxy.java

package org.dao.impl; 
import org.dao.*; 
import java.sql.*; 
import org.vo.*; 
import java.util.*; 
import org.dbc.*; 
public class EmpDAOProxy implements IEmpDAO{ 
  private DatabaseConnection dbc; 
  private IEmpDAO dao = null; 
  public EmpDAOProxy()throws Exception{ 
    dbc = new DatabaseConnection(); 
    dao = new EmpDAOImpl(dbc.getConnection()); 
  } 
  public boolean doCreate(Emp emp)throws Exception{ 
    boolean flag = false; 
    if(dao.findById(emp.getEmpno())==null){ 
      flag = dao.doCreate(emp); 
    } 
    dbc.close(); 
    return flag; 
  } 
  public List<Emp> findAll()throws Exception{ 
    List<Emp>list = dao.findAll(); 
    dbc.close(); 
    return list; 
  } 
  public Emp findById(int empno)throws Exception{ 
    Emp emp = dao.findById(empno); 
    dbc.close(); 
    return emp; 
  } 
} 

6.DAOFactory.java

package org.dao.factory; 
import org.dao.*; 
import java.sql.*; 
import org.vo.*; 
import java.util.*; 
import org.dbc.*; 
import org.dao.impl.*; 
public class DAOFactory{ 
  public static IEmpDAO getInstance(){ 
    IEmpDAO dao = null; 
    try{ 
      dao = new EmpDAOProxy();   
    } 
    catch(Exception e){ 
      e.printStackTrace(); 
    } 
    return dao; 
  } 
} 

7.TestDAO.java

package org.dao.test; 
import org.dao.factory.*; 
import org.vo.*; 
import org.dao.*; 
public class TestDAO{ 
  public static void main(String args[])throws Exception{ 
    Emp emp = null; 
    for(int i=0;i<5;i++){ 
      emp = new Emp(); 
      emp.setEmpno(i); 
      emp.setEname("xiazdong-"+i); 
      emp.setJob("stu-"+i); 
      emp.setHireDate(new java.util.Date()); 
      emp.setSal(500*i); 
      DAOFactory.getInstance().doCreate(emp); 
    } 
  } 
} 

通過DAO設(shè)計(jì)模式,可以在JSP中屏蔽了數(shù)據(jù)庫連接的操作,達(dá)到JSP只負(fù)責(zé)顯示的效果。

//對(duì)應(yīng)
String sql = "INSERT INTO emp_table(ename,job,sal,hiredate) VALUES(?,?,?,?)"; 
    stat = (PreparedStatement) con.prepareStatement(sql); 
    stat.setString(1,emp.getEname()); 
    stat.setString(2,emp.getJob()); 
    stat.setFloat(3,emp.getSal());

總結(jié)

以上就是本文關(guān)于Java之dao模式詳解及代碼示例的全部內(nèi)容,希望對(duì)大家有所幫助,歡迎參閱:Java設(shè)計(jì)模式筆記之抽象工廠代碼示例Java多線程之線程通信生產(chǎn)者消費(fèi)者模式及等待喚醒機(jī)制代碼詳解、Java單例模式實(shí)現(xiàn)靜態(tài)內(nèi)部類方法示例等,有什么問題可以隨時(shí)留言,感謝大家!

相關(guān)文章

  • 圖解Java經(jīng)典算法希爾排序的原理與實(shí)現(xiàn)

    圖解Java經(jīng)典算法希爾排序的原理與實(shí)現(xiàn)

    希爾排序是希爾(Donald Shell)于1959年提出的一種排序算法。希爾排序也是一種插入排序,它是簡單插入排序經(jīng)過改進(jìn)之后的一個(gè)更高效的版本,也稱為縮小增量排序,同時(shí)該算法是沖破O(n2)的第一批算法之一。本文會(huì)以圖解的方式詳細(xì)介紹希爾排序的基本思想及其代碼實(shí)現(xiàn)
    2022-09-09
  • JavaSE實(shí)戰(zhàn)之酒店訂房系統(tǒng)的實(shí)現(xiàn)

    JavaSE實(shí)戰(zhàn)之酒店訂房系統(tǒng)的實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了如何利用JavaSE實(shí)現(xiàn)酒店訂房系統(tǒng),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)JavaSE開發(fā)有一定的幫助,需要的可以參考一下
    2022-07-07
  • Java如何實(shí)現(xiàn)樹的同構(gòu)?

    Java如何實(shí)現(xiàn)樹的同構(gòu)?

    今天給大家?guī)淼氖顷P(guān)于Java的相關(guān)知識(shí),文章圍繞著Java如何實(shí)現(xiàn)樹的同構(gòu)展開,文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Spring?AOPr如何打通兩個(gè)切面之間的通信

    Spring?AOPr如何打通兩個(gè)切面之間的通信

    本文主要介紹了Spring?AOPr如何打通兩個(gè)切面之間的通信,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-03-03
  • Java OCR tesseract 圖像智能文字字符識(shí)別技術(shù)實(shí)例代碼

    Java OCR tesseract 圖像智能文字字符識(shí)別技術(shù)實(shí)例代碼

    這篇文章主要介紹了Java OCR tesseract 圖像智能文字字符識(shí)別技術(shù)實(shí)例代碼,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-06-06
  • Kafka中消息隊(duì)列的兩種模式講解

    Kafka中消息隊(duì)列的兩種模式講解

    這篇文章主要介紹了Kafka中消息隊(duì)列的兩種模式講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • Jmeter跨線程組共享cookie過程圖解

    Jmeter跨線程組共享cookie過程圖解

    這篇文章主要介紹了Jmeter跨線程組共享cookie過程圖解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-07-07
  • Mybatis流式查詢之ResultHanlde問題

    Mybatis流式查詢之ResultHanlde問題

    這篇文章主要介紹了Mybatis流式查詢之ResultHanlde問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-08-08
  • Spring之spring-context-indexer依賴詳解

    Spring之spring-context-indexer依賴詳解

    這篇文章主要介紹了Spring之spring-context-indexer依賴詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • springboot讀取application.yaml文件數(shù)據(jù)的方法

    springboot讀取application.yaml文件數(shù)據(jù)的方法

    這篇文章主要為大家詳細(xì)介紹了springboot讀取application.yaml文件數(shù)據(jù)的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-07-07

最新評(píng)論