DAO设计模式-1

来源:互联网 发布:c 程序员招聘要求 编辑:程序博客网 时间:2024/05/17 16:11

DAO设计模式简介

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


企业分层架构

1):客户层:因为现在都采用了B/S开发架构,所以一般都使用浏览器进行访问。

2):显示层:使用JSP/Servlet进行页面效果的显示。

3):业务层:(Business Object,业务对象):会将多个原子性的DAO操作进行组合,组合

     成一个完整的业务逻辑。

4):数据层:(DAO):提供多个原子性的DAO操作,例如:增加、修改、删除等,都属

     于原子性的操作。


    资源层主要是数据库的操作层,里面可以进行各种的数据存储,但是这些数据存储操作的时候肯定依靠SQL语句,之前也发现了,如果在一个程序中出现了过多的SQL语句的直接操作,则JSP页面变得相当的复杂,而且也不便于程序的可重用性。

    可以通过一个专门的数据库的操作组件完成,那么这个就是数据层的功能。

    业务层是整个项目的核心。


DAO组成

在整个DAO中,实际上都是以接口为操作标准的,即:客户端依靠DAO实现的接口进行操作,而服务器端要将接口进行具体的实现,DAO由以下几个部分组成:

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

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

3):DAO:主要定义操作的接口,定义一系列数据库的原子性操作,例如:增加、修改、删除、按ID查询等;

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

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

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


在本程序之中,由于操作较多,下面只讲解核心部分的操作,核心部分就是增加数据,查询全部数据,根据关键字查询。

在接口中的命名是很有规律的,以后的所有编写的程序一定要注意开头:

1):数据库的更新操作:doXXX;

2):查询:findXXX、getXXX。


下面有一张表:

DROP TABLE user ; -- 删除表

CREATE TABLE user(

  id              INT             PRIMARY KEY ,

  name            VARCHAR(30)     NOT NULL ,

  password        VARCHAR(32)     NOT NULL ,

  age             INT             NOT NULL ,

  sex             VARCHAR(2)      DEFAULT '男' ,

  birthday        DATE

 ) ;

插入数据的格式如下:

INSERT INTO user(id,name,password,age,sex,birthday) VALUES (001,'斜雨','skewrain

',23,'男','2013-08-27') ;

 

按照以上的DAO组成的顺序,我们给出的代码如下:

【DatabaseConnection.java的内容如下:】

package com.skewrain.demo1.dbc;

import java.sql.Connection;

import java.sql.DriverManager;

public class DatabaseConnection{

    private static final String DBDRIVER = "org.gjt.mm.mysql.Driver";

    private static final String DBURL = "jdbc:mysql://localhost:3306/skewrain";

    private static final String DBUSER = "root";

    private static final String DBPASSWORD = "mysqladmin";

    private Connection conn;

    public DatabaseConnection() throws Exception{

        Class.forName(DBDRIVER);

        this.conn=DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD);

    }

    public Connection getConnection(){

        return this.conn;

    }

    public void close() throws Exception{

        if(this.conn != null){

            try{

                this.conn.close();

            }catch(Exception e){

                throw e;

            }

        }

    }

}

【User.java的内容如下:】

package com.skewrain.demo1.vo;

import java.util.Date;

public class User{

    private int id;

    private String name;

    private String password;

    private int age;

    private String sex;

    private Date birthday;

    public void setId(int id){

        this.id = id;

    }

    public void setName(String name){

        this.name = name;

    } 

    public void setPassword(String password){

        this.password = password;

    }

    public void setAge(int age){

        this.age = age;

    }

    public void setSex(String sex){

        this.sex = sex;

    }

    public void setBirthday(Date birthday){

        this.birthday = birthday;

    }

    public int getId(){

        return this.id;

    }

    public String getName(){

        return this.name;

    }

    public String getPassword(){

        return this.password;

    }

    public int getAge(){

        return this.age;

    }

    public String getSex(){

        return this.sex;

    }

    public Date getBirthday(){

        return this.birthday;

    }

}

【IUserDAO.java的内容如下:】

package com.skewrain.demo1.dao;

import java.util.*;

import com.skewrain.demo1.vo.*;

public interface IUserDAO{

    public boolean doCreate(User user)throws Exception;

    public List<User> findAll(String keyWord) throws Exception;

    public User findById(int id) throws Exception;

}

有了接口之后,下面要定义的肯定是具体的实现类。

【UserDAOImpl.java的内容如下:】

package com.skewrain.demo1.impl;

import java.util.*;

import java.sql.*;

import com.skewrain.demo1.dao.*;

import com.skewrain.demo1.vo.*;

 

public class UserDAOImpl implements IUserDAO {

    private Connection conn = null;

    private PreparedStatement pstmt = null;

    public UserDAOImpl(Connection conn){

        this.conn = conn;

    }

