java设计模式--DAO模式

来源:互联网 发布:韩子高网络剧演员表 编辑:程序博客网 时间:2024/06/16 21:50

DAO设计模式

★ DAO的理解
1、DAO其实是利用组合工厂模式来解决问题的,并没有带来新的功能,所以学的其实就是个思路。
2、DAO理论上是没有层数限制的。
3、DAO的各层理论上是没有先后的。
★ DAO模式的本质
一层屏蔽一种变化
★ DAO基础DAO模式是标准的J2EE设计模式之一.开发人员使用这个模式把底层的数据访问操作和上层的商务逻辑分开.一个典型的DAO实现有下列几个组件:1. 一个DAO工厂类;2. 一个DAO接口;3. 一个实现DAO接口的具体类;4. 数据传递对象(有些时候叫做值对象).


下面举例(多层dao接口的实现)
具体实现:
1.dao接口:
package cn.hncu.pattern.dao.dao;public interface DepDAO {public void create(String userId, String name);}
2.dao工厂
package cn.hncu.pattern.dao.factory;import cn.hncu.pattern.dao.dao.DepDAO;import cn.hncu.pattern.dao.impl.a.factory.F2AFactory;import cn.hncu.pattern.dao.impl.b.factory.F2BFactory;public class F1Factory {private F1Factory(){}public static DepDAO getDepDAO(){int type1=1;//第一层工厂的选择类型,按理应该从用户的配置信息中读取,我们这里模拟了if(type1==1){return F2AFactory.getDepDAO();}else if(type1==2){return F2BFactory.getDepDAO();}return null;}}
3.dao实现接口
第二层dao
package cn.hncu.pattern.dao.impl.a.factory;import cn.hncu.pattern.dao.dao.DepDAO;import cn.hncu.pattern.dao.impl.a.rdb.factory.F3A_RDB_Factory;import cn.hncu.pattern.dao.impl.b.factory.F2BFactory;public class F2AFactory {private F2AFactory() {}public static DepDAO getDepDAO() {int type2 = 3;// 第二层工厂的选择类型,按理应该从用户的配置信息中读取,我们这里模拟了if (type2 == 1) {//return F3A_File_Factory.getDepDAO();} else if (type2 == 2) {//return F3A_ODB_Factory.getDepDAO();} else if (type2 == 3) {return F3A_RDB_Factory.getDepDAO();}else if (type2 == 4) {//return F3A_XML_Factory.getDepDAO();}return null;}}
package cn.hncu.pattern.dao.impl.b.factory;import cn.hncu.pattern.dao.dao.DepDAO;public class F2BFactory {private F2BFactory(){}public static DepDAO getDepDAO(){return null;}}
第三层dao
package cn.hncu.pattern.dao.impl.a.rdb.factory;import cn.hncu.pattern.dao.dao.DepDAO;import cn.hncu.pattern.dao.impl.a.rdb.oracle.factory.F4A_RDB_Oracle_Factory;public class F3A_RDB_Factory {private F3A_RDB_Factory(){}public static DepDAO getDepDAO(){int type3 = 2;// 第3层工厂的选择类型,按理应该从用户的配置信息中读取,我们这里模拟了if(type3==1){//return F4A_RDB_MySQL_Factory.getDepDAO();}else if(type3==2){return F4A_RDB_Oracle_Factory.getDepDAO();}else if(type3==3){//return F4A_RDB_XML_Factory.getDepDAO();}return null;}}

第四层dao
package cn.hncu.pattern.dao.impl.a.rdb.oracle.factory;import cn.hncu.pattern.dao.dao.DepDAO;import cn.hncu.pattern.dao.impl.a.rdb.oracle.ejb.DepEjbImpl;import cn.hncu.pattern.dao.impl.a.rdb.oracle.hibernate.DepHibernateImpl;import cn.hncu.pattern.dao.impl.a.rdb.oracle.jdbc.DepJdbcImpl;import cn.hncu.pattern.dao.impl.a.rdb.oracle.jpa.DepJpaImpl;public class F4A_RDB_Oracle_Factory {private F4A_RDB_Oracle_Factory(){}public static DepDAO getDepDAO(){int type4 = 1;// 第4层工厂的选择类型,按理应该从用户的配置信息中读取,我们这里模拟了if(type4==1){return new DepEjbImpl();}else if(type4==2){return new DepHibernateImpl();}else if(type4==3){return new DepJdbcImpl();}else if(type4==4){return new DepJpaImpl();}return null;}}
实现类:
package cn.hncu.pattern.dao.impl.a.rdb.oracle.ejb;import cn.hncu.pattern.dao.dao.DepDAO;public class DepEjbImpl implements DepDAO{@Overridepublic void create(String userId, String name) {System.out.println("利用DepEjbImpl向数据库写入:"+userId+","+name);}}
package cn.hncu.pattern.dao.impl.a.rdb.oracle.hibernate;import cn.hncu.pattern.dao.dao.DepDAO;public class DepHibernateImpl implements DepDAO{@Overridepublic void create(String userId, String name) {System.out.println("利用DepHibernateImpl向数据库写入:"+userId+","+name);}}
package cn.hncu.pattern.dao.impl.a.rdb.oracle.jdbc;import cn.hncu.pattern.dao.dao.DepDAO;public class DepJdbcImpl implements DepDAO{@Overridepublic void create(String userId, String name) {System.out.println("利用DepJdbcImpl向数据库写入:"+userId+","+name);}}
package cn.hncu.pattern.dao.impl.a.rdb.oracle.jpa;import cn.hncu.pattern.dao.dao.DepDAO;public class DepJpaImpl implements DepDAO{@Overridepublic void create(String userId, String name) {System.out.println("利用DepJpaImpl向数据库写入:"+userId+","+name);}}
测试:
package cn.hncu.pattern.dao;import cn.hncu.pattern.dao.dao.DepDAO;import cn.hncu.pattern.dao.factory.F1Factory;//本类是dao层的用户,相当于逻辑层public class Client {public static void main(String[] args) {DepDAO dao = F1Factory.getDepDAO();dao.create("1001", "Jack");}}

测试结果:
利用DepEjbImpl向数据库写入:1001,Jack