DAO设计模式
1: 为什么使用DAO?
a: 在涉及数据库操作,以前一般使用jdbc,使用这种方法我们会发现代码和html标签同时使用,维
护很困难。
b:jsp文件中不应该出现任何sql包,jsp文件侧重于显示界面的。
c:所有的数据库操作建议使用prepareStatement。好处重在避免sql注入漏洞。
2:DAO是J2EE中的数据层操作。
3:数据库创建脚本
--删除表
DROP TABLE person;
--创建表
CREATE TABLE person
(
id varchar(20) notnullprimary key,
name varchar(20) notnull,
password varchar(20) notnull,
age varchar(20) notnull,
email varchar(30) notnull);
--事务提交
commit;
4:如果在数据库修改后,我们怎么样才能做到前台页面不需要太多的改变?
我们必须规定出对PERSON中的全部操作。比如增删查改。
按照以上要求,制定出操作那张表的标准,之后只要针对不同的数据库实现这些标准就可以了。 在java
中我们可以通过接口来实现----》DAO规定的就是这些接口。
packagecom.nnu.djx.dao;
importcom.nnu.djx.vo.*;
importjava.util.*;
//规定了在此项目中操作person表的全部方法
publicinterfacePersonDao
{
/** *//***//** *//** * 插入对象
*@throwsException
*/publicvoidinsert(Person person)throwsException;
/** *//***//** *//** * 更新对象
*@throwsException
*/publicvoidupdate(Person person)throwsException;
/** *//***//** *//** * 删除某一对象
*@paramid
*@throwsException
*
*/publicvoiddelete(String id)throwsException;
/** *//***//** *//** * 按照ID查询
*@paramid
*@return *@throwsException
*
*/publicPerson queryById(String id)throwsException;
/** *//***//** *//** * 查询全部结果
*@return *@throwsException
*/publicList queryAll()throwsException;
/** *//***//** *//** * 模糊查询
*@paramcode
*@return *@throwsException
*/publicList queryByLike(String code)throwsException;
}
5:在DAO中操作的是对象和数据库之间的关系。
不过此时的对象是(VO,POLO,TO)(值对象,最简单对象,传输对象)
即是只包括getter,setter方法的类。
通过VO操作DAO
Vo中的字段和表中一一对应。
packagecom.nnu.djx.vo;
publicclassPerson
{
privateString id;
privateString name;
privateString password;
privateintage;
privateString email;
//生成getter,setter方法。
publicintgetAge()
{
returnage;
}
publicvoidsetAge(intage)
{
this.age=age;
}
publicString getEmail()
{
returnemail;
}
publicvoidsetEmail(String email)
{
this.email=email;
}
publicString getId()
{
returnid;
}
publicvoidsetId(String id)
{
this.id=id;
}
publicString getName()
{
returnname;
}
publicvoidsetName(String name)
{
this.name=name;
}
publicString getPassword()
{
returnpassword;
}
publicvoidsetPassword(String password)
{
this.password=password;
}}
6: 对于定义好的接口,需要给出具体实现。对数据库表的一切具体操作。
可以定义一个数据库链接类,只负责连接。
packagecom.nnu.djx.dao.impl;
importjava.util.List;
importcom.nnu.djx.dao.*;
importcom.nnu.djx.vo.Person;
publicclassPersonDaoImplimplementsPersonDao
{
publicvoiddelete(String id)throwsException
{
//TODO 自动生成方法存根 }
publicvoidinsert(Person person)throwsException
{
//TODO 自动生成方法存根 }
publicList queryAll()throwsException
{
//TODO 自动生成方法存根returnnull;
}
publicPerson queryById(String id)throwsException
{
//TODO 自动生成方法存根returnnull;
}
publicList queryByLike(String code)throwsException
{
//TODO 自动生成方法存根returnnull;
}
publicvoidupdate(Person person)throwsException
{
//TODO 自动生成方法存根}
publicPersonDaoImpl()
{
//TODO 自动生成构造函数存根}}
具体的数据库连接类如下:
packagecom.nnu.djx.dbc;
importjava.sql.*;
publicclassDataBaseConnection
{
privatefinalString DBDRIVER="oracle.jdbc.driver.OracleDriver";
privatefinalString DBURL="jdbc:oracle:thin:@localhost:1521:ora9djx";
privatefinalString DBUSER="system";
privatefinalString DBPWD="system";
Connection conn=null;
PreparedStatement pstmt=null;
ResultSet rst=null;
publicDataBaseConnection()
{
try{
Class.forName(DBDRIVER);
this.conn=DriverManager.getConnection(DBURL,DBUSER,DBPWD);
}catch(Exception e)
{
e.printStackTrace();
} }//取得数据库链接
publicConnection getConnection()
{
returnthis.conn;
}
publicvoidcloseConnection()
{
try{
this.conn.close();
}catch(SQLException e)
{
//TODO 自动生成 catch 块e.printStackTrace();
} }
}
5:再设计一个jsp页面用来操作数据库,检验前面的代码是否正确。
import="com.nnu.djx.dao.*,com.nnu.djx.vo.*,com.nnu.djx.dao.impl.*,java.util.*,com.nnu.djx.factory.*"%>//进行插入操作
/** *//**//*
Person person = new Person();
person.setId("001");
person.setName("why");
person.setPassword("123");
person.setAge(12);
person.setEmail("123j@163.com");
*/ PersonDao persondao=newPersonDaoImpl();
//PersonDaoFactory.getPersonDaoInstance().queryAll();
//删除一个用户
try{
//persondao.insert(person);
//persondao.delete("001");
//persondao.update(person);
//全部查询
/** *//**//*
List list = persondao.queryAll();
Iterator iterator = list.iterator();
while(iterator.hasNext())
{
Person person = (Person)iterator.next();
out.print(person.getName());
}
*/
//模糊查询List list=persondao.queryByLike("hy");
Iterator iterator=list.iterator();
while(iterator.hasNext())
{
Person person=(Person)iterator.next();
out.print(person.getName());
}
}catch(Exception e)
{
}%>
DAO使用后,我们发现前天的代码明显减少,而后台比如类都增多了。
同时可以发现这样的一个问题
PersonDao persondao = new PersonDaoImpl();
操作时必须知道子类。
如果有一天我们改变了数据库(DB2)修改就不方便了。
应该考虑如何是前台代码不关后台的变化。。
此时可以考虑工厂模式:
新建一个类工厂类PersonDaoFactory
packagecom.nnu.djx.factory;
importcom.nnu.djx.dao.PersonDao;
importcom.nnu.djx.dao.impl.PersonDaoImpl;
publicclassPersonDaoFactory
{
publicstaticPersonDao getPersonDaoInstance()
{
returnnewPersonDaoImpl();
}}
以后调用的时候就可以用
PersonDaoFactory.getPersonDaoInstance().queryAll();
而不具体涉及到类。。。
后序:
程序经过验证完全正确,可以作为以后数据库学习的模板。。