最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MVC+DAO設(shè)計(jì)模式下的設(shè)計(jì)流程詳解

 更新時(shí)間:2017年11月02日 10:19:15   作者:曉風(fēng)well  
這篇文章主要介紹了MVC+DAO設(shè)計(jì)模式下的設(shè)計(jì)流程詳解,分別介紹了數(shù)據(jù)庫(kù)設(shè)計(jì)、設(shè)計(jì)符合java bean標(biāo)準(zhǔn)的entity類(lèi)、設(shè)計(jì)訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的DAO接口等內(nèi)容,具有一定參考價(jià)值,需要的朋友可以了解下。

DAO設(shè)計(jì) :

     DAO層主要是做數(shù)據(jù)持久層的工作,負(fù)責(zé)與數(shù)據(jù)庫(kù)進(jìn)行聯(lián)絡(luò)的一些任務(wù)都封裝在此,DAO層的設(shè)計(jì)首先是設(shè)計(jì)DAO的接口,然后在Spring的配置文件中定義此接口的實(shí)現(xiàn)類(lèi),然后就可在模塊中調(diào)用此接口來(lái)進(jìn)行數(shù)據(jù)業(yè)務(wù)的處理,而不用關(guān)心此接口的具體實(shí)現(xiàn)類(lèi)是哪個(gè)類(lèi),顯得結(jié)構(gòu)非常清晰,DAO層的數(shù)據(jù)源配置,以及有關(guān)數(shù)據(jù)庫(kù)連接的參數(shù)都在Spring的配置文件中進(jìn)行配置。

    在該層主要完成對(duì)象-關(guān)系映射的建立,通過(guò)這個(gè)映射,再通過(guò)訪(fǎng)問(wèn)業(yè)務(wù)對(duì)象即可實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)的訪(fǎng)問(wèn),使得開(kāi)發(fā)中不必再用SQL語(yǔ)句編寫(xiě)復(fù)雜的數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)程序,這樣就簡(jiǎn)化了對(duì)數(shù)據(jù)庫(kù)的訪(fǎng)問(wèn),提高了開(kāi)發(fā)效率。同時(shí)通過(guò)對(duì)象-關(guān)系映射的配置,可以建立業(yè)務(wù)對(duì)象之間的復(fù)雜關(guān)系,如一對(duì)多、多對(duì)一、一對(duì)一、多對(duì)多等關(guān)系。這樣就不再需要在數(shù)據(jù)庫(kù)中建立表之間的復(fù)雜聯(lián)系,使得業(yè)務(wù)對(duì)象之間的關(guān)系和數(shù)據(jù)庫(kù)相分離,簡(jiǎn)化了數(shù)據(jù)庫(kù)的建立和維護(hù)。在這一層中主要使用Hibernate框架來(lái)實(shí)現(xiàn)。

       針對(duì)以上問(wèn)題,產(chǎn)生了基于MVC模式Model層的DAO模式(Data Access Object),主要由工廠(chǎng)類(lèi)(Factory)、代理類(lèi)(Proxy)、實(shí)現(xiàn)類(lèi)(DAOImpl)、DAO接口和值對(duì)象類(lèi)(VO)以及數(shù)據(jù)庫(kù)連接類(lèi)組成。

這里總結(jié)一下MVC+DAO的設(shè)計(jì)流程。通過(guò)MVC+DAO的設(shè)計(jì)模式,可以使項(xiàng)目在設(shè)計(jì)過(guò)程中結(jié)構(gòu)更為明晰,并且能夠方便的進(jìn)行修改。MVC是一個(gè)分層模型,即模型、視圖、控制器。DAO是一個(gè)數(shù)據(jù)庫(kù)訪(fǎng)問(wèn)模型,隔離數(shù)據(jù)庫(kù)操作。

環(huán)境說(shuō)明:

數(shù)據(jù)庫(kù):mysql

開(kāi)發(fā)語(yǔ)言:JSP + Servlet + Java

服務(wù)器:tomcat 7.x

包規(guī)劃:

