DAO设计模式总结

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

数据开发结构流程:

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

业务层是整个项目的核心

2.DAO组成结构:

  • DatabaseConnection:专门负责数据库打开与关闭操作的类。
  • VO:主要由属性,setter, getter方法组成,VO类中的属性与表中的字段相对应,每一个VO类的对象都表示表中的每一条记录。
  • DAO:主要定义操作的接口,定义一系列数据库的原子性操作,例如增删改查等。
  • Impl: DAO接口的真实实现类,主要完成具体数据库操作,但不负责数据库的打开和关闭。
  • Proxy:代理实现类,主要完成数据库的打开和关闭并且调用真实实现类对象的操作。
  • Factory: 工厂类,通过工厂类取得一个DAO的实例化对象。

3.对于包的命名:

  • 数据库连接: 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.

4.DAO开发:

4.1数据库脚本如下:

create database DAO

create table Login(
	UserID	varchar(30)   primary key,
	name	varchar(30),
	password		varchar(15)
);


INSERT INTO login(UserID, name, password)VALUES('admin', 'admin', 'admin');

select * from login

4.2定义VO类,VO类有数据的属性以及setter,getter方法,代码如下:

package org.lxh.VO;

public class voDemo {
	private String userid;
	private String name;
	private String password;
	public void setUserid(String userid){
		this.userid=userid;
	}
	public void setName(String name){
		this.name=name;
	}
	public void setPassword(String password){
		this.password=password;
	}
	public String getUserid(){
		return this.userid;
	}
	public String getName(){
		return this.name;
	}
	public String getPassword(){
		return this.password;
	}
}

4.3实现DateBaseConnection类,代码如下:

package org.lxh.dbc;

import java.sql.Connection;
import java.sql.DriverManager;
public class DateBaseConnection {
    private static final String DBDRIVER=
        "com.microsoft.sqlserver.jdbc.SQLServerDriver";//SQLserver数据库引擎
    private static final String DBURL=
            "jdbc:sqlserver://127.0.0.1:1433;DatabaseName=DAO";//数据源
    private static final String DBUER="sa";//SQLserver数据库用户名
    private static final String DBPASSWORD="123";//SQLserver登录密码
    private Connection conn=null;    //声明数据库连接对象
    public DateBaseConnection() throws Exception{//在构造方法中连接数据库
        Class.forName(DBDRIVER);    //加载驱动程序
        this.conn=DriverManager.getConnection(DBURL,DBUER,DBPASSWORD);//连接数据库
    }
    public Connection getConnection(){//取得数据库的连接
        return this.conn;
    }
    public void close() throws Exception{//数据库的关闭操作
        if(this.conn!=null){
            try{
                this.conn.close();//数据库关闭
                System.out.println("数据库连接成功");
            }catch(Exception e){
                throw e;
            }
            System.out.println("数据库连接失败");
        }
    }
}

4.4定义DAO操作接口,代码如下:

package org.lxh.dao;

import org.lxh.VO.voDemo;

public interface IvoDemo {
	//验证登录,有异常交给被调处处理
	public boolean findLogin(voDemo vodemo) throws Exception;
}

4.5定义实现DAO接口类操作,代码如下:

package org.lxh.dao.impl;

import java.sql.*;

import org.lxh.VO.voDemo;
import org.lxh.dao.IvoDemo;  
/** 
 *  
 * DAO实现类,实现方法,但不负责数据库的具体连接 ,真实主题实现类
 * 
 */  
public class voDemoDAOImpl implements IvoDemo{  
    private Connection conn = null;         //定义数据库的连接对象  
    private PreparedStatement pstmt = null; //定义数据库操作对象  
    public voDemoDAOImpl(Connection conn){    // 构造方法,设置数据库连接  
        this.conn = conn;  
    }  
    /** 
     * 具体操作方法:查询 ,覆写DAO接口类
     */  
    public boolean findLogin(voDemo vodemo) throws Exception{  
        boolean flag = false;                //定义标志位  
        try{  
            String sql = "SELECT name FROM Login WHERE UserID = ? AND password = ?";  
            this.pstmt = this.conn.prepareStatement(sql);     // 实例化操作  
            this.pstmt.setString(1, vodemo.getUserid());        // 设置用户id  
            this.pstmt.setString(2, vodemo.getPassword());      // 设置password  
            ResultSet rs = this.pstmt.executeQuery();         // 取得查询结果  
            if(rs.next()){  
                vodemo.setName(rs.getString(1));                //取得姓名  
                flag = true;  
            }  
        }catch(Exception e){  
            throw e;  
        }  
        return flag;  
    }  
} 

4.6定义代理主题实现类,代码如下;

package org.lxh.dao.Proxy;

