DAO设计模式-2

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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值