HibernateTemplate 可将Hibernate 的持久层访问模板化,使用HibernateTemplate 非常简单。
创建HibernateTemplate 实例后,注入一个SessionFactory 的引用,就可执行持久化操作。
SessionFactory 对象可通过构造参数传入,或通过设值方式传入。
Dao实现类继承HibernateDaoSupport类,该类是抽象类,该类中有一个HibernateTemplate的属性,
通过this.getHibernateTemplate()可获得一个HibernateTemplate类的对象。
spring的xml文件配置为:
<!-- 导入资源文件 -->
<context:property-placeholder location="classpath:db.properties" />
<!-- 1,配置 C3P0 数据源 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="jdbcUrl" value="${jdbc.jdbcUrl}"></property>
<property name="driverClass" value="${jdbc.driverClass}"></property>
<property name="user" value="${jdbc.user}"></property>
<property name="password" value="${jdbc.password}"></property>
<property name="initialPoolSize" value="${jdbc.initPoolSize}"></property>
<property name="maxPoolSize" value="${jdbc.maxPoolSize}"></property>
</bean>
<!-- 2,配置 Hibernate 的 SessionFactory -->
<bean id="sessionFactory"
class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<!-- 配置数据源 -->
<property name="dataSource" ref="dataSource"></property>
<!-- 配置 hibernate 映射文件的位置及名称, 可以使用通配符 -->
<property name="mappingLocations" value="classpath:com/bean/*.hbm.xml">
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
<prop key="hibernate.show_sql">flase</prop>
<prop key="hibernate.format_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.autoReconnect">true</prop>
</props>
</property>
</bean>
<!--3,配置 Spring 的声明式事务 -->
<!-- 3.1配置事务管理器 -->
<bean id="transactionManager"
class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
<!-- 开启注解事务 -->
<tx:annotation-driven transaction-manager="transactionManager" />
<!-- 3.2 配置事务属性, 需要事务管理器 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="save*" read-only="false" />
<tx:method name="delete*" read-only="false" />
<tx:method name="update*" read-only="false" />
<tx:method name="get*" read-only="true" />
<tx:method name="find*" read-only="true" />
</tx:attributes>
</tx:advice>
<!-- 3.3 配置事务切点, 并把切点和事务属性关联起来 -->
<aop:config>
<!-- 设置安全线程可用范围(使getCurrentSession()方法可用) -->
<aop:pointcut expression="execution(* com.ssh.*.*(..))"
id="txPointcut" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut" />
</aop:config>
<!-- 4 配置dao类 -->
<bean name="userDao" class="com.ssh.dao.UserImp">
<property name="sessionFactory" ref="sessionFactory"></property>
</bean>
下面是 HibernateTemplate的常用方法。
delete(Object entity): 删除指定持久化实例。
deleteAll(Collection entities): 删除集合内全部持久化类实例。
find(String queryString): 根据 HQL 查询字符串来返回实例集合。
findByNamedQuery(String queryName): 根据命名查询返回实例集合。
load或get(Classentity Class,Serializable id): 根据主键加载特定持久化类的实例。
save(Object entity): 保存新的实例。
saveOrUpdate(Object entity): 根据实例状态,选择保存或者更新。
update(Object entity): 更新实例的状态,要求entity 是持久状态。
setMaxResults(intmax Results): 设置分页的大小。
HibernateTemplate与session的区别
使用方法没有多大的区别,只是使用时不用自己设置事务,也不用关闭session。
我们使用HibernateTemplate,有一个很重要的原因就在于我们不想直接控制事务,不想直接去获取,打开Session,开始一个事务,处理异常,提交一个事务,最后关闭一个SessionHibernateTemplate 是Hibernate操作进行封装,我们只要简单的条用HibernateTemplate 对象,传入hql和参数,就获得查询接口,至于事务的开启,关闭,都交给HibernateTemplate 对象来处理我们自己只专注于业务,不想去作这些重复而繁琐的操作。我们把这些责任全部委托给了 HibernateTemplate,然后使用声明式的配置来实现这样的功能。如果我们通过类似getSession()这样的方法获得了Session,那就意味着我们放弃了上面所说的一切好处。在使用Spring的时候 DAO类继承了 HibernateDaoSupport 类又因为HibernateDaoSupport 类里面有个属性 hibernateTemplate;所以就可以进行设置注,也就是Spring的一大优点面向切面式编程,进行设置注入,在Tomcat启动的时候由 Tomcat 加载 ApplicationContext.xml,配置文件给 hibernateTemplate赋值,这样的话就实现了,在使用某个对象之前不用给他实例化