import org.lxh.VO.voDemo;
import org.lxh.dao.IvoDemo;
import org.lxh.dao.impl.voDemoDAOImpl;
import org.lxh.dbc.DateBaseConnection;

public class voDemoDAOProxy implements IvoDemo {  
    private DateBaseConnection dbc = null;  
    private IvoDemo dao = null;  
    public voDemoDAOProxy() {       //构造方法,实例化连接,同时实例化dao对象  
        try {  
            this.dbc = new DateBaseConnection();    // 连接数据库  
        } catch (Exception e) {  
            // TODO Auto-generated catch block  
            e.printStackTrace();  
        }  
        this.dao = new voDemoDAOImpl(this.dbc.getConnection());  //实例化真实主题类  
    }  
    public boolean findLogin(voDemo vodemo) throws Exception{  // 实现接口中的方法。  
        boolean flag = false; //定义标志位  
        try{  
            flag = this.dao.findLogin(vodemo);  // 调用真实主题  
        }catch(Exception e){                    
            throw e;                           //向上抛出异常  
        }finally{  
            this.dbc.close();  
        }  
        return flag; //返回标记  
    }  
      
}  

4.7DAO工厂实现类操作,代码如下:

package org.lxh.factory;

import org.lxh.dao.IvoDemo;
import org.lxh.dao.Proxy.voDemoDAOProxy;

public class DAOFactory {
	public static IvoDemo getIvoDemoDAOInstance() throws Exception{
		return new voDemoDAOProxy();
	}
}

4.8定义servlet类操作,代码如下:

package org.lxh.servlet;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.lxh.VO.voDemo;
import org.lxh.factory.DAOFactory;

public class LoginServlet extends HttpServlet {  
	  
    private static final long serialVersionUID = 1L;   
    public void doGet(HttpServletRequest request, HttpServletResponse response)  
            throws ServletException, IOException {  
  
        String path = "login.jsp";             
        String userid = request.getParameter("userid"); //接收userid的内容  
        String userpass = request.getParameter("userpass"); //接收userpass的内容  
        List<String> info = new ArrayList<String>();   // 保存返回信息  
        //判断输入为空的情况  
        if(userid == null || "".equals(userid)){      
            info.add("用户id不能为空");  
        }  
        if(userpass == null || "".equals(userpass)){  
            info.add("密码不能为空");  
        }  
        //用户名密码验证通过  
        if(info.size() == 0){  
            voDemo vodemo = new voDemo();      //实例化vo  
            vodemo.setUserid(userid);      //设置userid  
            vodemo.setPassword(userpass);  //设置userpass  
            try {  
                if(DAOFactory.getIvoDemoDAOInstance().findLogin(vodemo)){ //验证通过  
                    info.add("通过验证" + vodemo.getName() + "已登录");  
                }else{  
                    info.add("登录失败");  
                }  
            } catch (Exception e) {  
                // TODO: handle exception  
                e.printStackTrace();  
            }     
        }  
        request.setAttribute("info", info);     
        request.getRequestDispatcher(path).forward(request, response); //跳转  
    }  
   
    public void doPost(HttpServletRequest request, HttpServletResponse response)  
            throws ServletException, IOException {  
  
        this.doGet(request, response);  // 调用doGet操作  
    }  
  
}  

4.9定义JSP显示页面,代码如下:

<%@ page contentType = "text/html" pageEncoding="GBK" import = "java.util.*"%>  
  
<html>  
  <head>  
      
    <title>www.thystar.com</title>  
    <script language = "JavaScript">  
      
        function validate(f){  
            if(!(/^w{1,15}$/.test(f.userid.value))){  
                alert("用户ID必须是1~15位");  
                f.userid.focus();  
                return false;  
            }  
            if(!(/^w{1,15}$/.test(f.userpass.value))){  
                alert("密码必须是1~15位");  
                f.userpass.focus();  
                return false;  
            }  
            return true;  
        }  
    </script>  
  
  </head>  
    
  <body>  
    <h2>用户登录</h2>  
     <%  
        request.setCharacterEncoding("GBK");  
     %>  
     <%  
        List<String> info=(List<String>)request.getAttribute("info");  
        if(info != null){  
            Iterator<String> iter = info.iterator();  
            while(iter.hasNext()){  
     %>  
                <h4><%= iter.next() %></h4>  
     <%  
            }  
        }  
     %>  
     <form action="LoginServlet" method="post" onSubmit = "validate(this)">  
       
        用户ID: <input type = "text" name = "userid"><br>  
        密&nbsp;码:<input type = "password" name="userpass"><br>  
        <input type = "submit" value = "登录">  
        <input type = "reset" value = "重置">  
     </form>  
  </body>  
</html>

实现代码图:

原文地址:https://www.cnblogs.com/x-ll123/p/7281126.html