entity 放置與數(shù)據(jù)庫(kù)中的表相對(duì)應(yīng)的實(shí)體類(lèi)
dao 放置DAO設(shè)計(jì)模式下實(shí)現(xiàn)訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的接口
dao.impl 放置DAO對(duì)應(yīng)的接口實(shí)現(xiàn)類(lèi)
servlet 放置Servlet

util 工具包

設(shè)計(jì)流程綜述:

0.設(shè)計(jì)數(shù)據(jù)庫(kù)以及視圖頁(yè)面(VIEW)
1.設(shè)計(jì)數(shù)據(jù)庫(kù)的工具類(lèi)
2.設(shè)計(jì)符合java bean標(biāo)準(zhǔn)的entity類(lèi) (MODEL)
3.設(shè)計(jì)訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的DAO接口
4.設(shè)計(jì)實(shí)現(xiàn)DAO接口的實(shí)現(xiàn)類(lèi)
5.創(chuàng)建Servlet響應(yīng)請(qǐng)求(CONTROLLER)

例子:以一個(gè)簡(jiǎn)單的登錄頁(yè)面設(shè)計(jì)為例

0.設(shè)計(jì)數(shù)據(jù)庫(kù)以及視圖頁(yè)面

數(shù)據(jù)庫(kù)設(shè)計(jì):

CREATE TABLE `NewTable` ( 
`id` int(10) UNSIGNED ZEROFILL NOT NULL AUTO_INCREMENT , 
`name` varchar(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL , 
`password` varchar(10) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL , 
PRIMARY KEY (`id`) 
) 

頁(yè)面視圖:

index.jsp的核心代碼如下:

<form action="/iMath/servlet/AdminServlet?method=login" method="post"> 
  <table border='1' align="center"> 
    <caption>USER LOGIN</caption> 
    <tr> 
      <th>username</th> 
      <th><input type="text" name="username" /></th> 
    </tr> 
    <tr> 
      <th>password</th> 
      <th><input type="password" name="password" /></th> 
    </tr> 
    <tr> 
      <td colspan="2" align="center"><input type="submit" value="submit" /></td> 
    </tr> 
  </table> 
</form> 

核心代碼就是一個(gè)form表單,用于提供視圖,為用戶(hù)提供輸入的接口。核心是指定action和method屬性。這應(yīng)該是最簡(jiǎn)單的一步,下面的工作則進(jìn)入真正的代碼編寫(xiě)階段。

轉(zhuǎn)發(fā)頁(yè)面:

message.jsp核心代碼如下:其實(shí)就句話(huà)

<body> 
 ${message} 
</body> 

1.設(shè)計(jì)數(shù)據(jù)庫(kù)的工具類(lèi)

這步的操作應(yīng)該是大同小異的,目的只是抽取公共代碼,簡(jiǎn)化程序流程。

dbConfig.properties 文件存放數(shù)據(jù)庫(kù)的配置文件,這么做的優(yōu)點(diǎn)的是可以項(xiàng)目編譯后也能方便的修改數(shù)據(jù)庫(kù)配置的相關(guān)信息。

driver = com.mysql.jdbc.Driver 
url = jdbc:mysql://127.0.0.1:3306/imath?useUnicode=true&characterEncoding=utf-8 
user = root 
password =1234 

DBUtil類(lèi)設(shè)計(jì):該類(lèi)用實(shí)現(xiàn)建立數(shù)據(jù)庫(kù)連接和關(guān)閉數(shù)據(jù)庫(kù)連接的公共操作。

代碼如下:

package cn.imath.util; 
import java.io.InputStream; 
import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.sql.Statement; 
import java.util.Properties; 
public final class DBUtil { 
  private static String driver;  
  private static String url;  
  private static String user;  
  private static String password;  
  /** 
   * load the property file 
   */ 
  static{ 
    Properties props = new Properties();  
    //get the class loader 
    InputStream is = DBUtil.class.getClassLoader().getResourceAsStream("cn/imath/util/dbConfig.properties");  
    try {  
      props.load(is);  
    } catch (Exception e) {  
      e.printStackTrace();  
    }  
    driver = props.getProperty("driver");  
    url = props.getProperty("url");  
    user = props.getProperty("user");  
    password = props.getProperty("password"); 
  } 
  /** 
   * register the driver 
   */ 
  static{ 
    try { 
      Class.forName(driver); 
    } catch (ClassNotFoundException e) { 
      e.printStackTrace(); 
    } 
  } 
  /** 
   * OPEN THE DATABASE CONNECTION 
   * @return 
   */ 
  public static Connection getConn(){ 
    Connection conn = null; 
    try { 
      conn = DriverManager.getConnection(url, user, password); 
    } catch (SQLException e) { 
      e.printStackTrace(); 
    } 
    return conn; 
  } 
  /** 
   * CLOSE THE DATABASE CONNECTION 
   * @param rs 
   */ 
  public static void closeAll(ResultSet rs,Statement stmt,Connection conn){ 
    close(rs); 
    close(stmt); 
    close(conn); 
  } 
  public static void close(ResultSet rs){ 
    if(rs!=null){ 
      try { 
        rs.close(); 
      } catch (SQLException e) { 
        e.printStackTrace(); 
      } 
    } 
  } 
  public static void close(Statement stmt){ 
    if(stmt!=null){ 
      try { 
        stmt.close(); 
      } catch (Exception e) { 
        e.printStackTrace(); 
      } 
    } 
  } 
  public static void close(Connection conn){ 
    if(conn!=null){ 
      try { 
        conn.close(); 
      } catch (Exception e) { 
        e.printStackTrace(); 
      } 
    } 
  } 
} 

這里要注意的是:導(dǎo)入的包均為java.sql包。這里建立了兩個(gè)核心方法,后面會(huì)經(jīng)常用到 getConn() 和 closeAll()方法,分別用于取得數(shù)據(jù)庫(kù)連接和關(guān)閉數(shù)據(jù)庫(kù)連接。

2.設(shè)計(jì)符合java bean標(biāo)準(zhǔn)的entity類(lèi)

這里的entity類(lèi)對(duì)應(yīng)于上面的admin表。因此設(shè)計(jì)Admin類(lèi)如下:

package cn.imath.entity; 
public class Admin { 
  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; 
  } 
} 

