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);
- }
- 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;
- }
- }
第二层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;
- }
- }
- 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{
- public 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{
- public 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{
- public 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{
- public 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