    public boolean doCreate(User user) throws Exception{

        boolean flag = false;

        String sql = "INSERT INTO 

               user(id,name,password,age,sex,birthday) VALUES(?,?,?,?,?,?)";

        this.pstmt = this.conn.prepareStatement(sql);

        this.pstmt.setInt(1,user.getId());

        this.pstmt.setString(2,user.getName());

        this.pstmt.setString(3,user.getPassword());

        this.pstmt.setInt(4,user.getAge());

        this.pstmt.setString(5,user.getSex());

        this.pstmt.setDate(6,new java.sql.Date(user.getBirthday().getTime()));

        if(this.pstmt.executeUpdate() > 0){

            flag = true;

        }

        this.pstmt.close();

        return flag;

    }

    public List<User> findAll(String keyWord) throws Exception{

        List<User> all = new ArrayList<User>();             

        String sql = "SELECT id,name,password,age,sex,birthday 

                     FROM user WHERE id LIKE ? OR name LIKE ?";

        this.pstmt = this.conn.prepareStatement(sql);

        this.pstmt.setString(1,"%"+keyWord+"%");

        this.pstmt.setString(2,"%"+keyWord+"%");

        ResultSet rs = this.pstmt.executeQuery();

        User user = null;

        while(rs.next()){

            user = new User();

            user.setId(rs.getInt(1));

            user.setName(rs.getString(2));

            user.setPassword(rs.getString(3));

            user.setAge(rs.getInt(4));

            user.setSex(rs.getString(5));

            user.setBirthday(rs.getDate(6));

            all.add(user);

        }

        this.pstmt.close();

        return all;

    }

    public User findById(int id) throws Exception{

        User user = null;

        String sql = "SELECT id,name,password,age,sex,birthday 

                     FROM user WHERE id LIKE ?";

        this.pstmt = this.conn.prepareStatement(sql);

        this.pstmt.setInt(1,id);

        ResultSet rs = this.pstmt.executeQuery();

        if(rs.next()){

            user = new User();

            user.setId(rs.getInt(1));

            user.setName(rs.getString(2));

            user.setPassword(rs.getString(3));

            user.setAge(rs.getInt(4));

            user.setSex(rs.getString(5));

            user.setBirthday(rs.getDate(6));

        }

        this.pstmt.close();

        return user;

    }

}

【UserDAOProxy.java的内容如下:】

package com.skewrain.demo1.proxy;

import java.util.*;

import java.sql.*;

import com.skewrain.demo1.dbc.*;

import com.skewrain.demo1.impl.*;

import com.skewrain.demo1.vo.*;

import com.skewrain.demo1.dao.*;

 

public class UserDAOProxy implements IUserDAO {

    private DatabaseConnection dbc = null;

    private IUserDAO dao = null;

    public UserDAOProxy() throws Exception {

        this.dbc = new DatabaseConnection();

        this.dao = new UserDAOImpl(this.dbc.getConnection());

    }

    public boolean doCreate(User user) throws Exception{

        boolean flag = false;

        try{

            if(this.dao.findById(user.getId())== null){

                flag = this.dao.doCreate(user);

            }

        }catch(Exception e){

            throw e;

        }finally{

            this.dbc.close();

        }

        return flag;

    }

    public List<User> findAll(String keyWord) throws Exception{

        List<User> all = null;

        try{

            all = this.dao.findAll(keyWord);

        }catch(Exception e){

            throw e;

        }finally{

            this.dbc.close();

        }

        return all;

    }

    public User findById(int id) throws Exception{

        User user = null;

        try{

            user = this.dao.findById(id);

        }catch(Exception e){

            throw e;

       }finally{

       this.dbc.close();

        }

        return user;

    }

}

【DAOFactory.java的内容如下所示:】

package com.skewrain.demo1.factory;

import com.skewrain.demo1.dao.IUserDAO;

import com.skewrain.demo1.proxy.UserDAOProxy;

public class DAOFactory {

    public static IUserDAO getIUserDAOInstance() throws Exception{

        return  new UserDAOProxy();

    }

}

下面是两个测试程序:

【TestDAOInsert.java的内容如下:】

package com.skewrain.demo1.test;

import com.skewrain.demo1.factory.DAOFactory;

import com.skewrain.demo1.vo.*;

public class TestDAOInsert {

    public static void main(String args[])throws Exception{

        User user = null;

        for(int x=0;x<5;x++){

            user = new User();

            user.setId(1000 + x);

            user.setName("斜雨-" + x);

            user.setPassword("123-" + x);

            user.setAge(18 + x);

            user.setSex("男");

            user.setBirthday(new java.util.Date());

            DAOFactory.getIUserDAOInstance().doCreate(user);

        }

    }

}

执行此程序后,可以向数据库表中增加记录。

原始的数据库表中的数据如下:


执行TestDAOInsert.java的结果如下:


