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>

 

 

 

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值