entity類(lèi)的設(shè)計(jì)是為了實(shí)現(xiàn)對(duì)數(shù)據(jù)的封裝,只要對(duì)照數(shù)據(jù)庫(kù)設(shè)計(jì)來(lái)就行,然后最好符合java bean的設(shè)計(jì)標(biāo)準(zhǔn),用getter/setter實(shí)現(xiàn)訪(fǎng)問(wèn)。

3.設(shè)計(jì)訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)的DAO接口

dao接口的設(shè)計(jì)非常簡(jiǎn)單,目的是為后面的具體的業(yè)務(wù)方法提供一個(gè)模版。

AdminDao接口如下:

package cn.imath.dao; 
import cn.imath.entity.Admin; 
public interface AdminDao { 
  /** 
   * LOGIN METHOD 
   * @param username 
   * @param password 
   * @return INSTANCE OF Admin 
   */ 
  public Admin login(String username,String password); 
} 

4.設(shè)計(jì)實(shí)現(xiàn)DAO接口的實(shí)現(xiàn)類(lèi)

接下來(lái)設(shè)計(jì)上面DAO接口的實(shí)現(xiàn)類(lèi),用于實(shí)現(xiàn)具體的業(yè)務(wù)。這里就能體現(xiàn)上面模版的作用。

package cn.imath.dao.impl; 
import java.sql.Connection; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import cn.imath.dao.AdminDao; 
import cn.imath.entity.Admin; 
import cn.imath.util.DBUtil; 
public class AdminDaoImpl implements AdminDao { 
  /** 
   * LOGIN METHOD 
   */ 
  public Admin login(String username, String password) { 
    String sql = "select * from admin where name=? and password=? "; 
    Connection conn = DBUtil.getConn(); 
    try { 
      PreparedStatement pstmt = conn.prepareStatement(sql); 
      //set the query parameters 
      pstmt.setString(1,username); 
      pstmt.setString(2, password); 
      ResultSet rs = pstmt.executeQuery(); 
      if(rs.next()){ 
        int id = rs.getInt(1); 
        Admin ad = new Admin(); 
        ad.setId(id); 
        ad.setPassword(password); 
        ad.setName(username); 
        return ad; 
      } 
    } catch (SQLException e) { 
      e.printStackTrace(); 
    } 
    return null; 
  } 
} 

