11
回答
java dao工厂类
想知道一个典型的dao是什么样子的,还有具体说说dao工厂类,谢谢!
<无标签>
举报
田叶清
发帖于6年前 11回/1K+阅
共有11个答案 最后回答: 6年前
// 这里的 Proxy 不是代理的意思,只是为了区分Hib的Factory
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

public class Proxy {

	private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";
	private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>();
	private static Configuration configuration = new Configuration();
	private static org.hibernate.SessionFactory sessionFactory;
	private static String configFile = CONFIG_FILE_LOCATION;

	static {
		try {
			configuration.configure(configFile);
			sessionFactory = configuration.buildSessionFactory();
		} catch (Exception e) {
			System.err.println("%%%% Error Creating SessionFactory %%%%");
			e.printStackTrace();
		}
	}

	private Proxy() {
	}

	public static Session getSession() throws HibernateException {
		Session session = (Session) threadLocal.get();

		if (session == null || !session.isOpen()) {
			if (sessionFactory == null) {
				rebuildSessionFactory();
			}
			session = (sessionFactory != null) ? sessionFactory.openSession()
					: null;
			threadLocal.set(session);
		}

		return session;
	}

	public static void rebuildSessionFactory() {
		try {
			configuration.configure(configFile);
			sessionFactory = configuration.buildSessionFactory();
		} catch (Exception e) {
			System.err.println("%%%% Error Creating SessionFactory %%%%");
			e.printStackTrace();
		}
	}

	public static void closeSession() {
		Session session = null;
		try {
			session = (Session) threadLocal.get();
			threadLocal.set(null);
			if (session != null) {
				session.close();
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			if (session != null) {
				session.close();
			}
		}
	}

	public static SessionFactory getSessionFactory() {
		return sessionFactory;
	}

	public static void setConfigFile(String configFile) {
		Proxy.configFile = configFile;
		sessionFactory = null;
	}

	public static Configuration getConfiguration() {
		return configuration;
	}

}

给你写个经典的实例吧 

我实例的目录结构

 

DaoFactory中的代码

package Demo2;

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

public class DaoFactory {
	public static void main(String[] args) {
		DaoFactory.getInstance(CarDao.class).run();
	}
	
	public static <T> T getInstance(Class<T> t){
		InputStream in = DaoFactory.class.getResourceAsStream("properties");
		Properties pro = new Properties();
		try {
			pro.load(in);
			//System.out.println(t.getSimpleName());
			String str =pro.getProperty(t.getSimpleName());
			//System.out.println(str);
			return (T)Class.forName(str).newInstance();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}	
}

interface CarDao{
	void run();
}

class AudiCarDaoImpl implements CarDao{

	@Override
	public void run() {
		System.out.println("奥迪最高时速能跑到250km/h");
	}
	
}

class BenzCarDaoImpl implements CarDao{

	@Override
	public void run() {
		System.out.println("大奔最高时速能跑到300km/h");
	}
	
}

猜猜执行结果是什么?

大奔最高时速能跑到300km/h

是这个!!! 什么原因 看看代码就知道是 properties这个文件决定的

properties文件如下:

CarDao=Demo2.BenzCarDaoImpl

那么在不改变代码的前题下!!!  怎么改变配置文件使得代码执行结果变成如下

奥迪最高时速能跑到250km/h

恩 自己思考下 思考完了也就基本明白什么是 DaoFactory 和 Dao的好处了

 

 

 

 

--- 共有 5 条评论 ---
田叶清很有道理!!! 6年前 回复
kong_resty回复 @田叶清 : 1.接口的有点: 制定标准、可扩展性好 2.工厂: 通过接口去要实例 更方便 假如你要买鞋子 直接去工厂买? 当然不是,去鞋店这个接口买 哈哈 3.基于配置:将来维护更简单,改配置谁不会啊 哈哈 6年前 回复
田叶清我就是不太明白这么做的意义,其他都没变我干嘛要改变使用的实现类? 能用个实际问题说明不? 6年前 回复
田叶清不瞒您说,这个......我真懂 6年前 回复
田叶清等的就是你的答案,费心了! 6年前 回复
顶部