MVC+DAO设计模式下的设计流程详解
DAO设计:
DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO层的设计首先是设计DAO的接口,然后在Spring的配置文件中定义此接口的实现类,然后就可在模块中调用此接口来进行数据业务的处理,而不用关心此接口的具体实现类是哪个类,显得结构非常清晰,DAO层的数据源配置,以及有关数据库连接的参数都在Spring的配置文件中进行配置。
在该层主要完成对象-关系映射的建立,通过这个映射,再通过访问业务对象即可实现对数据库的访问,使得开发中不必再用SQL语句编写复杂的数据库访问程序,这样就简化了对数据库的访问,提高了开发效率。同时通过对象-关系映射的配置,可以建立业务对象之间的复杂关系,如一对多、多对一、一对一、多对多等关系。这样就不再需要在数据库中建立表之间的复杂联系,使得业务对象之间的关系和数据库相分离,简化了数据库的建立和维护。在这一层中主要使用Hibernate框架来实现。
针对以上问题,产生了基于MVC模式Model层的DAO模式(DataAccessObject),主要由工厂类(Factory)、代理类(Proxy)、实现类(DAOImpl)、DAO接口和值对象类(VO)以及数据库连接类组成。
这里总结一下MVC+DAO的设计流程。通过MVC+DAO的设计模式,可以使项目在设计过程中结构更为明晰,并且能够方便的进行修改。MVC是一个分层模型,即模型、视图、控制器。DAO是一个数据库访问模型,隔离数据库操作。
环境说明:
数据库:mysql
开发语言:JSP+Servlet+Java
服务器:tomcat7.x
包规划:
entity 放置与数据库中的表相对应的实体类
dao 放置DAO设计模式下实现访问数据库的接口
dao.impl 放置DAO对应的接口实现类
servlet 放置Servlet
util 工具包
设计流程综述:
0.设计数据库以及视图页面(VIEW)
1.设计数据库的工具类
2.设计符合javabean标准的entity类(MODEL)
3.设计访问数据库的DAO接口
4.设计实现DAO接口的实现类
5.创建Servlet响应请求(CONTROLLER)
例子:以一个简单的登录页面设计为例
0.设计数据库以及视图页面
数据库设计:
CREATETABLE`NewTable`( `id`int(10)UNSIGNEDZEROFILLNOTNULLAUTO_INCREMENT, `name`varchar(10)CHARACTERSETutf8COLLATEutf8_unicode_ciNOTNULL, `password`varchar(10)CHARACTERSETutf8COLLATEutf8_unicode_ciNOTNULL, PRIMARYKEY(`id`) )
页面视图:
index.jsp的核心代码如下:
USERLOGIN username password
核心代码就是一个form表单,用于提供视图,为用户提供输入的接口。核心是指定action和method属性。这应该是最简单的一步,下面的工作则进入真正的代码编写阶段。
转发页面:
message.jsp核心代码如下:其实就句话
${message}
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类设计:该类用实现建立数据库连接和关闭数据库连接的公共操作。
代码如下:
packagecn.imath.util; importjava.io.InputStream; importjava.sql.Connection; importjava.sql.DriverManager; importjava.sql.ResultSet; importjava.sql.SQLException; importjava.sql.Statement; importjava.util.Properties; publicfinalclassDBUtil{ privatestaticStringdriver; privatestaticStringurl; privatestaticStringuser; privatestaticStringpassword; /** *loadthepropertyfile */ static{ Propertiesprops=newProperties(); //gettheclassloader InputStreamis=DBUtil.class.getClassLoader().getResourceAsStream("cn/imath/util/dbConfig.properties"); try{ props.load(is); }catch(Exceptione){ e.printStackTrace(); } driver=props.getProperty("driver"); url=props.getProperty("url"); user=props.getProperty("user"); password=props.getProperty("password"); } /** *registerthedriver */ static{ try{ Class.forName(driver); }catch(ClassNotFoundExceptione){ e.printStackTrace(); } } /** *OPENTHEDATABASECONNECTION *@return */ publicstaticConnectiongetConn(){ Connectionconn=null; try{ conn=DriverManager.getConnection(url,user,password); }catch(SQLExceptione){ e.printStackTrace(); } returnconn; } /** *CLOSETHEDATABASECONNECTION *@paramrs */ publicstaticvoidcloseAll(ResultSetrs,Statementstmt,Connectionconn){ close(rs); close(stmt); close(conn); } publicstaticvoidclose(ResultSetrs){ if(rs!=null){ try{ rs.close(); }catch(SQLExceptione){ e.printStackTrace(); } } } publicstaticvoidclose(Statementstmt){ if(stmt!=null){ try{ stmt.close(); }catch(Exceptione){ e.printStackTrace(); } } } publicstaticvoidclose(Connectionconn){ if(conn!=null){ try{ conn.close(); }catch(Exceptione){ e.printStackTrace(); } } } }
这里要注意的是:导入的包均为java.sql包。这里建立了两个核心方法,后面会经常用到getConn()和closeAll()方法,分别用于取得数据库连接和关闭数据库连接。
2.设计符合javabean标准的entity类
这里的entity类对应于上面的admin表。因此设计Admin类如下:
packagecn.imath.entity; publicclassAdmin{ privateintid; privateStringname; privateStringpassword; publicintgetId(){ returnid; } publicvoidsetId(intid){ this.id=id; } publicStringgetName(){ returnname; } publicvoidsetName(Stringname){ this.name=name; } publicStringgetPassword(){ returnpassword; } publicvoidsetPassword(Stringpassword){ this.password=password; } }
entity类的设计是为了实现对数据的封装,只要对照数据库设计来就行,然后最好符合javabean的设计标准,用getter/setter实现访问。
3.设计访问数据库的DAO接口
dao接口的设计非常简单,目的是为后面的具体的业务方法提供一个模版。
AdminDao接口如下:
packagecn.imath.dao; importcn.imath.entity.Admin; publicinterfaceAdminDao{ /** *LOGINMETHOD *@paramusername *@parampassword *@returnINSTANCEOFAdmin */ publicAdminlogin(Stringusername,Stringpassword); }
4.设计实现DAO接口的实现类
接下来设计上面DAO接口的实现类,用于实现具体的业务。这里就能体现上面模版的作用。
packagecn.imath.dao.impl; importjava.sql.Connection; importjava.sql.PreparedStatement; importjava.sql.ResultSet; importjava.sql.SQLException; importcn.imath.dao.AdminDao; importcn.imath.entity.Admin; importcn.imath.util.DBUtil; publicclassAdminDaoImplimplementsAdminDao{ /** *LOGINMETHOD */ publicAdminlogin(Stringusername,Stringpassword){ Stringsql="select*fromadminwherename=?andpassword=?"; Connectionconn=DBUtil.getConn(); try{ PreparedStatementpstmt=conn.prepareStatement(sql); //setthequeryparameters pstmt.setString(1,username); pstmt.setString(2,password); ResultSetrs=pstmt.executeQuery(); if(rs.next()){ intid=rs.getInt(1); Adminad=newAdmin(); ad.setId(id); ad.setPassword(password); ad.setName(username); returnad; } }catch(SQLExceptione){ e.printStackTrace(); } returnnull; } }
dao的实现类实现了具体的业务方法,封装了sql的相关操作。
5.创建Servlet响应请求
Servlet负责处理请求。
packagecn.imath.servlet; importjava.io.IOException; importjava.io.PrintWriter; importjavax.servlet.ServletException; importjavax.servlet.http.HttpServlet; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; importcn.imath.dao.AdminDao; importcn.imath.dao.impl.AdminDaoImpl; importcn.imath.entity.Admin; publicclassAdminServletextendsHttpServlet{ publicvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse) throwsServletException,IOException{ request.setCharacterEncoding("utf-8"); Stringmethod=request.getParameter("method"); if(method!=null){ if("login".equals(method)){ this.login(request,response); } } } privatevoidlogin(HttpServletRequestrequest,HttpServletResponseresponse){ Stringusername=request.getParameter("username"); Stringpassword=request.getParameter("password"); AdminDaodao=newAdminDaoImpl(); Adminad=dao.login(username,password); if(ad!=null){ request.setAttribute("message","LoginSuccess"); }else{ request.setAttribute("message","LoginFailed"); } try{ request.getRequestDispatcher("/message.jsp").forward(request,response); }catch(ServletExceptione){ e.printStackTrace(); }catch(IOExceptione){ e.printStackTrace(); } } }
这里将login方法独立于doPost方法,这样有助于对功能的扩充。
这里介绍的只是MVC+DAO的设计流程,通过这种模式可以改进项目的设计,使项目结构更为清晰,有了合理的方法,具体的项目才不致太混乱。最后,说一下需要改进的地方:
1.数据库的连接控制,可以用连接池进行改进,如DBCP或C3P0
2.数据库操作可以用commondbutils进行改进
总结
以上就是本文关于MVC+DAO设计模式下的设计流程详解的全部内容,希望对大家有所帮助。欢迎参阅:SpringMVC实现的登录拦截器代码分享、SpringMVC使用MultipartFile实现异步上传方法介绍、SpringSpringMVC在启动完成后执行方法源码解析等,有什么问题,可以随时留言指出。感谢大家!