Hibernate中getHibernateTemplate方法介绍
- 一、getHibernateTemplate()方法介绍
- 2. getHibernateTemplate()常用方法
- 3. 模板和回调
一、getHibernateTemplate()方法介绍
getHibernateTemplate()是Hibernate为了简化相关的增删改查操作,而封装了数据库的一些例行通用操作,可以直接使用,以此来提升开发效率。但是是由Spring整合Hibernate的时候才用到的,由Spring对Hibernate相关的操作对象进行封装。且DAO层实现类必须继承HibernateDaoSupport。如下代码:
public class DepartmentDaoImpl extends HibernateDaoSupport implements DepartmentDao {
/**
* 总的记录数
*/
public int findCount() {
String hql="select count(*) from Department";
List<Long> list = this.getHibernateTemplate().find(hql);
if (list.size() > 0) {
return list.get(0).intValue();
}
return 0;
}
springj注入Hibernate相关配置文件,如果使用getHibernateTemplate()则Dao的实现类中需要手动注入sessionFactory
<!-- 配置Dao层的类 -->
<bean id="departmentDao" class="com.employee.dao.impl.DepartmentDaoImpl">
<!-- 注入sessionFactory -->
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<bean id="employeeDao" class="com.employee.dao.impl.EmployeeDaoImpl">
<!-- 注入sessionFactory -->
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- 配置transaction事务管理器 -->
<bean name="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<!-- 注入sessionFactory -->
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
<!-- 开启注解事务 -->
<tx:annotation-driven transaction-manager="transactionManager"/>
如果使用getHibernateTemplate()就不要自己获取获取buildSessionFactory()->openSession()->beginTransation()
Configuration cfg = new Configuration();
cfg.configure("hibernate.cfg.xml"); // 读取指定的主配置文件
sessionFactory = cfg.buildSessionFactory(); // 根据配置生成Session工厂
User user = new User();
user.setName("张三");
Session session = sessionFactory.openSession(); // 打开一个新的Session
Transaction tx = session.beginTransaction(); // 开启事务
session.save(user);
tx.commit(); // 提交事务
session.close(); // 关闭Session,释放资源(不一定是真正的关闭)
2. getHibernateTemplate()常用方法
• find方法
• get方法
• update方法
• get方法
• save方法
• delete方法
• 常用方法总结
• 使用get/load方法通过主键获取单条数据
/**
* 通过id查一个部门的信息:查询的did必须为主键
*/
public void finById(Integer did) {
this.getHibernateTemplate().get(Department.class, did);
}
public void finById(Integer did) {
this.getHibernateTemplate().get(Department.class, did);
}
- find查询
find(String hql):返回查询结果
String hql = "select count(*) from User";
List<Long> list = this.getHibernateTemplate().find(hql);
find(String hql, Objectp[] values):返回所有符合查询条件的Object对象集合
/*
*查询帐号为Lijian,密码为123的User实体对象
*/
String hql= "from User where name='Lijian' and password='123'";
this.getHibernateTemplate().find(hql, new String[]{"Lijian", "123"});
findByExample(Object exampleEntity):通过实例查找,通过实例的属性所有匹配位置返回list
findByExample(Object exampleEntity, int firstResult, int maxResult):限制返回条数
/*
* 符合的条件:User帐号为Lijian,密码为123
* 两个条件必须是同时的,相当于sql语句中的and:
* select User from where name='Lijian' and password='123'
*/
User u=new User();
u.setPassword("123" );
u.setName("Lijian" );
List<User> list = this .getHibernateTemplate().findByExample(u);
findByNamedParam(String hql, String paramName, Object value):返回paramName为value的hql查 询结果
findByNamedParam(String hql, String[] paramNames, Object[] values):同上,参数、值都为数组
/*
* 返回name为Lijian的User对象条数(hql查询结果为记录条数)
* 类似于sql语句中通配符?,后面传入参数值
* select count(*) from User where name=?
*/
String queryString = "select count(*) from User where name=:myName"
String paramName= "myName";
String value= "Lijian";
this .getHibernateTemplate().findByNamedParam(queryString, paramName, value);
/*
* 返回name为Lijian,password为123的User对象条数(hql查询结果为记录条数)
*
*/
String queryString = "select count(*) from User where name=:myName and password=:myPassword"
String[] paramName= new String[]{"myName", "myPassword"};
String[] value= new String[]{"Lijian", "123"};
this .getHibernateTemplate().findByNamedParam(queryString, paramName, value);
findByValueBean(String hql, Object value):先定义要给valueBean,其中的属性于hql参数对应一致, 随后将ValueBean作为参 数传入
//定义ValueBean
ValueBean valueBean= new ValueBean();
valueBean.setMyName("Lijian");
valueBean.setMyPasswrod("123");
String queryString= "from User where name=:myName and u.password=:myPassword";
//将定义的ValueBean作为参数传入,也就是传递了MyName与MyPassword两个值
this.getHibernateTemplate().findByValueBean(queryString , valueBean);
- delete方法
void delete(Object entity):删除指定持久化实例
deleteAll(Collection entities):删除集合内全部持久化类实例 - save方法
save(Object entity):保存新的实例
saveOrUpdate(Object entity):根据实例状态,选择保存或者更新
3. 模板和回调
- 模板虽好,但有得有失
- 有时候我们需要更加灵活
- spring提供了回调机制
- 模板固化了不变、流程化的内容,简化使用
- 回调允许我们在固化了的内容中加入变化的内容
public List<ClaimVoucher> find(final int first, final int pageSize) {
//模板和回调-->回调就是为了解决模板中不能实现的
return this.getHibernateTemplate().executeFind(new HibernateCallback() {
@Override
public List doInHibernate(Session arg0)
throws HibernateException, SQLException {
// TODO Auto-generated method stub
return arg0.createQuery(" from ClaimVoucher c")
.setFirstResult((first-1)*pageSize)
.setMaxResults(pageSize)
.list();
}
});