HibernateTemplate类如何重写hibernate方法(this.getHibernateTemplate().find();)

本文章完全模拟HibernateTemplate类重写hibernate的方法时用到的回掉函数和匿名内部类结合的思想,以便了解其中的编程思想。

接口类

该类为一个回掉接口,提供了回掉方法,并规定了参数和返回值,等待客户端实现

package callback;

import org.hibernate.Session;

public interface HibernateCallback {
	public Object doInHibernate(Session session);
}


核心类

该类提供了一个doExecute方法,封装了一些相同的操作。该方法的重点是以接口为参数,在该方法中调用接口中的方法,因为接口中的方法没有实现,所以在其他方法调用该方法的时候,直接以new一个匿名内部类实现该回调函数即可,这样新方法中就可以不用重写与doExecute方法中相同的操作。
这个类设计思想的精髓在于:既方便了HibernateTemplate内部对hibernate常用方法的重写,又便于程序员(客户端)调用该方法。



 

 
package callback;

import java.util.List;

import org.hibernate.Session;
import org.hibernate.SessionFactory;

public class SpringHibernateCore {
	private SessionFactory sessionFactory;
	
	//提供set方法,将sessionFactory注入到该类中
	public void setSessionFactory(SessionFactory sessionFactory) {
		this.sessionFactory = sessionFactory;
	}
	
	public Object doExecute(HibernateCallback action){
		Object object=null;
		Session session=sessionFactory.openSession();
		object=action.doInHibernate(session);
		session.close();
		return object;
	}
	public List find(final String hql){
		return (List)this.doExecute(new HibernateCallback() {
			@Override
			public Object doInHibernate(Session session) {
				return session.createQuery(hql).list();
			}
		});
	}
}

DAO类

package callback;

import java.util.List;

import domain.Person;

public class PersonDaoCallback extends SpringHibernateCore{
	public void queryPerson(){
		List<Person> persons = this.find("from Person");
		System.out.println(persons.size());
	}
}

测试类

package callback;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class PersonCallbackTest {
	@Test
	public void testPersonCallback(){
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
		PersonDaoCallback personDaoCallback = (PersonDaoCallback) context.getBean("personDaoCallback");
		personDaoCallback.queryPerson();
	}
}





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值