`
勤业思行
  • 浏览: 81996 次
  • 性别: Icon_minigender_1
  • 来自: 贵阳
社区版块
存档分类
最新评论

DAO设计模式:J2EE数据层操作

阅读更多

DAO(Data Access Objects)设计模式是属于J2EE体系架构中的数据层的操作。

一、为什么要用DAO?

     比较在JSP页面中使用JDBC来连接数据库,这样导致了JSP页面中包含了大量的HTML代码和JSP代码,将显示和功能代码混在一起,难以维护。并且在JSP页面中使用JDBC代码,必须导入相应的"java.sql.*"包。基于使得JSP页面专注于数据的表现的思想,我们只是希望JSP主要负责数据的显示,而不需要关注数据的来源和途径。同时在JSP进行JDBC操作,重复编码太多。如,不同的页面连接同一个数据库时需要在每个页面中都进行JDBC编码。

  DAO设计模式提供了一种通用的模式,来简化大量的代码,增强程序的可移植性。

 

二、DAO组成

  DAO由5个重要部分组成:数据库连接类、VO、DAO接口、DAO实现类和DAO工厂类。

 


1、数据库连接类(DBConn):一个Java类。负责与后台数据库进行连接。提供了至少三个方法:

   构造方法 public DBConn():进行数据库连接,得到一个Connection对象。

   返回数据库连接Connection的public Connection getConnection():提供一个外部获取连接的方法,返回一个Connection对象。

   关闭数据库连接public void close():关闭数据库连接,Connection对象调用close方法。。

 

在JDBC中,进行数据库连接需要四个参数:数据库驱动类DBDriver、数据库连接URL、用户名、密码。注意需要在项目的构建路径下放入相应的数据库连接驱动软件包。

 

例:连接MySQL数据库下的JavaWeb数据库,用户名为root、密码为admin。

 DataBaseConnection.java

 

 

package db;

import java.sql.* ;

// 主要功能就是连接数据库、关闭数据库
public class DataBaseConnection{
	//定义数据库驱动类
	private final String DBDRIVER = "com.mysql.jdbc.Driver" ;
	//定义数据库连接URL
	private final String DBURL = "jdbc:mysql://localhost:3306/javaweb" ;
	//定义数据库连接用户名
	private final String DBUSER = "root" ;
	//定义数据库连接密码
	private final String DBPASSWORD = "admin" ;
	//定义数据库连接对象
	private Connection conn = null ;
	//构造方法,加载驱动
	public DataBaseConnection(){
		try{
			Class.forName(DBDRIVER) ;
			this.conn = DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD) ;	
		}
		catch (Exception e){
			System.out.println("加载驱动失败");
		}
	}
	// 取得数据库连接
	public Connection getConnection(){
		return conn ;
	}
	// 关闭数据库连接
	public void close(){
		try{
			conn.close() ;
		}catch (Exception e){
			System.out.println("数据库连接关闭失败");
		}		
	}
}

 

 

 同样,需要在项目的构建路径下放入Mysql的JDBC数据库驱动包:mysql-connector-java.jar.在附件中已上传了相应Jar包。

 

 

 

 

 

 

 

 

 

 

 

 

 

2、VO(Value Objects)值对象:与数据库表一一对应的Java类。含有与数据库表字段一一对应的属性,相应属性的getter和setter方法。甚至还有一些验证方法。VO提供了一个面向对象的方法来操作数据库。以后我们的DAO接口就是通过调用VO来进行数据库操作的。

例:对应于数据库表T_User:三个字段,id、username、password。相应的VO类

User.java

package db;

public class User {
	//用户id
	private int userid;
	//用户姓名
	private String username;
	//用户密码
	private String password;
	//获得用户id
	public int getUserid(){
		return userid;
	}
	//设置用户id
	public void setUserid(int userid){
		this.userid = userid;
	}
	//获得用户名
	public String getUsername() {
		return username;
	}
	//设置用户名
	public void setUsername(String username) {
		this.username = username;
	}
	//获得用户密码
	public String getPassword() {
		return password;
	}
	//设置用户密码
	public void setPassword(String password) {
		this.password = password;
	}
}

 

 

3、DAO接口:定义了所有的用户的操作,如添加记录、删除记录和查询记录等。这不是一个具体的实现类,而是一个接口,仅仅定义了相应的操作(方法),这是给后来的具体实现提供一种灵活性和易维护性。具体的实现需要具体实现类实现这个接口的方法来实现。

例:对上面的T_User表进行CRUD操作。

UserDAO.java

package db ;

import java.util.* ;

// 定义数据库操作方法
public interface UserDAO{
	// 增加操作
	public void insert(User user) throws Exception ;
	// 修改操作
	public void update(User user) throws Exception ;
	// 删除操作
	public void delete(int userid) throws Exception ;
	// 按ID查询操作
	public User queryById(int userid) throws Exception ;
	// 查询全部
	public List queryAll() throws Exception ;
}

  

 

4、DAO实现类:这里才是具体的操作的实现。需要实现DAO接口以及相应的方法。

同样,一个DAO接口可以由多个实现。例如,上例中的可以有Mysql数据库来实现,也可以使用oracle数据库来实现。

同理,也可以是对同一数据库的不同实现。

例:DAO的Mysql实现。

UserDAOImpl.java

package db;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.javaweb.ch08.Person;

public class UserDAOImpl implements UserDAO {
	//添加操作
	public void insert(User user) throws Exception {
		String sql = "INSERT INTO user(username,password) VALUES(?,?)" ;
		PreparedStatement pstmt = null ;
		DataBaseConnection dbc = null ;
		// 下面是针对数据库的具体操作
		try{
			// 连接数据库
			dbc = new DataBaseConnection() ;
			pstmt = dbc.getConnection().prepareStatement(sql) ;
			pstmt.setString(1, user.getUsername());
			pstmt.setString(2, user.getPassword());
			// 进行数据库更新操作
			pstmt.executeUpdate() ;
			pstmt.close() ;
		}catch (Exception e){
			throw new Exception("操作出现异常") ;
		}
		finally{
			// 关闭数据库连接
			dbc.close() ;
		}
	}
	//修改操作
	public void update(User user) throws Exception {
		String sql = "UPDATE user SET username=?,password=? WHERE userid=?" ;
		PreparedStatement pstmt = null ;
		DataBaseConnection dbc = null ;
		// 下面是针对数据库的具体操作
		try{
			// 连接数据库
			dbc = new DataBaseConnection() ;
			pstmt = dbc.getConnection().prepareStatement(sql) ;			
			pstmt.setString(1, user.getUsername());
			pstmt.setString(2, user.getPassword());
			pstmt.setInt(3,user.getUserid());
			// 进行数据库更新操作
			pstmt.executeUpdate() ;
			pstmt.close() ;
		}
		catch (Exception e){
			throw new Exception("操作出现异常") ;
		}
		finally{
			// 关闭数据库连接
			dbc.close() ;
		}
	}
	//删除操作
	public void delete(int userid) throws Exception {
		String sql = "DELETE FROM user WHERE userid=?" ;
		PreparedStatement pstmt = null ;
		DataBaseConnection dbc = null ;
		// 下面是针对数据库的具体操作
		try{
			// 连接数据库
			dbc = new DataBaseConnection() ;
			pstmt = dbc.getConnection().prepareStatement(sql) ;			
			pstmt.setInt(1,userid) ;
			// 进行数据库更新操作
			pstmt.executeUpdate() ;
			pstmt.close() ;
		}catch (Exception e){
			throw new Exception("操作出现异常") ;
		}
		finally{
			// 关闭数据库连接
			dbc.close() ;
		}
	}
	//按ID查询
	public User queryById(int userid) throws Exception {
		User user = null ;
		String sql = "SELECT * FROM user WHERE userid=?" ;
		PreparedStatement pstmt = null ;
		DataBaseConnection dbc = null ;
		// 下面是针对数据库的具体操作
		try{
			// 连接数据库
			dbc = new DataBaseConnection() ;
			pstmt = dbc.getConnection().prepareStatement(sql) ;			
			pstmt.setInt(1, userid);
			// 进行数据库查询操作
			ResultSet rs = pstmt.executeQuery() ;
			if(rs.next())
			{
				// 查询出内容,之后将查询出的内容赋值给user对象
				user = new User() ;
				user.setUserid(rs.getInt(1));
				user.setUsername(rs.getString(2));
				user.setPassword(rs.getString(3));
			}
			rs.close() ;
			pstmt.close() ;
		}catch (Exception e){
			throw new Exception("操作出现异常") ;
		}
		finally{
			// 关闭数据库连接
			dbc.close() ;
		}
		return user ;
	}
	public List<User> queryAll() throws Exception {
		List<User> all = new ArrayList<User>() ;
		String sql = "SELECT * FROM user " ;
		PreparedStatement pstmt = null ;
		DataBaseConnection dbc = null ;

		// 下面是针对数据库的具体操作
		try{
			// 连接数据库
			dbc = new DataBaseConnection() ;
			pstmt = dbc.getConnection().prepareStatement(sql) ;	
			// 进行数据库查询操作
			ResultSet rs = pstmt.executeQuery() ;
			while(rs.next()){
				// 查询出内容,之后将查询出的内容赋值给user对象
				User user = new User() ;
				user.setUserid(rs.getInt(1));
				user.setUsername(rs.getString(2));
				user.setPassword(rs.getString(3));

				// 将查询出来的数据加入到List对象之中
				all.add(user) ;
			}
			rs.close() ;
			pstmt.close() ;
		}
		catch (Exception e){
			throw new Exception("操作出现异常") ;
		}
		finally{
			// 关闭数据库连接
			dbc.close() ;
		}
		return all ;
	}
}

  

5、DAO工厂类:在没有DAO工厂类的情况下,必须通过创建DAO实现类的实例才能完成数据库的操作。这时要求必须知道具体的实现子类,对于后期的修改十分不便。如后期需要创建一个该DAO接口的Oracle实现类。这时就必须修改所有使用DAO实现类的代码。如果使用DAO工厂类的一个静态方法(不需要创建对象即可调用)来获取DAO实现类实例,这时替换DAO实现类,只需修改DAO工厂类中的方法代码,而不需要修改所有的调用DAO实现的代码。

DAO工厂类是一个单例模式,这样避免的数据库的不一致。

例:通过DAO工厂类来获取具体的DAO实现类。

DAOFactory.java

package db;

public class DAOFactory{
	public static UserDAO getUserDAOInstance(){
		return new UserDAOImpl() ;
	}
}

  

这里若改变为Oracle实现类UserDAOOracleImpl来实现DAO,只需在DAOFactory中修改

package db;

public class DAOFactory{
	public static UserDAO getUserDAOInstance(){
		return new UserDAOOracleImpl() ;
	}
}

 

 有了上面五个部分,就可以通过DAO工厂类获取DAO实现类实例。通过调用DAO实现类实例中的方法就可以完成相应的数据库的CRUD操作。

 

三、表示层调用通过DAO工厂类获取DAO实现类实例的方法完成相应的操作。

1、添加记录:AddUserDemo.jsp

<%@ page language="java" contentType="text/html;charset=gb2312"%>
<%@ page import="db.*"%>
<html>
<head>
	<title>添加用户记录</title>
</head>
<body>
	<%
		//通过DAO工厂获得DAO实现类实例
		UserDAO userDAO = DAOFactory.getUserDAOInstance();
		//设置需要添加的用户
		User user = new User();
		user.setUsername("dao");
		user.setPassword("123");
		userDAO.insert(user);
	%>
</body>
</html>

 

2、更新记录:UpdateUserDemo.jsp

 

<%@ page language="java" contentType="text/html;charset=gb2312"%>
<%@ page import="db.*"%>
<html>
<head>
	<title>更新用户记录</title>
</head>
<body>
	<%
		//通过DAO工厂获得DAO实现类实例
		UserDAO userDAO = DAOFactory.getUserDAOInstance();
		//设置需要更新的用户
		User user = new User();
		user.setUserid(10);
		user.setUsername("dao");
		user.setPassword("123456");
		//执行更新操作
		userDAO.update(user);
	%>
</body>
</html>

 

3、删除记录:DeleteUserDemo.jsp

<%@ page language="java" contentType="text/html;charset=gb2312"%>
<%@ page import="db.*"%>
<html>
<head>
	<title>删除用户记录</title>
</head>
<body>
	<%
		//通过DAO工厂获得DAO实现类实例
		UserDAO userDAO = DAOFactory.getUserDAOInstance();
		//执行删除操作
		userDAO.delete(10);
	%>
</body>
</html>

 

4、按ID查询记录:QueryByIdDemo.jsp

<%@ page language="java" contentType="text/html;charset=gb2312"%>
<%@ page import="db.*"%>
<html>
<head>
	<title>按ID查询记录</title>
</head>
<body>
	<%
		//通过DAO工厂获得DAO实现类实例
		UserDAO userDAO = DAOFactory.getUserDAOInstance();
		//指定按ID查询
		User user = userDAO.queryById(2);
		out.println("用户名:" + user.getUsername() + "<br>");
		out.println("密码:" + user.getPassword());
	%>
</body>
</html>

 

5、查询所有记录:QueryAllUserDemo.jsp

<%@ page language="java" contentType="text/html;charset=gb2312"%>
<%@ page import="db.*"%>
<%@ page import="java.util.*"%>
<html>
<head>
	<title>查询所有记录</title>
</head>
<body>
	<%
		//通过DAO工厂获得DAO实现类实例
		UserDAO userDAO = DAOFactory.getUserDAOInstance();
		//查询所有用户
		List<User> all = userDAO.queryAll();
		Iterator<User> iter = all.iterator();
		//遍历输出所有用户信息
		while(iter.hasNext()) {
			User user = iter.next();
			out.println("用户名:" + user.getUsername());
			out.println(",密码:" + user.getPassword() + "<br>");
		}
	%>
</body>
</html>

 

 

 

  • 大小: 11.2 KB
0
0
分享到:
评论
2 楼 挨踢人员007 2012-03-10  
写的很详细啊,赞一个
1 楼 pweffort 2010-04-29  
看看..

  呵呵!!

相关推荐

    J2EE之DAO设计模式

    DAO设计模式可以通过采用抽象工厂和工厂方法模式来变得非常的灵活. 当底层数据存储实现不需要发生改变时,该策略可以使用工厂方法设计模式实现,来产生应用中所需的DAO. 当底层数据储存实现不得不发生变化的时候, ...

    DAO设计模式及源码

    DAO设计模式是属于J2EE数据层的操作,使用DAO设计模式可以简化大量代码,增强程序的可移植性。

    J2EE学习笔记--DAO设计模式基础.txt

    J2EE学习笔记--DAO设计模式基础.txt

    《程序天下:J2EE整合详解与典型案例》光盘源码

    2.1.1 MVC模式的设计思想 2.1.2 MVC模式的处理过程 2.2 Model规范 2.2.1 Model1规范 2.2.2 Model2规范 2.3 使用MVC的优劣 2.3.1 使用MVC模式的好处 2.3.2 使用MVC模式的不足之处 2.4 目前市场上常见的轻量级J2EE开发...

    java设计模式:DAO模式.doc

    java设计模式:DAO模式 DAO设计模式 DAO的理解 1、DAO其实是利用组合工厂模式来解决问题的,并没有带来新的功能,所以学的 其实就是个思路。 2、DAO理论上是没有层数限制的。 3、DAO的各层理论上是没有先后的。 DAO...

    Java DAO 设计模式.pdf

    Java DAO 设计模式.pdf j2ee

    j2ee 架构设计 (SSH典型结构解析)

    j2ee 架构设计 第一部份:介绍实例架构 结合实例讲解Web项目总体结构 分析多层结构优点 具体讲解每个层次的实现技巧 第二部分:介绍组织层次关联利器(Spring) 快速入门 Factory模式 IOC模式 AOP模式 演练Spring的...

    论文研究-基于J2EE多层架构的Web开发框架研究.pdf

    在经典的J2EE四层体系结构的基础上增加数据...应用DAO设计模式在业务逻辑层与持久层之间设计了多源数据访问组件,抽象和封装了对不同数据源的数据访问操作,实现对不同类型、结构、环境、用法的异构数据库的统一访问。

    dao设计模式(1)

    本文主要讲解当前流行的J2EE设计模式——DAO设计模式,包括接口的设计、工厂设计模式的应用,重点阐述的是J2EE中层的概念

    J2EE架构设计PPT

    第五部分:介绍数据持久层利器(HIbernate) 快速入门 介绍辅助工具 表与表之间关联操作 多数据库操作 事务管理 DAO模式 与Spring结合使用 第六部分:介绍软件测试与部署 借助Junit的单元测试 借助Ant的自动部署

    基于J2EE架构的生产管理系统设计

    开源框架Hibernate 技术,结合DAO 设计模式。用Spring 的IOC 和AOP 技术对持 久层和业务逻辑层对象进行管理,为web 应用提供事务管理等基础服务。在表示层 使用了J2EE 新兴框架JSF,实现高效灵活的web 端开发。

    教务管理系统源码+项目说明(javaweb项目)(运行环境window系统,Apache Tomcat v7.0.84).zip

    教务管理系统源码+项目说明(javaweb项目)(运行环境:window系统,Apache Tomcat v7.0.84、JDK1.8 开发环境:J2EE eclipse、navicat for mysql 运用的技术:MVC设计模式、DAO模式、Servlet、JSP、Filter).zip ...

    J2EE核心:iBatis_DAO入门与进阶.doc

    在核心J2EE模式中是这样介绍DAO模式的:为了建立一个健壮的J2EE应用,应该将所有对数据源的访问操作抽象封装在一个公共API中。用程序设计的语言来说,就是建立一个接口,接口中定义了此应用程序中将会用到的所有事务...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    2.1.1 MVC模式的设计思想 2.1.2 MVC模式的处理过程 2.2 Model规范 2.2.1 Model1规范 2.2.2 Model2规范 2.3 使用MVC的优劣 2.3.1 使用MVC模式的好处 2.3.2 使用MVC模式的不足之处 2.4 目前市场上常见的轻量级J2EE开发...

    基于J2EE框架的个人博客系统项目毕业设计论文(源码和论文)

    3. Web服务器:Tomcat 5.5及以上版本,配合MVC设计模式及 Hibernate开发架构; 4. 客户端运行环境:能运行IE 5以上或Netscape 5以上浏览器的操作系统,配合使用Ajax技术; 5. 客户端运行工具:目前的系统采用...

    用Java实现23种设计模式

    用Java实现23种设计模式 1. 创建型模式 工厂模式(Factory Pattern) 抽象工厂模式(Abstract Factory Pattern) 单例模式(Singleton Pattern) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern)...

    J2ee 博客系统 毕业设计 课程设计

    5.3.2 Dao层详细类设计 36 5.4 系统主要活动顺序图 39 6 测试计划 41 6.1 编写目的 41 6.2 编写目的 41 6.3 测试问题总结 43 6.4 测试用例执行结果 43 博客用户功能 43 6.5 测试问题解决 44 下表中描述测试中发现的...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (3)

    2.1.1 MVC模式的设计思想 2.1.2 MVC模式的处理过程 2.2 Model规范 2.2.1 Model1规范 2.2.2 Model2规范 2.3 使用MVC的优劣 2.3.1 使用MVC模式的好处 2.3.2 使用MVC模式的不足之处 2.4 目前市场上常见的轻量级J2EE开发...

Global site tag (gtag.js) - Google Analytics