• 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>
    

    实现代码图:

  • 相关阅读:
    navicat 连接 mysql 出现Client does not support authentication protocol requested by server解决方案
    oracle的concat、convert、listagg函数(字符串拼接和类型转换)
    oracle的decode、sign、nvl,case...then函数
    where、having区别
    Oracle的rollup、cube、grouping sets函数
    IP地址,子网掩码,网段表示法,默认网关,DNS服务器详解,DNS域名设计
    springmvc 参数解析绑定原理
    eclipse运行mapreduce的wordcount
    linux命令帮助 man bash
    shell学习笔记3-后台执行命令
  • 原文地址:https://www.cnblogs.com/x-ll123/p/7281126.html
Copyright © 2020-2023  润新知