经典JDBC DAOFactory类实现

Java代码 复制代码
  1. package ajax.user.language.factory.dao_factory;   
  2.   
  3. import java.io.File;   
  4. import java.io.FileInputStream;   
  5. import java.io.InputStream;   
  6. import java.util.Properties;   
  7.   
  8.   
  9. /**  
  10.  * 这是我个人最近在学JDBC技术时:总结以前别人写过代码开发一个自己个人一个小工具(只针对初学者)  
  11.  * 该程序主要是读取配置文件来产生dao层实现对象(采用了反射技术);  
  12.  * 程序优点:(1)可以产生DAO层多种不同实现对象(返回Object对象需要强制转换)  
  13.  *         (2)在多线程模式下也只有一个工厂对象。  
  14.  *         (3)使用生产dao层实现对象,即使底层实现有JDBC成hibernate或者其他实现,不需要修改代码只需修改配置文件  
  15.  * @author kevin      Email:wanwei.234@163.com  
  16.  * 2010-01-09  
  17.  */  
  18. public class DaoFactory {   
  19.     /**工厂对象引用*/  
  20.     private static DaoFactory daoFactory=null;   
  21.     /**dao实现对象引用*/  
  22.     private static Object daoImpl=null;   
  23.     /**阻止new对象*/  
  24.     private DaoFactory(){}   
  25.     /**创建工厂对象*/  
  26.     public static DaoFactory getDaoFactoryInstance(){   
  27.         if(daoFactory==null){   
  28.             synchronized(DaoFactory .class){   
  29.             if(daoFactory==null){//如果没有这个判断,当两个线程同时访问这个方法会出现创建两个对象   
  30.                 daoFactory=new DaoFactory();   
  31.             }   
  32.           }   
  33.         }   
  34.         return daoFactory;   
  35.     }   
  36.     /**  
  37.      * 这是通过properties文件来产生dao实现类对象  
  38.      * properti文件写法:userDao=ajax.user.language.entity.User(这是类的全名);  
  39.      * 该方法返回的是一个Object对象,所以在使用时强制转换为你所需要的实现对象。  
  40.      * @param key userDao  
  41.      * @param filePath properties文件路径  
  42.      * @return Object对象  
  43.      */  
  44.     public Object produceDaoImpObject(String key,String filePath){   
  45.         try {   
  46.             Properties prop=new Properties();   
  47.             InputStream input=new FileInputStream(new File(filePath));   
  48.             prop.load(input);   
  49.             String daoClass=prop.getProperty(key);   
  50.             daoImpl=Class.forName(daoClass).newInstance();   
  51.         } catch (Exception e) {   
  52.             throw new ExceptionInInitializerError();   
  53.         }   
  54.         return daoImpl;   
  55.     }   
  56.     /**  
  57.      *通过配置文件名称读取src目录的的配置文件  
  58.      * @param key  
  59.      * @return Object对象  
  60.      */  
  61.     public Object produceDaoImpObjectOverFileName(String key,String FileName){   
  62.         try {   
  63.             Properties prop=new Properties();   
  64.             InputStream input=DaoFactory.class.getClassLoader().getResourceAsStream(FileName);   
  65.             prop.load(input);   
  66.             String daoClass=prop.getProperty(key);   
  67.             System.out.println(daoClass);   
  68.             daoImpl=Class.forName(daoClass).newInstance();   
  69.         } catch (Exception e) {   
  70.             e.printStackTrace();   
  71.             throw new ExceptionInInitializerError();   
  72.         }   
  73.         return daoImpl;   
  74.     }   
  75. }  
package ajax.user.language.factory.dao_factory;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.Properties;


/**
 * 这是我个人最近在学JDBC技术时:总结以前别人写过代码开发一个自己个人一个小工具(只针对初学者)
 * 该程序主要是读取配置文件来产生dao层实现对象(采用了反射技术);
 * 程序优点:(1)可以产生DAO层多种不同实现对象(返回Object对象需要强制转换)
 * 		   (2)在多线程模式下也只有一个工厂对象。
 *         (3)使用生产dao层实现对象,即使底层实现有JDBC成hibernate或者其他实现,不需要修改代码只需修改配置文件
 * @author kevin      Email:wanwei.234@163.com
 * 2010-01-09
 */
