前面时间一直忙于赶项目,忽略了Struts2+hibernate+spring这个系列只是开了个头,所以赶紧把以前的代码翻出来,整理了一下,就接着讲DAO层吧。
首先我们一起讨论一下DAO层的设计,一般来说,有这样两种设计:
java 代码
- public class ADAO(){
- public void create(A a){
- ....
- }
- public void add(A a){
- ....
- }
- public void delete(A a){
- ....
- }
- }
- public class BDAO(){
- public void create(B b){
- ....
- }
- public void add(B b){
- ....
- }
- public void delete(B b){
- ....
- }
- public void find(B b){
- ....
- }
- }
- public class CDAO(C c){
- public void create(){
- ....
- }
- public void add(C c){
- ....
- }
- public void delete(C c){
- ....
- }
- public void find(C c){
- ....
- }
- }
这里一共设计了三个实体DAO,分别为A,B,C,这样的好处是对象的封装思想比较好,每个实体DAO都有自己独立的接口方法,但缺点也显而易见,就是重复代码太多太多。
再看第二种设计思想,以解决前面的缺点:
java 代码
- abstract public class BaseDAO{
- public void create(Object o){
- ....
- }
- public void add(Object o){
- ....
- }
- public void delete(Object o){
- ....
- }
- }
- public class ADAO entends BaseDAO{
- public void otherMethod(A a){
- .....
- }
- }
- //other EntityDAO
- .....
使用这种设计思想,很好的解决了前面的瓶颈,但它也有缺点,破坏了面向对象的封装性。
两个设计思想,我们该如何取舍呢?其实如果了解泛型的话,就迎刃而解了,于是,就有了第三种解决方案如下:
java 代码
- abstract public class DAO {
- public void create (T t)){
- ...
- }
- public void delete (T t)){
- ...
- }
- public void update (T t)){
- ...
- }
- ...
- }
- public class ADAO extends BaseDAO {
- public void otherMethod (A a){
- ...
- }
- }
注:关于泛型的知识,不是本文所要讲的,如有不解,可查找有关文档寻求帮助。
应该说,我个人比较喜欢第三种解决方案,由于这个项目使用了spring,于是大家应该又能想到让它继承于Spring的HibernateDaoSupport
,提供分页函数和若干便捷查询方法,并对返回值作了泛型类型转换。
经过讨论后,大家应该有了比较好的思路了,具体代码碍于篇幅,下一篇贴出。