您的位置:首页 > 其它

DAO设计模式-1

2014-02-21 22:12 344 查看
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完成。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: