`

JSP复习笔记——第10章 连接数据库 之 DAO设计模式

阅读更多
之前的开发可以发现以下问题:
1、 所有的JDBC代码写在JSP页面之中,维护困难
2、 JSP中不应该使用任何SQL包,即不能在JSP中直接使用java.sql.*,原因是JSP只关注于数据的显示,而不关心数据是从哪儿来,或向哪里存储
3、 所有的数据库操作代码最好使用PreparedStatement

区分:J2EE的组件层次
客户端 表示层  业务层  数据层  数据库
*.jsp/servlet
DAO属于J2EE数据层的操作
即:在DAO中封装一个表在一个项目中所应该具有的所有的操作
create table person
(
id varchar(32) not null primary key,
name varchar(20) not null,
password varchar(20) not null,
age varchar(20) not null,
email varchar(20) not null
);


程序在变更数据库之后,前台页面不会出现过多改变?

首先需要规定出整个模块之中对person表的全部操作:
*增加
*删除
*修改
* 按ID查询
* 查询全部
* 模糊查询

按以上要求,规定出操作此张表的标准,之后只要针对于不同的数据库实现这些标准即可
在JAVA中只有通过接口可以定义出标准   DAO规定的就是一个接口

插入  针对对象插入

对象 VO、TO、POJO(值对象、传输对象、最根本的JAVA对象)
即:只包含属性和 setter、 getter方法的类
客户 – vo  DAO
VO的对象与表中的字段对应

定义好接口之后,要定义出接口的具体实现类,具体实现DAO接口中对数据库表的一切操作
可以发现以下的一个重要问题:
  PersonDAO dao = new PersonDAOImpl();接口直接通过其子类实例化,直接的影响就是程序在调用时必须知道具体的子类,这样会造成修改不方便
   所以,必须使用工厂设计,是前台不关注于具体子类
DAO整体设计,是采用以下模式:
调用处  DAO工厂 具体子类实现 完成数据库操作
|------------------|------------VO-----------------------|
直接的好处:前台显示与后台逻辑操作分离
package org.sky.darkness.factory ;

import org.sky.darkness.dao.* ;
import org.sky.darkness.dao.impl.* ;

public class DAOFactory
{
	public static PersonDAO getPersonDAOInstance()
	{
		return new PersonDAOImpl() ;
	}
};


--PersonDAO.java
package org.sky.darkness.dao ;

import java.util.* ;
import org.sky.darkness.vo.* ;

// 规定出了操作person表在此项目里的全部方法
public interface PersonDAO
{
	// 增加操作
	public void insert(Person person) throws Exception ;
	// 修改操作
	public void update(Person person) throws Exception ;
	// 删除操作
	public void delete(String id) throws Exception ;
	// 按ID查询操作
	public Person queryById(String id) throws Exception ;
	// 查询全部
	public List queryAll() throws Exception ;
	// 模糊查询
	public List queryByLike(String cond) throws Exception ;
}

package org.sky.darkness.vo ;

// 值对象,包含属性,setter,getter方法
public class Person
{
	private String id ;
	private String name ;
	private String password ;
	private int age ;
	private String email ;

	// 生成getter、setter方法
	public void setId(String 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 setEmail(String email)
	{
		this.email = email ;
	}
	public String getId()
	{
		return this.id ;
	}
	public String getName()
	{
		return this.name ;
	}
	public String getPassword()
	{
		return this.password ;
	}
	public int getAge()
	{
		return this.age ;
	}
	public String getEmail()
	{
		return this.email ;
	}
};

package org.sky.darkness.dao.impl ;
import java.sql.* ;
import java.util.* ;
import org.sky.darkness.vo.* ;
import org.sky.darkness.dbc.* ;
import org.sky.darkness.dao.* ;

// 此类需要完成具体的数据库操作,需要JDBC代码
public class PersonDAOImpl implements PersonDAO
{
	// 增加操作
	public void insert(Person person) throws Exception
	{
		String sql = "INSERT INTO person (id,name,password,age,email) VALUES (?,?,?,?,?)" ;
		PreparedStatement pstmt = null ;
		DataBaseConnection dbc = null ;

		// 下面是针对数据库的具体操作
		try
		{
			// 连接数据库
			dbc = new DataBaseConnection() ;
			pstmt = dbc.getConnection().prepareStatement(sql) ;
			pstmt.setString(1,person.getId()) ;
			pstmt.setString(2,person.getName()) ;
			pstmt.setString(3,person.getPassword()) ;
			pstmt.setInt(4,person.getAge()) ;
			pstmt.setString(5,person.getEmail()) ;
			// 进行数据库更新操作
			pstmt.executeUpdate() ;
			pstmt.close() ;
		}
		catch (Exception e)
		{
			throw new Exception("操作出现异常") ;
		}
		finally
		{
			// 关闭数据库连接
			dbc.close() ;
		}
	}
	// 修改操作
	public void update(Person person) throws Exception
	{
		String sql = "UPDATE person SET name=?,password=?,age=?,email=? WHERE id=?" ;
		PreparedStatement pstmt = null ;
		DataBaseConnection dbc = null ;

		// 下面是针对数据库的具体操作
		try
		{
			// 连接数据库
			dbc = new DataBaseConnection() ;
			pstmt = dbc.getConnection().prepareStatement(sql) ;			
			pstmt.setString(1,person.getName()) ;
			pstmt.setString(2,person.getPassword()) ;
			pstmt.setInt(3,person.getAge()) ;
			pstmt.setString(4,person.getEmail()) ;
			pstmt.setString(5,person.getId()) ;
			// 进行数据库更新操作
			pstmt.executeUpdate() ;
			pstmt.close() ;
		}
		catch (Exception e)
		{
			throw new Exception("操作出现异常") ;
		}
		finally
		{
			// 关闭数据库连接
			dbc.close() ;
		}
	}
	// 删除操作
	public void delete(String id) throws Exception
	{
		String sql = "DELETE FROM person WHERE id=?" ;
		PreparedStatement pstmt = null ;
		DataBaseConnection dbc = null ;

		// 下面是针对数据库的具体操作
		try
		{
			// 连接数据库
			dbc = new DataBaseConnection() ;
			pstmt = dbc.getConnection().prepareStatement(sql) ;			
			pstmt.setString(1,id) ;
			// 进行数据库更新操作
			pstmt.executeUpdate() ;
			pstmt.close() ;
		}
		catch (Exception e)
		{
			throw new Exception("操作出现异常") ;
		}
		finally
		{
			// 关闭数据库连接
			dbc.close() ;
		}
	}
	// 按ID查询操作
	public Person queryById(String id) throws Exception
	{
		Person person = null ;
		String sql = "SELECT id,name,password,age,email FROM person WHERE id=?" ;
		PreparedStatement pstmt = null ;
		DataBaseConnection dbc = null ;

		// 下面是针对数据库的具体操作
		try
		{
			// 连接数据库
			dbc = new DataBaseConnection() ;
			pstmt = dbc.getConnection().prepareStatement(sql) ;			
			pstmt.setString(1,id) ;
			// 进行数据库查询操作
			ResultSet rs = pstmt.executeQuery() ;
			if(rs.next())
			{
				// 查询出内容,之后将查询出的内容赋值给person对象
				person = new Person() ;
				person.setId(rs.getString(1)) ;
				person.setName(rs.getString(2)) ;
				person.setPassword(rs.getString(3)) ;
				person.setAge(rs.getInt(4)) ;
				person.setEmail(rs.getString(5)) ;
			}
			rs.close() ;
			pstmt.close() ;
		}
		catch (Exception e)
		{
			throw new Exception("操作出现异常") ;
		}
		finally
		{
			// 关闭数据库连接
			dbc.close() ;
		}
		return person ;
	}
	// 查询全部
	public List queryAll() throws Exception
	{
		List all = new ArrayList() ;
		String sql = "SELECT id,name,password,age,email FROM person" ;
		PreparedStatement pstmt = null ;
		DataBaseConnection dbc = null ;

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

				// 将查询出来的数据加入到List对象之中
				all.add(person) ;
			}
			rs.close() ;
			pstmt.close() ;
		}
		catch (Exception e)
		{
			throw new Exception("操作出现异常") ;
		}
		finally
		{
			// 关闭数据库连接
			dbc.close() ;
		}
		return all ;
	}
	// 模糊查询
	public List queryByLike(String cond) throws Exception
	{
		List all = new ArrayList() ;
		String sql = "SELECT id,name,password,age,email FROM person WHERE name LIKE ? or email LIKE ?" ;
		PreparedStatement pstmt = null ;
		DataBaseConnection dbc = null ;

		// 下面是针对数据库的具体操作
		try
		{
			// 连接数据库
			dbc = new DataBaseConnection() ;
			pstmt = dbc.getConnection().prepareStatement(sql) ;	
			// 设置模糊查询条件
			pstmt.setString(1,"%"+cond+"%") ;
			pstmt.setString(2,"%"+cond+"%") ;
			// 进行数据库查询操作
			ResultSet rs = pstmt.executeQuery() ;
			while(rs.next())
			{
				// 查询出内容,之后将查询出的内容赋值给person对象
				Person person = new Person() ;
				person.setId(rs.getString(1)) ;
				person.setName(rs.getString(2)) ;
				person.setPassword(rs.getString(3)) ;
				person.setAge(rs.getInt(4)) ;
				person.setEmail(rs.getString(5)) ;

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

定义一个数据库连接类,她只负责数据库的连接:
package org.sky.darkness.dbc ;
import java.sql.* ;

// 主要功能就是连接数据库、关闭数据库
public class DataBaseConnection
{
	private final String DBDRIVER = "oracle.jdbc.driver.OracleDriver" ;
	private final String DBURL = "jdbc:oracle:thin:@localhost:1521:SKY" ;
	private final String DBUSER = "scott" ;
	private final String DBPASSWORD = "darkness" ;
	private Connection conn = null ;

	public DataBaseConnection()
	{
		try
		{
			Class.forName(DBDRIVER) ;
			this.conn = DriverManager.getConnection(DBURL,DBUSER,DBPASSWORD) ;	
		}
		catch (Exception e)
		{
		}
	}

	// 取得数据库连接
	public Connection getConnection()
	{
		return this.conn ;
	}

	// 关闭数据库连接
	public void close()
	{
		try
		{
			this.conn.close() ;
		}
		catch (Exception e)
		{
		}		
	}
};


分享到:
评论

相关推荐

    JSP复习笔记——第11章 JSP 构架和MVC设计模式

    本篇复习笔记主要关注的是JSP构架以及MVC(Model-View-Controller)设计模式的应用。 MVC设计模式是软件工程中的一种架构模式,它将应用程序分为三个核心部分:模型(Model)、视图(View)和控制器(Controller)...

    jsp+jdbc——留言管理程序(简单版)

    "笔记.pdf"可能包含了关于如何理解和实现DAO设计模式以及JSP和JDBC交互的详细说明。"简介.txt"可能简述了这个程序的主要功能和实现方式,帮助初学者快速了解项目背景和目标。 **代码** 项目中的"代码"文件夹应该...

    JSP+DAO和MVC+DAO(基于MySQL数据库分页)-v笔记

    总结来说,这个笔记讨论了如何在JSP和MVC两种不同的架构下,结合DAO模式实现MySQL数据库的分页功能,强调了代码封装和模块化的重要性,以及MVC模式在提高代码可读性和可维护性上的优势。在实际开发中,理解并熟练...

    JSP+DAO留言管理程序(代码+笔记)

    DAO模式是一种设计模式,用于在应用程序中处理数据访问。DAO对象提供了一种封装数据库操作的方式,使得业务逻辑与数据存储细节解耦。通过DAO,开发者可以编写独立于具体数据库实现的代码,提高代码的可复用性和可...

    使用JSP基于数据库完成用户登陆(代码+笔记)_java_

    DAO是软件设计模式之一,用于分离业务逻辑层和数据访问层,使得代码更易于维护和测试。创建一个UserDAO接口,包含方法如`login(String username, String password)`,并在其实现类中编写SQL查询来验证用户凭证。 3....

    JSP DAO留言管理代码实例 笔记.rar

    首先,我们来看DAO设计模式的核心思想。DAO模式提供了一个接口,该接口定义了对特定数据源进行操作的方法,比如增删改查。在JSP应用中,DAO作为与数据库交互的中间层,使得JSP页面不再直接处理SQL语句,降低了耦合度...

    李兴华-案例-jsp+DAO实现留言管理程序代码及笔记

    **二、DAO设计模式** DAO模式是Java应用中用于访问数据库的标准模式,它的主要目标是分离业务逻辑层与数据访问层,使得代码更易于维护和测试。DAO类负责执行对数据库的CRUD(Create, Read, Update, Delete)操作,...

    jsp笔记 mvc 模式简单设计

    结合MVC(Model-View-Controller)设计模式,可以实现更高效、更清晰的代码组织结构,便于维护和扩展。本文将深入探讨如何运用JSP与Servlet技术,基于MVC模式来设计和编写网站。 #### MVC模式解析 MVC模式是一种...

    jsp数据库开发实例精粹

    《JSP数据库开发实例精粹》一书,虽然主要探讨的是基于.Net技术的PetShop应用,但其中涉及的软件架构和设计模式对于JSP数据库开发同样具有指导意义。以下是该书主要内容的概述和相关知识点: 1. **PetShop概述**: ...

    jsp自制详细笔记

    Java Web开发是基于Java技术栈进行Web应用程序开发的一系列技术和框架的集合,除了JSP和Servlet,还可能涉及到Java EE规范、MVC模式、DAO设计模式、JNDI、JTA等概念。 【压缩包子文件的文件名称列表】暗示了学习...

    JSP七个小项目代码和笔记汇总(java web).zip

    通过这些项目的学习,开发者可以掌握JSP基本语法、表单处理、JDBC数据库操作、DAO设计模式以及MVC架构的应用。每个项目都提供了代码和笔记,可以帮助学习者逐步理解并应用这些概念。对于初学者,这是一个很好的实战...

    JSP七个小项目代码和笔记汇总(java+web)

    每个项目不仅提供了完整的代码实现,还有配套的笔记,有助于理解各个项目的实现逻辑和设计模式。 1. **项目02_使用JSP完成简单的登陆程序(代码+笔记)** 这个项目主要讲解如何使用JSP实现一个基本的登录功能。通过...

    JSP小项目源码汇总.rar

    这些项目涵盖了JSP基础到进阶应用,旨在帮助学习者更好地理解和掌握JSP、JDBC、DAO设计模式以及MVC架构在实际开发中的应用。 首先,我们来深入了解**JSP(JavaServer Pages)**。JSP是一种动态网页技术,它允许...

    留言管理程序_使用Struts + DAO完成笔记

    2. **DAO设计模式**:DAO(Data Access Object)模式是用于与数据库交互的一种设计模式。它为业务对象提供了抽象接口,隐藏了数据库访问的细节。在留言管理程序中,DAO负责执行SQL语句,对留言进行增删改查操作。 3...

    JSP七个小项目代码和笔记汇总(java+web).rar

    通过这些项目,开发者不仅可以学习到JSP的基本语法和使用方法,还能了解如何在实际项目中应用MVC模式、DAO设计模式,以及如何处理用户认证和数据管理。这些项目涵盖了从简单到复杂的应用场景,为初学者提供了良好的...

    MVC+DAO_留言管理程序(代码+笔记).

    - 可能的目录结构包括:`src/main/java`(存放Java代码,如Model、Controller、DAO等)、`src/main/resources`(存放数据库连接配置等资源)、`Web-INF`(存放web.xml配置文件和JSP页面)。 5. **实际应用场景**:...

    jspdaoguestbook_java_dao2006com_typical3xe_

    2. **DAO设计模式**:DAO模式是软件设计模式之一,用于在业务逻辑和数据存储之间创建抽象层,使得数据访问独立于具体的数据库实现。在本例中,DAO类负责与数据库进行交互,如执行SQL查询、插入、更新和删除等操作。 ...

    留言管理程序_使用Struts + DAO + Hibernate完成笔记

    数据访问对象(DAO)模式是一种设计模式,旨在将业务逻辑与数据访问代码分离。在本项目中,DAO类负责与数据库进行交互,包括添加、查询、更新和删除留言记录。通过使用DAO,我们可以在不修改业务逻辑的情况下更换...

    留言管理程序_使用Struts + DAO + Hibernate完成笔记.zip

    【DAO设计模式】:DAO模式是一种常用的设计模式,它的主要作用是将数据访问操作封装起来,提供一个接口供业务层调用,从而将业务逻辑与数据访问逻辑分离。在本项目中,DAO类负责执行SQL语句,处理与数据库相关的操作...

Global site tag (gtag.js) - Google Analytics