HibernateTemplate提供了非常多的常用方法来完成数据库的基本操作,使得持久层访问摸板化,只要创建HibernateTemplate实例后,注入一个SessionFactory的引用就可以了.无须手动创建sessionFactory,更加智能的管理Hibernate 的Session,没有大量的try/catch操作,
void delete(Object entity)删除指定持久化实例
deleteAll(Collection entities)删除集合内全部持久化实例
find(String queryString)根据HQL查询字符串返回实例集合
findByNamedQuery(Striing QueryName)根据命名查询返回实例集合
Get(Class entityClass,Serializable id)割据主键加载特定持久化类的实例
save(Object entity)保存实例
saveOrUpdate(Object entity)根据实例状态,选择保存或者更新
update(Object entity)更新实例的状态
setMaxResults(int maxResults)设置分页大小
HIbernate的复杂用法HibernateCallback提供了灵活方式来操作数据库,Object execute(HibernateCallback action)和List execute(HibernateCallback action)这两个方法都需要一个HibernateCallback的实例,实例可在任何有效的hibernate数据访问中使用.
import java.util.Collection;
import java.util.List;
import org.hibernate.SessionFactory;
import org.hibernate.HibernateException;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.orm.hibernate3.HibernateCallback;
//完全可以不需要MyTestDao接口,直接使用类,但这样是面向接口的编程。
public class MyTestDaoImpl implements MyTestDao
{
private SessionFactory sessionFactory;
public void setSessionFactory(SessionFactory sessionFactory)
{
this.sessionFactory = sessionFactory;
}
public Collection findAllMyTest()
{
HibernateTemplate hibernateTemplate = new HibernateTemplate(this.sessionFactory);
/*
HibernateCallback的内部类方式可在任何Hibernate数据访问中使用
对于简单的一步操作,如简单的load,savaOrUpdate则不必使用这种HibernateCallback匿名内部类的方式
*/
return (Collection) hibernateTemplate.execute( new HibernateCallback()
{
public Object doInHibernate(Session session) throws HibernateException
{
List result = session.createQuery("from MyTest")
.list();
return result;
}
});
}
}
配置文件:
<?xml version="1.0" encoding="gb2312"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
<!--定义数据源-->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName"><value>com.mysql.jdbc.Driver</value></property>
<property name="url"><value>jdbc:mysql://localhost:3306/j2ee</value></property>
<property name="username"><value>root</value></property>
<property name="password"><value>32147</value></property>
</bean>
<!--定义一个hibernate的SessionFactory-->
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource"><ref local="dataSource"/></property>
<property name="mappingResources">
<list>
<!--以下用来列出所有的PO映射文件-->
<value>lee/MyTest.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<!--此处用来定义hibernate的SessionFactory的属性:不同数据库连接,启动时选择create,update,create-drop-->
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
<!--定义DAO Bean-->
<bean id="myTestDao" class="lee.MyTestDaoImpl">
<property name="sessionFactory"><ref local="sessionFactory"/></property>
</bean>
<!--定义DAO Bean-->
<bean id="myTestDao2" class="lee.MyTestDaoHibernate">
<property name="sessionFactory"><ref local="sessionFactory"/></property>
</bean>
<!--定义DAO Bean-->
<bean id="myTestDao3" class="lee.MyTestDaoHibernate2">
<property name="sessionFactory"><ref local="sessionFactory"/></property>
</bean>
<bean id="dd" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager"><ref local="transactionManager"/></property>
<property name="target"><ref local="myTestDao3"/></property>
<property name="transactionAttributes">
<props>
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
</beans>
继承HibernateDAO的HibernateTemplate实例
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
public class BalanceDaoTemplate extends HibernateDaoSupport implements BalanceDao
{
public void saveBalance(Balance b)
{
getHibernateTemplate().save(b);
}
public void deleteBalance(Balance b)
{
getHibernateTemplate().delete(b);
}
public void deleteBalance(int id)
{
Balance b = (Balance)getHibernateTemplate().load(Balance.class, new Integer(id));
getHibernateTemplate().delete(b);
}
public void updateBalance(Balance b)
{
getHibernateTemplate().saveOrUpdate(b);
//getHibernateTemplate().update(b , org.hibernate.LockMode.WRITE);
}
public Balance getBalance(int id)
{
return (Balance)getHibernateTemplate().load(Balance.class,
new Integer(id),org.hibernate.LockMode.READ);
}
}