【TestDAOSelect.java的内容如下:】

package com.skewrain.demo1.test;

import java.util.*;

import com.skewrain.demo1.factory.DAOFactory;

import com.skewrain.demo1.vo.*;

public class TestDAOSelect {

    public static void main(String args[])throws Exception{

        List<User> all = DAOFactory.getIUserDAOInstance().findAll("");

        Iterator<User> iter = all.iterator();

        while(iter.hasNext()){

            User user = iter.next();

            System.out.println(user.getId() + "、" + user.getName() + "-->" + user.getPassword());

        }

    }

}

执行此程序,可以将数据库表中的内容在终端输出。


当DAO开发完成之后,下面就可以利用JSP完成DAO的程序的调用。

一个JSP页面绝对不允许导入SQL包,如果有可能,最好一个包都不导入。

【user_insert.jsp的内容如下:】

<%@page contentType = "text/html" pageEncoding="GBK"%>

<html>

<head><title>www.baidu.com</title></head>

<body>

<form action="user_insert_do.jsp" method="post">

    用户编号:<input type="text" name="id"><br>

    用户姓名:<input type="text" name="name"><br>

    用户密码:<input type="text" name="password"><br>

    用户年龄:<input type="text" name="age"><br>

    用户性别:<input type="text" name="sex"><br>

    用户生日:<input type="text" name="birthday"><br>

    <input type="submit" value="注册">

    <input type="reset" value="重置">

</body>

</html>

【user_insert_do.jsp的内容如下:】

<%@ page contentType="text/html" pageEncoding="GBK"%>

<%@ page import="com.skewrain.demo1.factory.*,com.skewrain.demo1.vo.*"%>

<%@ page import="java.text.*"%>

<html>

<head><title>www.baidu.com</title></head>

<%   request.setCharacterEncoding("GBK");  %>

<body>

<%   

     User user = new User();

     user.setId(Integer.parseInt(request.getParameter("id")));

     user.setName(request.getParameter("name"));

     user.setPassword(request.getParameter("password"));

     user.setAge(Integer.parseInt(request.getParameter("age")));

     user.setSex(request.getParameter("sex"));

     user.setBirthday(new SimpleDateFormat("YYYY-MM-DD").parse(request.getParameter("birthday")));

     try{

         if(DAOFactory.getIUserDAOInstance().doCreate(user)){

%>

            <h3>雇员信息添加成功!</h3>

<%

         }else{

%>

            <h3>雇员信息添加失败!</h3>

<%

         }

%>

<%

    }catch(Exception e){

       e.printStackTrace();

    }

%>

</body>

</html>

执行user_insert.jsp的结果如下:


点击“注册”后,在浏览器和数据库表中分别发现如下记录:


数据库表中增加的记录如下:


【user_list.jsp的内容如下:】

<%@ page contentType="text/html" pageEncoding="GBK"%>

<%@ page import="com.skewrain.demo1.factory.*,com.skewrain.demo1.vo.*"%>

<%@ page import="java.util.*"%>

<html>

<head><title>www.baidu.com</title></head>

<%  request.setCharacterEncoding("GBK"); %>

<body>

<%

    String keyWord = request.getParameter("kw");

    if(keyWord == null){

        keyWord = ""; //如果没有查询关键字,则查询全部。

}

    List<User> all = DAOFactory.getIUserDAOInstance().findAll(keyWord);

    Iterator<User> iter = all.iterator();

%>

<center>

<form action="user_list.jsp" method="post">

     请输入查询关键字:<input type="text" name="kw">

     <input type="submit" value="查询">

</form>

<table border="1" width="80%">

     <tr>

         <td>用户编号</td>

         <td>用户姓名</td>

         <td>用户密码</td>

         <td>用户年龄</td>

         <td>用户性别</td>

         <td>用户生日</td>

     </tr>

<%

     while(iter.hasNext()){

         User user = iter.next();

%>

     <tr>

         <td><%=user.getId()%></td>

         <td><%=user.getName()%></td>

         <td><%=user.getPassword()%></td>

         <td><%=user.getAge()%></td>

         <td><%=user.getSex()%></td>

         <td><%=user.getBirthday()%></td>

     </tr>

<%

     }

%>

</table>

</center>

</body>

</html>

执行此段代码的结果如下:


当在查询栏中输入“斜雨”,点击“查询”之后的结果如下:



可以发现,使用JSP+DAO的开发后,程序变得更加的清晰,而且以后所有的数据层操作也可以任意的移植,不一定非要在JSP上使用了。


使用JSP+JavaBean的开发模式也称为Model1,通过JSP显示,通过JSP完成功能,达到显示和数据操作的相分离。


小结:

1.DAO属于数据层操作;

2.DAO的各个组成部分;

3.使用JSP+DAO可以将数据操作交给JavaBean完成。


0 0
原创粉丝点击