zoukankan      html  css  js  c++  java
  • DAO设计模式简介(转)

    http://blog.csdn.net/thystar/article/details/41786763

    DAO(Data Access Object,数据访问对象),主要的功能是用于进行数据操作的,在程序的标准开发框架中属于数据层的操作。

    数据开发结构:

    资源层是数据库的操作层,里面可以进行各种数据库的存储,但是这些数据存储的时候肯定是依靠SQL语句,数据层通过一个专门的数据库组件完成对数据库的操作

    业务层是整个项目的核心

    DAO组成

    DatabaseConnection:专门负责数据库打开与关闭操作的类

    VO:主要由属性,setter, getter方法组成,VO类中的属性与表中的字段相对应,每一个VO类的对象都表示表中的每一条记录;

    DAO:主要定义操作的接口,定义一系列数据库的原子性操作,例如增删改查等;

    Impl: DAO接口的真实实现类,主要完成具体数据库操作,但不负责数据库的打开和关闭;

    Proxy:代理实现类,主要完成数据库的打开和关闭并且调用真实实现类对象的操作;

    Factory: 工厂类,通过工厂类取得一个DAO的实例化对象。

    对于包的命名:

    在使用DAO时对包有严格的命名

    • 数据库连接: xxx.dbc.DatabaseConnection
    • DAO接口: xxx.dao.IXxxDAO
    • DAO接口真实实现类:xxx.dao.impl.XxxDAOImpl
    • DAO接口代理实现类:xxx.dao.proxy.XxxDAOProxy
    • VO类: xxx.vo.Xxx, VO命名要与表的命名一致
    • 工厂类:xxx.factory.DAOFactory.

    用DAO重新写登陆页面:

    所需要的文件:这里直接使用MVC模式开发,使用myeclipse 10。

    数据库脚本:

    [sql] view plain copy
     
    1. /*=============删除数据库=============*/  
    2. DROP DATABASE IF EXISTS usr;  
    3. /*=============创建数据库=============*/  
    4. CREATE DATABASE usr;  
    5. /*=============使用数据库=============*/  
    6. USE usr;  
    7. /*=============删除数据库表===========*/  
    8. DROP TABLE IF EXISTS login;  
    9. /*=============创建数据库表===========*/  
    10. CREATE TABLE login(  
    11.     userid          VARCHAR(30)         PRIMARY KEY,  
    12.     name            VARCHAR(30)         NOT NULL,  
    13.     password        VARCHAR(32)         NOT NULL  
    14. );  
    15.   
    16. INSERT INTO login(userid, name, password)VALUES('admin', 'admin', 'admin');  


    1.定义vo类,vo类定义了数据的属性,及相应的setter,getter方法。

    定义User类 :User.java -------- package org.thystar.mvcdemo.vo.User.

    [java] view plain copy
     
    1. /** 
    2.  * vo层 
    3.  */  
    4. package org.thystar.mvcdemo.vo;  
    5.   
    6. /** 
    7.  *  
    8.  * 定义用户类 
    9.  */  
    10. public class User {  
    11.     private String userid;       //用户ID  
    12.     private String name;         //用户名  
    13.     private String password;     //密码  
    14.     public String getUserid() {  
    15.         return userid;  
    16.     }  
    17.     public void setUserid(String userid) {  
    18.         this.userid = userid;  
    19.     }  
    20.     public String getName() {  
    21.         return name;  
    22.     }  
    23.     public void setName(String name) {  
    24.         this.name = name;  
    25.     }  
    26.     public String getPassword() {  
    27.         return password;  
    28.     }  
    29.     public void setPassword(String password) {  
    30.         this.password = password;  
    31.     }  
    32.       
    33. }  


    2. 定义数据库连接类,这个类只负责连接数据库:

    定义DataBaseConnection类 DatabaseConnection.java ------------package org.thystar.mvcdemo.dbc.DatabaseConnection;

    [java] view plain copy
     
    1. package org.thystar.mvcdemo.dbc;  
    2.   
    3. import java.sql.*;  
    4. /** 
    5.  *  
    6.  * 连接数据库 
    7.  * 
    8.  */  
    9. public class DatabaseConnection {  
    10.     // 定义数据库驱动程序  
    11.     private static final String DBDRIVER = "org.gjt.mm.mysql.Driver";    
    12.     // 数据库连接地址  
    13.     private static final String DBURL = "jdbc:mysql://localhost:3306/usr";  
    14.     private static final String DBUSER = "root";            // 数据库连接用户名  
    15.     private static final String DBPASSWORD = "mysqladmin";  // 数据库连接密码  
    16.       
    17.     private Connection conn = null;      //声明数据库连接对象  
    18.     public DatabaseConnection() throws Exception{     //构造函数  
    19.         try{  
    20.             Class.forName(DBDRIVER);   // 加载驱动程序  
    21.             this.conn = DriverManager.getConnection(DBURL, DBUSER, DBPASSWORD);  // 取得数据库连接  
    22.         }catch(Exception e){  
    23.             throw e;  
    24.         }  
    25.     }  
    26.     public Connection getConnection() { //取得数据库连接  
    27.         return this.conn;  
    28.     }  
    29.     public void close() throws Exception { // 关闭数据库操作  
    30.         if(this.conn != null){          // 避免NullPointerException  
    31.             try{  
    32.                 this.conn.close();       // 关闭数据库  
    33.             }catch(Exception e){  
    34.                 throw e;               // 抛出异常  
    35.             }  
    36.         }  
    37.     }     
    38. }  


    3 . 定义数据库操作接口,定义数据库操作的方法:

    定义IUserDAO接口,IUserDAO.java --------- package org.thystar.mvcdemo.dao.IUserDAO

    [java] view plain copy
     
    1. package org.thystar.mvcdemo.dao;  
    2. // 在这个操作中要导入vo包。  
    3. import org.thystar.mvcdemo.vo.*;  
    4. /** 
    5.  *  
    6.  * 数据库操作接口 
    7.  * 
    8.  */  
    9. public interface IUserDAO {  
    10.     /** 
    11.      * 用户登录验证 
    12.      * @param user 传入vo对象 
    13.      * @return 验证操作结果 
    14.      * @throws Exception 
    15.      */  
    16.     public boolean findLogin(User user) throws Exception;  
    17. }  


    4. 定义DAO实现类,实现接口中定义的方法

    定义UserDAOImpl类, UserDAOImpl.java ---------package org.thystar.mvcdemo.dao.impl.UserDAOImpl

    [java] view plain copy
     
    1. package org.thystar.mvcdemo.dao.impl;  
    2.   
    3. import java.sql.*;  
    4. import org.thystar.mvcdemo.dao.IUserDAO;  
    5. import org.thystar.mvcdemo.vo.User;  
    6. /** 
    7.  *  
    8.  * DAO实现类,实现方法,但不负责数据库的具体连接 
    9.  * 
    10.  */  
    11. public class UserDAOImpl implements IUserDAO{  
    12.     private Connection conn = null;         //定义数据库的连接对象  
    13.     private PreparedStatement pstmt = null; //定义数据库操作对象  
    14.     public UserDAOImpl(Connection conn){    // 构造方法,设置数据库连接  
    15.         this.conn = conn;  
    16.     }  
    17.     /** 
    18.      * 具体操作方法:查询 
    19.      */  
    20.     public boolean findLogin(User user) throws Exception{  
    21.         boolean flag = false;                //定义标志位  
    22.         try{  
    23.             String sql = "SELECT name FROM login WHERE userid = ? AND password = ?";  
    24.             this.pstmt = this.conn.prepareStatement(sql);     // 实例化操作  
    25.             this.pstmt.setString(1, user.getUserid());        // 设置用户id  
    26.             this.pstmt.setString(2, user.getPassword());      // 设置password  
    27.             ResultSet rs = this.pstmt.executeQuery();         // 取得查询结果  
    28.             if(rs.next()){  
    29.                 user.setName(rs.getString(1));                //取得姓名  
    30.                 flag = true;  
    31.             }  
    32.         }catch(Exception e){  
    33.             throw e;  
    34.         }  
    35.         return flag;  
    36.     }  
    37. }  

    可以看出,在真实的数据库的实现类中,没有处理数据库打开和关闭的操作,只是通过构造方法取得了数据库的连接,真正的负责打开和关闭的操作由代理类实现

    5.代理(proxy)类实现:负责数据库的打开和关闭及调用真实实现类对象操作:

    定义UserDAOProxy implements IUserDAO,UserDAOProxy.java ------------package org.thystar.mvcdemo.dao.proxy.UserDAOProxy

    [java] view plain copy
     
    1. package org.thystar.mvcdemo.dao.proxy;  
    2. /** 
    3.  * 代理类,要找到真实主题 
    4.  */  
    5. import org.thystar.mvcdemo.dao.IUserDAO;  
    6. import org.thystar.mvcdemo.dbc.DatabaseConnection;  
    7. import org.thystar.mvcdemo.dao.impl.UserDAOImpl;  
    8. import org.thystar.mvcdemo.vo.User;  
    9.   
    10. public class UserDAOProxy implements IUserDAO {  
    11.     private DatabaseConnection dbc = null;  
    12.     private IUserDAO dao = null;  
    13.     public UserDAOProxy() {       //构造方法,实例化连接,同时实例化dao对象  
    14.         try {  
    15.             this.dbc = new DatabaseConnection();    // 连接数据库  
    16.         } catch (Exception e) {  
    17.             // TODO Auto-generated catch block  
    18.             e.printStackTrace();  
    19.         }  
    20.         this.dao = new UserDAOImpl(this.dbc.getConnection());  //实例化真实主题类  
    21.     }  
    22.     public boolean findLogin(User user) throws Exception{  // 实现接口中的方法。  
    23.         boolean flag = false; //定义标志位  
    24.         try{  
    25.             flag = this.dao.findLogin(user);  // 调用真实主题  
    26.         }catch(Exception e){                    
    27.             throw e;                           //向上抛出异常  
    28.         }finally{  
    29.             this.dbc.close();  
    30.         }  
    31.         return flag; //返回标记  
    32.     }  
    33.       
    34. }  


    6. 工厂类的实现: 取得DAO实例

    定义DAOFactory类, DAOFactory.java --------------package org.thystar.mvcdemo.factory.DAOFactory

    [java] view plain copy
     
    1. package org.thystar.mvcdemo.factory;  
    2.   
    3. import org.thystar.mvcdemo.dao.IUserDAO;  
    4. import org.thystar.mvcdemo.dao.proxy.UserDAOProxy;  
    5. /** 
    6.  *  
    7.  * 工长类 
    8.  * 
    9.  */  
    10. public class DAOFactory {  
    11.     public static IUserDAO getIUserDAOInstance(){      // 取得DAO实例  
    12.         return new UserDAOProxy();       // 返回代理实例  
    13.     }  
    14. }  

    工厂类的功能就是直接返回DAO接口的实例化对象,以后客户端直接通过工厂类就可以取得DAO接口的实例化对象

    到这里,数据层的部分就完成了,下面开始定义Servlet/jsp部分,也就是显示层,进行页面的显示

    7 .定义Servlet:

    LoginServlet.java

    [java] view plain copy
     
    1. /** 
    2.  * 定义Servlet 
    3.  */  
    4. package org.thystar.mvcdemo.servlet;  
    5.   
    6. import java.io.IOException;  
    7. import java.io.PrintWriter;  
    8. import java.util.ArrayList;  
    9. import java.util.List;  
    10.   
    11. import javax.servlet.ServletException;  
    12. import javax.servlet.http.HttpServlet;  
    13. import javax.servlet.http.HttpServletRequest;  
    14. import javax.servlet.http.HttpServletResponse;  
    15.   
    16. import org.thystar.mvcdemo.factory.DAOFactory;  
    17. import org.thystar.mvcdemo.vo.User;  
    18.   
    19. public class LoginServlet extends HttpServlet {  
    20.   
    21.     private static final long serialVersionUID = 1L;  
    22.   
    23.     /** 
    24.      * The doGet method of the servlet. <br> 
    25.      * 
    26.      * This method is called when a form has its tag value method equals to get. 
    27.      *  
    28.      * @param request the request send by the client to the server 
    29.      * @param response the response send by the server to the client 
    30.      * @throws ServletException if an error occurred 
    31.      * @throws IOException if an error occurred 
    32.      */  
    33.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
    34.             throws ServletException, IOException {  
    35.   
    36.         String path = "login.jsp";             
    37.         String userid = request.getParameter("userid"); //接收userid的内容  
    38.         String userpass = request.getParameter("userpass"); //接收userpass的内容  
    39.         List<String> info = new ArrayList<String>();   // 保存返回信息  
    40.         //判断输入为空的情况  
    41.         if(userid == null || "".equals(userid)){      
    42.             info.add("用户id不能为空");  
    43.         }  
    44.         if(userpass == null || "".equals(userpass)){  
    45.             info.add("密码不能为空");  
    46.         }  
    47.         //用户名密码验证通过  
    48.         if(info.size() == 0){  
    49.             User user = new User();      //实例化vo  
    50.             user.setUserid(userid);      //设置userid  
    51.             user.setPassword(userpass);  //设置userpass  
    52.             try {  
    53.                 if(DAOFactory.getIUserDAOInstance().findLogin(user)){ //验证通过  
    54.                     info.add("通过验证" + user.getName() + "已登录");  
    55.                 }else{  
    56.                     info.add("登录失败");  
    57.                 }  
    58.             } catch (Exception e) {  
    59.                 // TODO: handle exception  
    60.                 e.printStackTrace();  
    61.             }     
    62.         }  
    63.         request.setAttribute("info", info);     
    64.         request.getRequestDispatcher(path).forward(request, response); //跳转  
    65.     }  
    66.   
    67.     /** 
    68.      * The doPost method of the servlet. <br> 
    69.      * 
    70.      * This method is called when a form has its tag value method equals to post. 
    71.      *  
    72.      * @param request the request send by the client to the server 
    73.      * @param response the response send by the server to the client 
    74.      * @throws ServletException if an error occurred 
    75.      * @throws IOException if an error occurred 
    76.      */  
    77.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
    78.             throws ServletException, IOException {  
    79.   
    80.         this.doGet(request, response);  // 调用doGet操作  
    81.     }  
    82.   
    83. }  


    8. 登陆页 

    login.jsp

    [javascript] view plain copy
     
    1. <%@ page contentType = "text/html" pageEncoding="GBK" import = "java.util.*"%>  
    2.   
    3. <html>  
    4.   <head>  
    5.       
    6.     <title>www.thystar.com</title>  
    7.     <script language = "JavaScript">  
    8.       
    9.         function validate(f){  
    10.             if(!(/^w{1,15}$/.test(f.userid.value))){  
    11.                 alert("用户ID必须是1~15位");  
    12.                 f.userid.focus();  
    13.                 return false;  
    14.             }  
    15.             if(!(/^w{1,15}$/.test(f.userpass.value))){  
    16.                 alert("密码必须是1~15位");  
    17.                 f.userpass.focus();  
    18.                 return false;  
    19.             }  
    20.             return true;  
    21.         }  
    22.     </script>  
    23.   
    24.   </head>  
    25.     
    26.   <body>  
    27.     <h2>用户登录</h2>  
    28.      <%  
    29.         request.setCharacterEncoding("GBK");  
    30.      %>  
    31.      <%  
    32.         List<String> info=(List<String>)request.getAttribute("info");  
    33.         if(info != null){  
    34.             Iterator<String> iter = info.iterator();  
    35.             while(iter.hasNext()){  
    36.      %>  
    37.                 <h4><%= iter.next() %></h4>  
    38.      <%  
    39.             }  
    40.         }  
    41.      %>  
    42.      <form action="LoginServlet" method="post" onSubmit = "validate(this)">  
    43.        
    44.         用户ID: <input type = "text" name = "userid"><br>  
    45.         密  码:<input type = "password" name="userpass"><br>  
    46.         <input type = "submit" value = "登录">  
    47.         <input type = "reset" value = "重置">  
    48.      </form>  
    49.   </body>  
    50. </html>  


    结果:

  • 相关阅读:
    有几种不同类型的自动代理?
    使用 Spring 通过什么方式访问 Hibernate?
    单片,SOA 和微服务架构有什么区别?
    如何给 Spring 容器提供配置元数据?
    在 Spring AOP 中,关注点和横切关注的区别是什么?
    Java Concurrency API 中的 Lock 接口(Lock interface) 是什么?对比同步它有什么优势?
    移动文件用哪个命令?改名用哪个命令?
    synchronized 的作用?
    “a==b”和”a.equals(b)”有什么区别?
    什么是 Spring beans?
  • 原文地址:https://www.cnblogs.com/callmeguxi/p/8196462.html
Copyright © 2011-2022 走看看