public class DaoFactory {
	/**工厂对象引用*/
	private static DaoFactory daoFactory=null;
	/**dao实现对象引用*/
	private static Object daoImpl=null;
	/**阻止new对象*/
	private DaoFactory(){}
	/**创建工厂对象*/
	public static DaoFactory getDaoFactoryInstance(){
		if(daoFactory==null){
			synchronized(DaoFactory .class){
			if(daoFactory==null){//如果没有这个判断,当两个线程同时访问这个方法会出现创建两个对象
				daoFactory=new DaoFactory();
		    }
		  }
		}
		return daoFactory;
	}
	/**
	 * 这是通过properties文件来产生dao实现类对象
	 * properti文件写法:userDao=ajax.user.language.entity.User(这是类的全名);
	 * 该方法返回的是一个Object对象,所以在使用时强制转换为你所需要的实现对象。
	 * @param key userDao
	 * @param filePath properties文件路径
	 * @return Object对象
	 */
	public Object produceDaoImpObject(String key,String filePath){
		try {
			Properties prop=new Properties();
			InputStream input=new FileInputStream(new File(filePath));
			prop.load(input);
			String daoClass=prop.getProperty(key);
			daoImpl=Class.forName(daoClass).newInstance();
		} catch (Exception e) {
			throw new ExceptionInInitializerError();
		}
		return daoImpl;
	}
	/**
	 *通过配置文件名称读取src目录的的配置文件
	 * @param key
	 * @return Object对象
	 */
	public Object produceDaoImpObjectOverFileName(String key,String FileName){
		try {
			Properties prop=new Properties();
			InputStream input=DaoFactory.class.getClassLoader().getResourceAsStream(FileName);
			prop.load(input);
			String daoClass=prop.getProperty(key);
			System.out.println(daoClass);
			daoImpl=Class.forName(daoClass).newInstance();
		} catch (Exception e) {
			e.printStackTrace();
			throw new ExceptionInInitializerError();
		}
		return daoImpl;
	}
}
Java代码 复制代码
  1.  测试类:  
 测试类:
Java代码 复制代码
  1. package ajax.user.language.dao.impl;   
  2.   
  3. import ajax.user.language.entity.Student;   
  4. import ajax.user.language.factory.dao_factory.DaoFactory;   
  5.   
  6. public class Test {   
  7.        
  8.     public static void main(String[] args) {   
  9.         DaoFactory daoFactory=DaoFactory.getDaoFactoryInstance();   
  10.         //StuDaoImpl stuImpl=(StuDaoImpl)daoFactory.produceDaoImpObjectOverFileName("StudentDaoImpl","daoconfig.properties");   
  11.         //StuDaoImpl stuImpl=(StuDaoImpl)daoFactory.produceDaoImpObject("StudentDaoImpl","D://newapps//workspace//ajax//src//daoconfig.properties");   
  12.         StuDaoImpl stuImpl=(StuDaoImpl)daoFactory.produceDaoImpObject("StudentDaoImpl","src/daoconfig.properties");   
  13.         Student s1=new Student();   
  14.         s1.setId("stu1");   
  15.         s1.setName("zhangsan");   
  16.         s1.setSex("F");   
  17.         try {   
  18.             stuImpl.addStudent(s1);   
  19.         } catch (Exception e) {   
  20.             e.printStackTrace();   
  21.         }   
  22.            
  23.     }   
  24.   
  25. }  
package ajax.user.language.dao.impl;

import ajax.user.language.entity.Student;
import ajax.user.language.factory.dao_factory.DaoFactory;

public class Test {
	
	public static void main(String[] args) {
		DaoFactory daoFactory=DaoFactory.getDaoFactoryInstance();
		//StuDaoImpl stuImpl=(StuDaoImpl)daoFactory.produceDaoImpObjectOverFileName("StudentDaoImpl","daoconfig.properties");
		//StuDaoImpl stuImpl=(StuDaoImpl)daoFactory.produceDaoImpObject("StudentDaoImpl","D://newapps//workspace//ajax//src//daoconfig.properties");
	    StuDaoImpl stuImpl=(StuDaoImpl)daoFactory.produceDaoImpObject("StudentDaoImpl","src/daoconfig.properties");
		Student s1=new Student();
		s1.setId("stu1");
		s1.setName("zhangsan");
		s1.setSex("F");
		try {
			stuImpl.addStudent(s1);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}

}

 配置文件:daoconfig.properties

Properties代码 复制代码
  1. StudentDaoImpl=ajax.user.language.dao.impl.StuDaoImpl  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值