MVC+DAO设计模式下的设计流程详解

DAO设计 :

DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DAO的接口,然后在Spring的配置文件中定义此接口的实现类,然后就可在模块中调用此接口来进行数据业务的处理,而不用关心此接口的具体实现类是哪个类,显得结构非常清晰,DAO层的数据源配置,以及有关数据库连接的参数都在Spring的配置文件中进行配置。

在该层主要完成对象-关系映射的建立,通过这个映射,再通过访问业务对象即可实现对数据库的访问,使得开发中不必再用SQL语句编写复杂的数据库访问程序,这样就简化了对数据库的访问,提高了开发效率。同时通过对象-关系映射的配置,可以建立业务对象之间的复杂关系,如一对多、多对一、一对一、多对多等关系。这样就不再需要在数据库中建立表之间的复杂联系,使得业务对象之间的关系和数据库相分离,简化了数据库的建立和维护。在这一层中主要使用Hibernate框架来实现。

针对以上问题,产生了基于MVC模式Model层的DAO模式(Data Access Object),主要由工厂类(Factory)、代理类(Proxy)、实现类(DAOImpl)、DAO接口和值对象类(VO)以及数据库连接类组成。

这里总结一下MVC+DAO的设计流程。通过MVC+DAO的设计模式,可以使项目在设计过程中结构更为明晰,并且能够方便的进行修改。MVC是一个分层模型,即模型、视图、控制器。DAO是一个数据库访问模型,隔离数据库操作。

环境说明:

数据库:mysql

开发语言:JSP + Servlet + Java

服务器:tomcat 7.x

包规划:

entity 放置与数据库中的表相对应的实体类
dao 放置DAO设计模式下实现访问数据库的接口
dao.impl 放置DAO对应的接口实现类
servlet 放置Servlet

util 工具包

设计流程综述:

0.设计数据库以及视图页面(VIEW)
1.设计数据库的工具类
2.设计符合java bean标准的entity类 (MODEL)
3.设计访问数据库的DAO接口
4.设计实现DAO接口的实现类
5.创建Servlet响应请求(CONTROLLER)

例子:以一个简单的登录页面设计为例

0.设计数据库以及视图页面

