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
分享到:
相关推荐
DAO设计模式可以通过采用抽象工厂和工厂方法模式来变得非常的灵活. 当底层数据存储实现不需要发生改变时,该策略可以使用工厂方法设计模式实现,来产生应用中所需的DAO. 当底层数据储存实现不得不发生变化的时候, ...
DAO设计模式是属于J2EE数据层的操作,使用DAO设计模式可以简化大量代码,增强程序的可移植性。
J2EE学习笔记--DAO设计模式基础.txt
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模式 DAO设计模式 DAO的理解 1、DAO其实是利用组合工厂模式来解决问题的,并没有带来新的功能,所以学的 其实就是个思路。 2、DAO理论上是没有层数限制的。 3、DAO的各层理论上是没有先后的。 DAO...
Java DAO 设计模式.pdf j2ee
j2ee 架构设计 第一部份:介绍实例架构 结合实例讲解Web项目总体结构 分析多层结构优点 具体讲解每个层次的实现技巧 第二部分:介绍组织层次关联利器(Spring) 快速入门 Factory模式 IOC模式 AOP模式 演练Spring的...
在经典的J2EE四层体系结构的基础上增加数据...应用DAO设计模式在业务逻辑层与持久层之间设计了多源数据访问组件,抽象和封装了对不同数据源的数据访问操作,实现对不同类型、结构、环境、用法的异构数据库的统一访问。
本文主要讲解当前流行的J2EE设计模式——DAO设计模式,包括接口的设计、工厂设计模式的应用,重点阐述的是J2EE中层的概念
第五部分:介绍数据持久层利器(HIbernate) 快速入门 介绍辅助工具 表与表之间关联操作 多数据库操作 事务管理 DAO模式 与Spring结合使用 第六部分:介绍软件测试与部署 借助Junit的单元测试 借助Ant的自动部署
开源框架Hibernate 技术,结合DAO 设计模式。用Spring 的IOC 和AOP 技术对持 久层和业务逻辑层对象进行管理,为web 应用提供事务管理等基础服务。在表示层 使用了J2EE 新兴框架JSF,实现高效灵活的web 端开发。
教务管理系统源码+项目说明(javaweb项目)(运行环境:window系统,Apache Tomcat v7.0.84、JDK1.8 开发环境:J2EE eclipse、navicat for mysql 运用的技术:MVC设计模式、DAO模式、Servlet、JSP、Filter).zip ...
在核心J2EE模式中是这样介绍DAO模式的:为了建立一个健壮的J2EE应用,应该将所有对数据源的访问操作抽象封装在一个公共API中。用程序设计的语言来说,就是建立一个接口,接口中定义了此应用程序中将会用到的所有事务...
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开发...
3. Web服务器:Tomcat 5.5及以上版本,配合MVC设计模式及 Hibernate开发架构; 4. 客户端运行环境:能运行IE 5以上或Netscape 5以上浏览器的操作系统,配合使用Ajax技术; 5. 客户端运行工具:目前的系统采用...
用Java实现23种设计模式 1. 创建型模式 工厂模式(Factory Pattern) 抽象工厂模式(Abstract Factory Pattern) 单例模式(Singleton Pattern) 建造者模式(Builder Pattern) 原型模式(Prototype Pattern)...
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 下表中描述测试中发现的...
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开发...