J2EE 开发人员使用数据访问对象(Data Access Object DAO)设计模式,以便将低级别的数据访问逻辑与高级别的业务逻辑分离。实现 DAO 模式涉及比编写数据访问代码更多的内容。
数据访问对象(Data Acess Object) 模式
一环境
根据数据源不同,数据访问也不同。根据存储的类型(关系数据库、面向对象数据库、文件等等)和供应商实现不同,持久性存储(比如数据库)的访问差别也很大。
二问题
许多真是的J2EE应用程序需要在一定程度上使用持久性数据。对于许多应用程序,持久性存储是使用不同的机制实现的,并且用来访问这些不同的持久性存储机制的API也有很大的不同。
比如,应用程序使用实体bean(这里应该是指BMP的bean,CMP的bean已大大降低了与RDBMS的耦合)的分布式组件来表示持久性数据,或者使用JDBC API来访问驻留在某关系数据库管理系统(RDBMS)中的数据,这些组件中包含连接性性和数据访问代码会引入这些组件与数据源实现之间的紧密耦合。组件中这类代码依赖性使应用程序从某种数据源迁移到其他种类的数据源将变得非常麻烦和困难。当数据源变化时,组件也需要改变,以便于能够处理新类型的数据源。
(举个例子来说,我们UPTEL系统是使用JDBC API对 ORACLE数据库进行连接和数据访问的,这些JDBC API与SQL语句散布在系统中,当我们需要将UPTEL迁移到其他RDBMS时,比如曾经迁移到INFORMIX,就面临重写数据库连接和访问数据的模块。)
三作用力
1诸如bean管理的实体bean、会话bean、servlet等组件往往需要从持久性存储数据源中检索数据,以及进行数据存储等 *** 作。
2根据产品供应商的不同,持久性存储API差别也很大,这些API和其能力同样根据存储的类型不同也有差别,这样存在以下缺点,即访问这些独立系统的API很不统一。
3组件需要透明于实际的持久性存储或者数据源实现,以便于提供到不同供应商产品、不同存储类型和不同数据源类型的更容易的移植性。
四解决方案
使用数据访问对象(DAO)模式来抽象和封装所有对数据源的访问。DAO管理着与数据源的连接以便检索和存储数据。
DAO实现了用来 *** 作数据源的访问机制。数据源可以时RDBMS,LDAP,File等。依赖于DAO的业务组件为其客户端使用DAO提供更简单的接口。DAO完全向客户端隐藏了数据源实现细节。由于当低层数据源实现变化时,DAO向客户端提供的接口不会变化,所有该模式允许DAO调整到不同的存储模式,而不会影响其客户端或者业务组件。重要的是,DAO充当组件和数据源之间的适配器。
(按照这个理论,如果我们UPTEL系统使用了DAO模式,就可以无缝的从ORACLE迁移到任何一个RDBMS了。梦想总是很完美的,且看看DAO模式如何实现)
>
package basic;
import javasqlConnection;
import javasqlDriverManager;
import javasqlPreparedStatement;
import javasqlResultSet;
import javasqlSQLException;
import javasqlStatement;
public class JDBC {
public void findAll() {
try {
// 获得数据库驱动
//由于长时间不写,驱动名和URL都忘记了,不知道对不对,你应该知道的,自己改一下的哈
String url = "jdbc:oracle:thin:@localhost:1521:XE";
String userName = "system";
String password = "system";
ClassforName("oraclejdbcdriverOracleDriver");
// 创建连接
Connection conn = DriverManagergetConnection(url, userName,
password);
// 新建发送sql语句的对象
Statement st = conncreateStatement();
// 执行sql
String sql = "select from users";
ResultSet rs = stexecuteQuery(sql);
// 处理结果
while(rsnext()){
//这个地方就是给你的封装类属性赋值
Systemoutprintln("UserName:"+rsgetString(0));
}
// 关闭连接
rsclose();
stclose();
connclose();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
eprintStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
eprintStackTrace();
}
}
public void delete(){
try {
//步骤还是那六个步骤,前边的两步是一样的
String url = "jdbc:oracle:thin:@localhost:1521:XE";
String userName = "system";
String password = "system";
ClassforName("oraclejdbcdriverOracleDriver");
Connection conn = DriverManagergetConnection(url,userName,password);
//这里的发送sql语句的对象是PreparedStatement,成为预处理sql对象,因为按条件删除是需要不定值的
String sql = "delete from users where id = ";
PreparedStatement ps = connprepareStatement(sql);
pssetInt(0, 1);
int row = psexecuteUpdate();
if(row!=0){
Systemoutprintln("删除成功!");
}
// 关闭连接
rsclose();
stclose();
connclose();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
eprintStackTrace();
} catch (SQLException e) {
// TODO Auto-generated catch block
eprintStackTrace();
}
}
}
我只写了查询和删除,添加、修改和删除非常之像,这是因为查询对数据库没有改动,而增删改都对数据库进行了修改,所以这三个非常像……呵呵,你自己看着办吧
如果说与数据库打交道的意义上讲,JDBC是最基础的,mybatis等框架主键也是基于此。另外springJBA Data是什么鬼,是Spring Data JPA 吧,JPA全称为Java持久性API(Java Persistence API),JPA是Java EE 5标准之一。
从应用的角度来看,直接使用JDBC写代码连接数据库已经很少了,除了一些小项目;mybatis可以自动生成dao和daoImpl以及配置文件,可以修改sql语句,使用较为灵活;
为了简化程序与数据库交互的代码,spring提供了一个现成的dao层框架,spring家族提供的spring-data适用于关系型数据库和nosql数据库 ,虽然使用起来很方便,但其简化了SQL功能如查询所有数据 findAll(),但复杂查询就有些麻烦了;
Dao:数据访问对象的接口,ImplementDao数据访问对象接口的实现类。数据访问对象主要与数据库打交道,例如数据的新增、删除、修改、查询等。比较常见的框架是hibernate和ibatIS。Service:业务逻辑对象的接口,ImplementService:业务逻辑对象的接口的是实现类。业务逻辑对象主要实现系统业务逻辑的判断以及处理等。位于展现层与数据访问层中间,有效的减低了系统各层之间的耦合度,以及实现事务的管理等。比较常用的是spring。纯手打,看你问的问题感觉你是个刚学java的新人,加油吧。
以上就是关于Java架构中DAO干什么用的全部的内容,包括:Java架构中DAO干什么用的、java中dao层和service层的区别,为什么要用service、如何写一个dao类方法来实现java对mysql数据库的增删改查等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)