dao的實(shí)現(xiàn)類(lèi)實(shí)現(xiàn)了具體的業(yè)務(wù)方法,封裝了sql的相關(guān)操作。

5.創(chuàng)建Servlet響應(yīng)請(qǐng)求

Servlet負(fù)責(zé)處理請(qǐng)求。

package cn.imath.servlet; 
import java.io.IOException; 
import java.io.PrintWriter; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import cn.imath.dao.AdminDao; 
import cn.imath.dao.impl.AdminDaoImpl; 
import cn.imath.entity.Admin; 
public class AdminServlet extends HttpServlet { 
  public void doPost(HttpServletRequest request, HttpServletResponse response) 
      throws ServletException, IOException { 
    request.setCharacterEncoding("utf-8"); 
    String method = request.getParameter("method"); 
    if(method!=null){ 
      if("login".equals(method)){ 
        this.login(request,response); 
      } 
    } 
  } 
  private void login(HttpServletRequest request, HttpServletResponse response) { 
    String username = request.getParameter("username"); 
    String password = request.getParameter("password"); 
    AdminDao dao = new AdminDaoImpl(); 
    Admin ad = dao.login(username, password);  
    if(ad!=null){ 
      request.setAttribute("message", "Login Success"); 
    }else{ 
      request.setAttribute("message", "Login Failed"); 
    } 
    try { 
      request.getRequestDispatcher("/message.jsp").forward(request, response); 
    } catch (ServletException e) { 
      e.printStackTrace(); 
    } catch (IOException e) { 
      e.printStackTrace(); 
    } 
  } 
} 

這里將login方法獨(dú)立于doPost方法,這樣有助于對(duì)功能的擴(kuò)充。

這里介紹的只是MVC+DAO的設(shè)計(jì)流程,通過(guò)這種模式可以改進(jìn)項(xiàng)目的設(shè)計(jì),使項(xiàng)目結(jié)構(gòu)更為清晰,有了合理的方法,具體的項(xiàng)目才不致太混亂。最后,說(shuō)一下需要改進(jìn)的地方:

1.數(shù)據(jù)庫(kù)的連接控制,可以用連接池進(jìn)行改進(jìn),如DBCP或C3P0
2.數(shù)據(jù)庫(kù)操作可以用common dbutils進(jìn)行改進(jìn)

總結(jié)

以上就是本文關(guān)于MVC+DAO設(shè)計(jì)模式下的設(shè)計(jì)流程詳解的全部?jī)?nèi)容,希望對(duì)大家有所幫助。歡迎參閱:Spring MVC實(shí)現(xiàn)的登錄攔截器代碼分享SpringMVC使用MultipartFile 實(shí)現(xiàn)異步上傳方法介紹、Spring SpringMVC在啟動(dòng)完成后執(zhí)行方法源碼解析等,有什么問(wèn)題,可以隨時(shí)留言指出。感謝大家!

