二十二、Java日常积累:Hibernate中getHibernateTemplate()方法介绍

Java日常积累 专栏收录该内容
30 篇文章 0 订阅

一、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. 模板和回调

  1. 模板虽好,但有得有失
  2. 有时候我们需要更加灵活
  3. spring提供了回调机制
  4. 模板固化了不变、流程化的内容,简化使用
  5. 回调允许我们在固化了的内容中加入变化的内容
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();
        }
    });
  • 0
    点赞
  • 0
    评论
  • 1
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

©️2022 CSDN 皮肤主题:黑客帝国 设计师:白松林 返回首页

打赏作者

非著名JAVA程序员

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值