当前位置: 代码迷 >> J2SE >> 对于分层开发中的数据访问层,DAO模式的迷惑
  详细解决方案

对于分层开发中的数据访问层,DAO模式的迷惑

热度:374   发布时间:2016-04-23 20:14:10.0
对于分层开发中的数据访问层,DAO模式的疑惑
今天刚学习JAVA中的分层开发,主要是数据访问层的DAO模式

书上是这样写的:
1.数据库连接、关闭、执行命令的工具类:
class BaseDao{
private String url = "jbdc......";
//......
public Connection getConnection() {
//....
}
public void closeAll(Connection conn,Statement stmt,ResultSet rs) {
//....
}
//...........
}

2.DAO接口
interface PetDao{
int save(Pet pet);
int delete(Pet pet);
int update(Pet pet);
//.............
}

3.具体的DAO接口的实现类:
class PetDaoSQLServerImpl extends BaseDao implements PetDao{

@Override
public int save(Pet pet) {
//调用:
return result =super.executeUpdate(sql, param);
}

//..........

}


然后我就疑惑了!按书上的说法:
1.书上BaseDao的职能是连接关闭、执行SQL增删改语句,并且具体的DAO接口实现类继承自它
    按我的理解应该修正为:它应该是一个独立的类,所有方法甚至可以是静态的,更不应该让后面的PetDaoSQLServerImpl 继承自它,而是应该调用。并且名字应该改为DBHelper之类,里面不应该有具体的执行增删改的方法。
2.书上说PetDao接口的存在是为了适应不同数据库,所以具体的实现类叫PetDaoSQLServerImpl 或PetDaoOracleImpl .....
    按我的理解:按理说不会存在为了适应不同数据库而设计一个接口,数据库大多情况应该是固定选用的吧。  而真正设计这个接口的目的是什么?

所以,总的来说书上的写法有很多不合理之处,但是我自己不敢肯定,毕竟第一次借出JAVA分层。希望哪位大哥解释一下,最好给个规范,说说原因,谢谢了!
------解决思路----------------------
引用
2.书上说PetDao接口的存在是为了适应不同数据库,所以具体的实现类叫PetDaoSQLServerImpl 或PetDaoOracleImpl .....
    按我的理解:按理说不会存在为了适应不同数据库而设计一个接口,数据库大多情况应该是固定选用的吧。  而真正设计这个接口的目的是什么?

你的出发点是你的项目只会连固定的一种数据库,项目定了,数据库的品种也就定了;书上的出发点是,你要做一个产品,你的产品可能会用不同的数据库。
不同的出发点(或称之为需求)就需要有不同的实现。在书上这种实现方式时,你可以想办法用工作模式适配不同的数据库,在DAO这一层完成对不同数据库的封装,而上层代码时就不需要再关心用何种数据库了。


引用
1.书上BaseDao的职能是连接关闭、执行SQL增删改语句,并且具体的DAO接口实现类继承自它
    按我的理解应该修正为:它应该是一个独立的类,所有方法甚至可以是静态的,更不应该让后面的PetDaoSQLServerImpl 继承自它,而是应该调用。并且名字应该改为DBHelper之类,里面不应该有具体的执行增删改的方法。

你的理解也没有错。但是,你的做法也会在不同的时候显的代码比较难看。


------解决思路----------------------
1
绝对不能是静态的,更不能做成单例的工具类DBHelper,

因为这样你的connection就一个了,一个connection'只能返回一个resultSet, 多线程使用会出错!

继承baseDao 多例的形式,就能保证线程安全

要知道很对entity对应的Dao ,都是可以抽取出共性,也就是简单的CRUD方法, 可以抽取出来,放到baseDao,让子类继承使用,项目中基本都这样抽取

2
接口的好处太多了,当然也容易被滥用

除了解耦,更换数据库实现外.

要知道项目有时需要分层开发

你先把dao层的接口定义好了,这样 开发service中的人 就可以干活了 ,完全不用管你 实现没有了.
------解决思路----------------------
如 MasterDAO和MasterDAOImpl、PetDAO和PetDAOImpl实在想象不出有什么情况能再次使用这个接口..
测试的时候,数据不是从数据库里取,而是模拟的数据,这个时候写一个MasterDAOMocImpl就有必要了。
  相关解决方案