数据库设计:

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`)
) 

页面视图:

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> 

核心代码就是一个form表单,用于提供视图,为用户提供输入的接口。核心是指定action和method属性。这应该是最简单的一步,下面的工作则进入真正的代码编写阶段。

转发页面:

message.jsp核心代码如下:其实就句话

<body>
 ${message}
</body> 

1.设计数据库的工具类

这步的操作应该是大同小异的,目的只是抽取公共代码,简化程序流程。

dbConfig.properties 文件存放数据库的配置文件,这么做的优点的是可以项目编译后也能方便的修改数据库配置的相关信息。

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

DBUtil类设计:该类用实现建立数据库连接和关闭数据库连接的公共操作。

代码如下:

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();
      }
    }
  }
} 

这里要注意的是:导入的包均为java.sql包。这里建立了两个核心方法,后面会经常用到 getConn() 和 closeAll()方法,分别用于取得数据库连接和关闭数据库连接。

2.设计符合java bean标准的entity类

这里的entity类对应于上面的admin表。因此设计Admin类如下:

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类的设计是为了实现对数据的封装,只要对照数据库设计来就行,然后最好符合java bean的设计标准,用getter/setter实现访问。

3.设计访问数据库的DAO接口

dao接口的设计非常简单,目的是为后面的具体的业务方法提供一个模版。

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.设计实现DAO接口的实现类

接下来设计上面DAO接口的实现类,用于实现具体的业务。这里就能体现上面模版的作用。

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的实现类实现了具体的业务方法,封装了sql的相关操作。

5.创建Servlet响应请求

Servlet负责处理请求。

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方法独立于doPost方法,这样有助于对功能的扩充。

这里介绍的只是MVC+DAO的设计流程,通过这种模式可以改进项目的设计,使项目结构更为清晰,有了合理的方法,具体的项目才不致太混乱。最后,说一下需要改进的地方:

1.数据库的连接控制,可以用连接池进行改进,如DBCP或C3P0
2.数据库操作可以用common dbutils进行改进

总结

以上就是本文关于MVC+DAO设计模式下的设计流程详解的全部内容,希望对大家有所帮助。欢迎参阅:Spring MVC实现的登录拦截器代码分享、SpringMVC使用MultipartFile 实现异步上传方法介绍、Spring SpringMVC在启动完成后执行方法源码解析等,有什么问题,可以随时留言指出。感谢大家!

(0)

相关推荐

  • Spring+SpringMVC+MyBatis深入学习及搭建(二)之MyBatis原始Dao开发和mapper代理开发

    前面有写到Spring+SpringMVC+MyBatis深入学习及搭建(一)--MyBatis的基础知识.MybatisFirst中存在大量重复的代码.这次简化下代码: 使用MyBatis开发Dao,通常有两种方法,即原始Dao开发方法和Mapper接口开发方法. 1.SqlSession使用范围 1.1 SqlsessionFactoryBuilder 通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory,将SqlSessionFactoryBu

  • MVC+DAO设计模式下的设计流程详解

    DAO设计 : DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DAO的接口,然后在Spring的配置文件中定义此接口的实现类,然后就可在模块中调用此接口来进行数据业务的处理,而不用关心此接口的具体实现类是哪个类,显得结构非常清晰,DAO层的数据源配置,以及有关数据库连接的参数都在Spring的配置文件中进行配置. 在该层主要完成对象-关系映射的建立,通过这个映射,再通过访问业务对象即可实现对数据库的访问,使得开发中不必再用SQL语句编写复杂的

  • Java设计模式之原型设计示例详解

    目录 简单说一下(定义) 稍微夸一下(优缺点) 顺便提一下(适用场景) 着重讲一下(深.浅克隆) 多多用一下(结构.代码实现) 简单说一下(定义) 什么是原型模式:原型模式是用于创建重复的对象,同时又能保证性能.用一个已经创建的实例作为原型,通过复制该原型对象来创建一个或者多个和原型相同或者相似的新对象 举例说明:我们都玩过打飞机的游戏,敌军的飞机可谓是数不胜数,但是如果每出一架敌机都要重新实例化的话,那么自然我们的功能很复杂.所以这个时候我们的原型模式就派上用场了,只实例化一架飞机出来,其他的

  • Spring mvc服务端数据校验实现流程详解

    B/S 系统中对http 请求数据的校验多数在客户端进行,这也是出于简单及用户体验性上考虑,但是在一些安全性要求高的系统中服务端校验是不可缺少的,实际上,几乎所有的系统,凡是涉及到数据校验,都需要在服务端进行二次校验.为什么要在服务端进行二次校验呢?这需要理解客户端校验和服务端校验各自的目的. 客户端校验,我们主要是为了提高用户体验,例如用户输入一个邮箱地址,要校验这个邮箱地址是否合法,没有必要发送到服务端进行校验,直接在前端用 js 进行校验即可.但是大家需要明白的是,前端校验无法代替后端校验

  • JavaWeb框架MVC设计思想详解

    Servlet:在Servlet中拼接html内容 JSP:在html中拼接java JSP+JavaBean:利用javaBean将大量的代码提取走 Servlet+JSP+JavaBean:Servlet是控制器,javabean封装数据,jsp展示数据 javaweb的经典三层结构: dao javabean servlet ==> service jsp javabean: javabean是一个遵循特定写法的java类 1.这个java类必须有一个无参的构造函数 2.属性必须私有化 3

  • Windows下安装Redis的流程详解

    目录 一.简介 二.下载与安装Redis 1.下载 2.解压 3.几个重要的文件 三.环境变量配置 四.验证与连接redis 1.验证 3.连接Redis 4.设置一个key测试一下 一.简介 Redis作为常用开源的非关系型数据库,是开发中常用的数据库之一.Redis底层是使用ANSI C编写的,支持网络可基于内存和可持久化的日志型.Key-Value数据库,提供了多种语言API.(基于内存是Redis快的一个重要因素) 二.下载与安装Redis 1.下载 github上可以下载Windows

  • SpringMvc框架的简介与执行流程详解

    目录 一.SpringMvc框架简介 1.Mvc设计理念 2.SpringMvc简介 二.SpringMvc执行流程 1.流程图解 2.步骤描述 3.核心组件 三.整合Spring框架配置 1.spring-mvc配置 2.Web.xml配置 3.测试接口 4.常用注解说明 四.常见参数映射 1.普通映射 2.指定参数名 3.数组参数 4.Map参数 5.包装参数 6.Rest风格参数 五.源代码地址 一.SpringMvc框架简介 1.Mvc设计理念 M:代表模型Model 模型就是数据,应用

  • MyBatis集成Spring流程详解

    目录 一.Mybatis与spring集成 1. 导入pom依赖 2. 编写配置文件 3. 使用注解开发 4. 测试 5. 管理数据源 二.Aop整合pagehelper插件 要解决的问题 一.Mybatis与spring集成 1. 导入pom依赖 <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.8

  • Java设计模式之职责链模式详解

    目录 前言 一.职责链模式的定义与特点 二.职责链模式的结构 三.职责链模式案例 前言 本文简单介绍了设计模式的一种--职责链模式  一.职责链模式的定义与特点 定义: 为了避免请求发送者与多个请求处理者耦合在一起,于是将所有请求的处理者通过前一对象记住其下一个对象的引用而连成一条链:当有请求发生时,可将请求沿着这条链传递,直到有对象处理它为止. 比如我们的审批制度,低等级的审批不了的,交给上一级审批,依次类推,直到审批结束. 在责任链模式中,客户只需要将请求发送到责任链上即可,无须关心请求的处

  • Java设计模式之策略模式示例详解

    目录 定义 结构 UML类图 UML序列图 深入理解策略模式 策略和上下文的关系 策略模式在JDK中的应用 该策略接口有四个实现类 策略模式的优点 策略模式的缺点 策略模式的本质 在讲策略模式之前,我们先看一个日常生活中的小例子: 现实生活中我们到商场买东西的时候,卖场往往根据不同的客户制定不同的报价策略,比如针对新客户不打折扣,针对老客户打9折,针对VIP客户打8折... 现在我们要做一个报价管理的模块,简要点就是要针对不同的客户,提供不同的折扣报价. 如果是有你来做,你会怎么做? 我们很有可

  • JavaScript设计模式之职责链模式详解

    目录 职责链模式 1. 现实中的职责链模式 2. 实际开发中的职责链模式 3. 用职责链模式重构代码 4. 灵活可拆分的职责链节点 5. 异步的职责链 6. 职责链模式的优缺点 7. 用 AOP 实现职责链 8. 小结 职责链模式 职责链模式的定义是:使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象处理它为止. 职责链模式的名字非常形象,一系列可能会处理请求的对象被连接成一条链,请求在这些对象之间依次传递,直到遇

随机推荐