相關(guān)文章

  • MyBatis中Mapper的注入問(wèn)題詳解

    MyBatis中Mapper的注入問(wèn)題詳解

    這篇文章主要介紹了MyBatis中Mapper的注入問(wèn)題,我知道在 SpringBoot 體系中,MyBatis 對(duì) Mapper 的注入常見(jiàn)的方式有 2 種,具體哪兩種方法跟隨小編一起看看吧
    2021-09-09
  • 詳解Java的Struts2框架的結(jié)構(gòu)及其數(shù)據(jù)轉(zhuǎn)移方式

    詳解Java的Struts2框架的結(jié)構(gòu)及其數(shù)據(jù)轉(zhuǎn)移方式

    這篇文章主要介紹了詳解Java的Struts2框架的結(jié)構(gòu)及其數(shù)據(jù)轉(zhuǎn)移方式,Struts框架是Java的SSH三大web開(kāi)發(fā)框架之一,需要的朋友可以參考下
    2016-01-01
  • Java多態(tài)中動(dòng)態(tài)綁定原理解析

    Java多態(tài)中動(dòng)態(tài)綁定原理解析

    這篇文章主要介紹了Java多態(tài)中動(dòng)態(tài)綁定原理解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • java HashMap內(nèi)部實(shí)現(xiàn)原理詳解

    java HashMap內(nèi)部實(shí)現(xiàn)原理詳解

    這篇文章主要介紹了java HashMap內(nèi)部實(shí)現(xiàn)原理詳解的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • Spring基于xml實(shí)現(xiàn)自動(dòng)裝配流程詳解

    Spring基于xml實(shí)現(xiàn)自動(dòng)裝配流程詳解

    自動(dòng)裝配是使用spring滿(mǎn)足bean依賴(lài)的一種方法,spring會(huì)在應(yīng)用上下文中為某個(gè)bean尋找其依賴(lài)的bean,Spring中bean有三種裝配機(jī)制,分別是:在xml中顯式配置、在java中顯式配置、隱式的bean發(fā)現(xiàn)機(jī)制和自動(dòng)裝配
    2023-01-01
  • Java socket通信模擬QQ實(shí)現(xiàn)多人聊天室

    Java socket通信模擬QQ實(shí)現(xiàn)多人聊天室

    Socket在Java實(shí)戰(zhàn)網(wǎng)絡(luò)通信編程應(yīng)用中有非常重要的作用,你想要跟別人聯(lián)系都得通過(guò)socket占據(jù)端口來(lái)實(shí)現(xiàn),掌握Socket技術(shù)不僅在聊天應(yīng)用程序中需要用到(比如QQ什么的都都是用socket來(lái)寫(xiě)的),而且對(duì)于學(xué)習(xí) Asp.net 也非常有幫助
    2022-07-07
  • Java工廠(chǎng)模式定義與用法實(shí)例分析

    Java工廠(chǎng)模式定義與用法實(shí)例分析

    這篇文章主要介紹了Java工廠(chǎng)模式定義與用法,結(jié)合具體實(shí)例形式分析了java工廠(chǎng)模式定義、使用相關(guān)操作技巧,并總結(jié)了類(lèi)圖原理,需要的朋友可以參考下
    2019-07-07
  • Netty4之如何實(shí)現(xiàn)HTTP請(qǐng)求、響應(yīng)

    Netty4之如何實(shí)現(xiàn)HTTP請(qǐng)求、響應(yīng)

    這篇文章主要介紹了Netty4之如何實(shí)現(xiàn)HTTP請(qǐng)求、響應(yīng)問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • Eclipse中如何引入JUnit進(jìn)行單元測(cè)試

    Eclipse中如何引入JUnit進(jìn)行單元測(cè)試

    這篇文章主要介紹了Eclipse中如何引入JUnit進(jìn)行單元測(cè)試問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • 面向?qū)ο缶幊桃蕾?lài)注入詳解

    面向?qū)ο缶幊桃蕾?lài)注入詳解

    本文主要介紹面向?qū)ο缶幊桃蕾?lài)注入的知識(shí)資料,這里對(duì)依賴(lài)注入的資料做了詳細(xì)介紹,有興趣的小伙伴可以參考下
    2016-08-08

最新評(píng)論

深州市| 紫阳县| 高唐县| 连州市| 庆云县| 疏勒县| 雷州市| 灵山县| 新乡县| 中超| 吉首市| 宁晋县| 台江县| 镇江市| 麻城市| 冕宁县| 会泽县| 曲靖市| 永兴县| 黔江区| 灵台县| 佛教| 西藏| 阿巴嘎旗| 奉贤区| 广西| 驻马店市| 枣庄市| 肥东县| 湟源县| 绥宁县| 文水县| 三原县| 清镇市| 全椒县| 赤水市| 抚宁县| 温州市| 磐安县| 乌苏市| 兴安盟|