在Java WEB的DAO层开发中关于DAO接口的使用,求解答
在JavaWEB开发中,很多人喜欢使用DAO接口,然后不同的数据表DAO都实现该接口,但是不同的dao类,对数据的处理方法也不尽相同,那接口有什么用呢?...
在JavaWEB开发中,很多人喜欢使用DAO接口,然后不同的数据表DAO都实现该接口,但是不同的dao类,对数据的处理方法也不尽相同,那接口有什么用呢?
展开
3个回答
展开全部
接口是为了屏蔽不同数据库的JDBC实现差异而出现的。
以常见的系统组织结构为例,管理系统里有一个部门department表用于存放部门信息,因为部门下面可能有子部门所以表中的字段要定义成类似树形结构的方式(parentId呀什么的)。这时我们想在java中用sql去查询指定部门下的数据,你就要考虑不同数据库的SQL语句的问题了:Oracle sql提供了树查询的方法,你只需要发一句sql就能查询出该部门下的所有子部门信息;但是mysql就不行,mysql就只能通过java递归一条一条查询。那么假如我们的系统即要支持Oracle又要支持mysql,这时我们查询部门怎么办呢?这时就要考虑接口,看下面的代码:
首先定义一个部门接口,该接口有一个findDept方法用于查询部门下的所有子部门
Interface DepartmentDao{
//根据父部门ID查询部门下的所有子部门
public List findDept(int deptId);
}
有了接口,我们就需要有实现类了,这时我们为了考虑兼容性就需要编写两套接口类,一个是用mysql语句实现的类,另一个是用Oracle实现的类:
class MySqlDepartmentDaoImpl implement DepartmentDao{
//根据父部门ID查询部门下的所有子部门
public List findDept(int deptId){String sql="mysql的sql语句".....}
}
class OracleDepartmentDaoImpl implement DepartmentDao{
//根据父部门ID查询部门下的所有子部门
public List findDept(int deptId){String sql="Oracle的sql语句".....}
}
一个Dao工厂,这个工厂返回部门Dao接口的实例
class DaoFactory{
public DepartmentDao getDepartmentDao(){
if(使用的是Mysql数据库){
return new MySqlDepartmentDaoImpl ();
}else{
return new OracleDepartmentDaoImpl ();
}
}
}
上面的编码DaoFactory是关键,通过这个这个工厂只返回给我们接口实例,这样就屏蔽了不同数据库的差异性(如果用户使用的是mysql数据库就会返回new MySqlDepartmentDaoImpl ()反之为new OracleDepartmentDaoImpl ())。我们在编码中只需要通过DepartmentDao deptDao = DaoFactory.getDepartmentDao();deptDao.findDept就可以查询我们需要的数据了。
所以面向接口编程是很重要的东西,建议你学习一下spring的IOC,代码写多了你就明白接口的重要性了
以常见的系统组织结构为例,管理系统里有一个部门department表用于存放部门信息,因为部门下面可能有子部门所以表中的字段要定义成类似树形结构的方式(parentId呀什么的)。这时我们想在java中用sql去查询指定部门下的数据,你就要考虑不同数据库的SQL语句的问题了:Oracle sql提供了树查询的方法,你只需要发一句sql就能查询出该部门下的所有子部门信息;但是mysql就不行,mysql就只能通过java递归一条一条查询。那么假如我们的系统即要支持Oracle又要支持mysql,这时我们查询部门怎么办呢?这时就要考虑接口,看下面的代码:
首先定义一个部门接口,该接口有一个findDept方法用于查询部门下的所有子部门
Interface DepartmentDao{
//根据父部门ID查询部门下的所有子部门
public List findDept(int deptId);
}
有了接口,我们就需要有实现类了,这时我们为了考虑兼容性就需要编写两套接口类,一个是用mysql语句实现的类,另一个是用Oracle实现的类:
class MySqlDepartmentDaoImpl implement DepartmentDao{
//根据父部门ID查询部门下的所有子部门
public List findDept(int deptId){String sql="mysql的sql语句".....}
}
class OracleDepartmentDaoImpl implement DepartmentDao{
//根据父部门ID查询部门下的所有子部门
public List findDept(int deptId){String sql="Oracle的sql语句".....}
}
一个Dao工厂,这个工厂返回部门Dao接口的实例
class DaoFactory{
public DepartmentDao getDepartmentDao(){
if(使用的是Mysql数据库){
return new MySqlDepartmentDaoImpl ();
}else{
return new OracleDepartmentDaoImpl ();
}
}
}
上面的编码DaoFactory是关键,通过这个这个工厂只返回给我们接口实例,这样就屏蔽了不同数据库的差异性(如果用户使用的是mysql数据库就会返回new MySqlDepartmentDaoImpl ()反之为new OracleDepartmentDaoImpl ())。我们在编码中只需要通过DepartmentDao deptDao = DaoFactory.getDepartmentDao();deptDao.findDept就可以查询我们需要的数据了。
所以面向接口编程是很重要的东西,建议你学习一下spring的IOC,代码写多了你就明白接口的重要性了
追问
你说的这个例子,我倒是明白,也很经典,但是举个例子:UserDao有个getUsersByClass()根据班级查询学生,ScoreDao里有个getUsersByScore()根据成绩查询学生列表,两个方法肯定不一样,也肯定不是公共的方法,在BaseDao接口里肯定不会有该方法的声明在使用该方法时:
UserDao dao = new UserDao()
dao.getUsersByClass()
而不是
BaseDao dao = new UserDao()
追答
我大概猜想你的UserDao是这样的格式:class UserDao implement BaseDao,而getUsersByClass方法是在UserDao类中新建的一个方法,所以你在BaseDao中是找不到这个方法的。这里一定要注意:不推荐直接在类里创建public类型的方法,推荐在接口中定义public方法然后实现类去重写它即可。
注意实现类是可以继承多个接口的你可以定义一个接口UserInterface里面定义一个getUsersByClass方法,然后UserDao的代码改成class UserDao implement BaseDao,UserInterface,这时你就可以UserInterface userDao = new UserDao();userDao.getUsersByClass()
展开全部
“对数据的处理方法也不尽相同”这个就是接口的作用啊。面向接口的思想。就我只关注接口方法不管里面的具体实现。比如球员打球可能有几个动作投篮,传球,运球。于是就一个接口就这3个方法。 然后具体球员实现它。不管谁都有这几个动作。然后比如科比实现这个接口。科比调投篮就是科比投篮。詹姆斯实现这个接口就是詹姆斯投篮。因为他们都篮球运动员,所有都实现这个接口。哈哈。没听懂。上网查查面向接口思想。就懂了。呵呵。希望你工作顺利。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
解耦和,方便更换时,不需要改动代码
比如说,hibernate可以连接数据库,自己手写的JDBC也同样可以实现连接数据库。
当他们都实现了一个相同的接口,你的项目中只有转型为接口类型,你就不用管module层是怎样
去连接数据库的。
这个就是DAO接口的好处,也是接口的好处。
比如说,hibernate可以连接数据库,自己手写的JDBC也同样可以实现连接数据库。
当他们都实现了一个相同的接口,你的项目中只有转型为接口类型,你就不用管module层是怎样
去连接数据库的。
这个就是DAO接口的好处,也是接口的好处。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询