jsp DAO设计模式

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 DataBaseConnection():进行数据库连接,得到一个Connection对象。
返回数据库连接Connection的public Connection getConnection():提供一个外部获取连接的方法,返回一个Connection对象。
关闭数据库连接public void close():关闭数据库连接,Connection对象调用close方法。。

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

连接MySQL数据库下的test数据库,用户名为root、密码为123456。

// 本类只用于数据库连接及关闭操作
package db;  

import java.sql.* ;  

// 主要功能就是连接数据库、关闭数据库
public class DataBaseConnection{
    //定义数据库驱动类
    private final String DBDRIVER = "org.gjt.mm.mysql.Driver";
    //定义数据库连接URL
    private final String DBURL = "jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF8";
    //定义数据库连接用户名
    private final String DBUSER = "root";
    //定义数据库连接密码
    private final String DBPASSWORD = "123456";
    //定义数据库连接对象
    private Connection conn = null ;
    //构造方法,加载驱动
    public DataBaseConnection(){
        try{
            Class.forName(DBDRIVER) ;
            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();   //userid 可以为空,且不是主键,否则会出错
        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> 

原文地址:http://just-do-myself.iteye.com/blog/655227

时间: 2024-12-29 09:52:28

jsp DAO设计模式的相关文章

【设计模式】:Dao设计模式详解及一个简单的项目(AJAX+JSP+Servlet)

迫于课程结束,老师逼着让做课程设计,就简单花了一天的时间写了个使用dao设计模式的东西~ ~ ~顺带在这里讲解下dao设计模式 把写个这个东西的源代码放上来: http://download.csdn.net/detail/u010800530/8273915 先画一个图,这个图可能能够完整表达出dao设计模式的意思,但是可以在下边通过代码看出来: 一.完成登陆功能(未设计AJAX,等到完成显示列表的时候我们做AJAX): 首先,我们建立一个项目TestJSP 然后,我们写一个login.jsp

JSP+DAO设计模

在开发中通常包含显示层.控制层.数据层的操作,DAO设计模式就是将这些操作统一交给JSP或JavaBean来进行处理,将显示操作都写入JSP页面,业务层都写成JavaBean形式,将程序代码封装成组件.JavaBean将负责大部分的数据处理,如执行数据库操作等,再将数据处理后的结果返回至JSP页面上显示,如图1所示. 图1  DAO设计模式流程图 在这个模式中DAO主要完成数据的操作,客户端依靠DAO接口进行操作,服务端要将接口进行具体实现.DAO的主要组成由以下几个部分组成. 1.Databa

JavaBean在DAO设计模式简介

一.信息系统开发框架 客户层-------显示层-------业务层---------数据层---------数据库 1.客户层:客户层是client,简单的来说就是浏览器. 2.显示层:JSP/Servlet,用于给浏览器显示. 3.业务层:对于数据层的原子操作进行整合. 4.数据层:对于数据库进行的原子操作,添加.删除等: 二.DAO(Data Access Object)介绍 DAO应用在数据层那块,用于訪问数据库,对数据库进行操作的类. 三.DAO设计模式的结构 DAO设计模式一般分为几

JavaBean中DAO设计模式介绍

一.信息系统的开发架构 客户层-------显示层-------业务层---------数据层---------数据库 1.客户层:客户层就是客户端,简单的来说就是浏览器. 2.显示层:JSP/Servlet,用于给浏览器显示. 3.业务层:对于数据层的原子操作进行整合. 4.数据层:对于数据库进行的原子操作,增加.删除等: 二.DAO(Data Access Object)介绍 DAO应用在数据层那块,用于访问数据库,对数据库进行操作的类. 三.DAO设计模式的结构 DAO设计模式一般分为几个

JSP+DAO实现数据库的CRUD

今天在看李兴华<JavaWeb实战经典>时候,看到了用JSP+DAO整合起来做了一个数据库的增删改查操作.程序不难,但是具备借鉴意义.一般来说javaweb项目主要操作就是操作数据库,其本质也就是操作数据库.什么mvc,javabean从某种角度都是多余的,如果用户会写sql,那要View干什么,直接数据库查找不就好了? 一般来说可以实现一个最简单BS项目,可以有这么几个模式: 1  JSP + JDBC   这样写jsp里面全是java代码,很不利于维护与扩展. 2  JSP + DAO  

DAO设计模式 -- 使用数据库连接类连接MySql数据库并实现添加用户

1. DAO简介    DAO设计模式是属于J2EE数据库层的操作,使用DAO设计模式可以简化大量代码,增强程序的可移植性. 2. DAO各部分详解    DAO设计模式包括5个重要的部分,分别为数据库连接类,VO类,DAO接口,DAO实现类以及DAO工厂类.   2-1 数据库连接类:    数据库连接类的主要功能就是连接数据库并获得连接对象,以及关闭数据库.通过数据库连接类可以大大地简化开发,在需要进行数据库连接时,只需要创建该类的实例,并调用其中的方法就可以获得数据库连接对象和关闭数据库而

DAO设计模式实现数据库的增删改查(进一步封装JDBC工具类)

一.DAO模式简介 DAO即Data Access Object,数据访问接口.数据访问:故名思义就是与数据库打交道.夹在业务逻辑与数据库资源中间. DAO模式实际上是两个模式的组合,即Data Accessor (数据访问者)模式和 Active Domain Object(领域对象)模式.Data Accessor 模式实现了数据访问和业务逻辑的分离:Active Domain Object 模式实现了业务数据的对象化封装. 需要注意的是,DAO设计模式是Java EE中的设计模式,而非Ja

Java学习之DAO设计模式

DAO设计模式是一个javaEE里的设计模式,DAO是Data Access Object 数据访问接口. 一个典型的DAO实现有三个组件: 1.一个DAO接口 2.一个DAO接口的具体类: 3.数据传递对象(DTO)或者叫值对象(VO)或者叫领域模型(domain)[个人认为就是数据库表里对应的java对象类] 举个例子: 首先在数据库建一个表Person有四个字段id(pk),name,age,desc(描述): 然后建立domain 1 package com.gh.domain; 2 3

JavaWeb技术(二):DAO设计模式

1. DAO全称:Data Access Object , 数据访问对象.使用DAO设计模式来封装数据持久化层的所有操作(CRUD),使得数据访问逻辑和业务逻辑分离,实现解耦的目的. 2. 典型的DAO实现组件:DAO接口 + DAO接口的实现类 3. 事例代码 1)javabean组件:用于数据传输的对象 /** javabean数据传输对象 */ public class Customer { // 和数据库中的表是对应的 private int id; private String nam