日期:2014-05-16  浏览次数:20527 次

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

区分:J2EE的组件层次
客户端? 表示层 ? 业务层 ? 数据层 ? 数据库
*.jsp/servlet
DAO属于J2EE数据层的操作
即:在DAO中封装一个表在一个项目中所应该具有的所有的操作

Java代码
1.create table person  
2.(  
3.id varchar(32) not null primary key,  
4.name varchar(20) not null,  
5.password varchar(20) not null,  
6.age varchar(20) not null,  
7.email varchar(20) not null 
8.); 
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-----------------------|
直接的好处:前台显示与后台逻辑操作分离

Java代码
1.package org.sky.darkness.factory ;  
2. 
3.import org.sky.darkness.dao.* ;  
4.import org.sky.darkness.dao.impl.* ;  
5. 
6.public class DAOFactory  
7.{  
8.    public static PersonDAO getPersonDAOInstance()  
9.    {  
10.        return new PersonDAOImpl() ;  
11.    }  
12.}; 
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

Java代码
1.package org.sky.darkness.dao ;  
2. 
3.import java.util.* ;  
4.import org.sky.darkness.vo.* ;  
5. 
6.// 规定出了操作person表在此项目里的全部方法  
7.public interface PersonDAO  
8.{  
9.    // 增加操作  
10.    public void insert(Person person) throws Exception ;  
11.    // 修改操作  
12.    public void update(Person person) throws Exception ;  
13.    // 删除操作  
14.    public void delete(String id) throws Exception ;  
15.    // 按ID查询操作  
16.    public Person queryById(String id) throws Exception ;  
17.    // 查询全部  
18.    public List queryAll() throws Exception ;  
19.    // 模糊查询  
20.    public List queryByLike(String cond) throws Exception ;  
21.} 
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 pe