Spring和Hibernate集成的HibernateTemplate的一些常用方法总结
1:get/load存取单条数据
- public Teacher getTeacherById(Long id) {
- return (Teacher)this.hibernateTemplate.get(Teacher.class, id);
- }
- public Teacher getTeacherById(Long id) {
- return (Teacher)this.hibernateTemplate.load(Teacher.class, id);
- }
2:find/iterate查询操作
- public Iterator getTeachersByAge(int age) {
- Iterator iterator = null;
- //使用find方法
- List list = (List)this.hibernateTemplate().find("from Teacher t where t.age>?", new Integer(age));
- iterator = list.iterator();
- //使用iterator方法
- iterator = this.hibernateTemplate().iterate("from Teacher t where t.age>?", new Integer(age));
- return iterator;
- }
find和iterato的区别主要是iterate采用了N+1次查询,对于大批量查询,比如查询10000条记录,那么iterate就要执行10000+1次查询,find和iterate应根据具体的实际
情况来使用,对于频繁的写操作对象,应使用find查询,而对于一些只读的数据对象,应使用iterate操作,因为iterate操作使用了Hibernate的缓存机制
3:save/update/saveOrUpdate/delete 保存/更新/删除操作
- public void save(Teacher teacher) {
- this.hibernateTemplate.save(teacher);
- }
- public void update(Teacher teacher) {
- this.hibernateTemplate.update(teacher);
- }
- public void update(Teacher teacher) {
- this.hibernateTemplate.saveOrUpdate(teacher);
- }
- public void update(Teacher teacher) {
- this.hibernateTemplate.delete(teacher);
- }
4:bulkUpdate批量删除或者更新
bulkUpdate提供了批量删除和更新,直接转换为相应的update/delete SQL进行批量删除和更新
- public void batchDelete(String name, int age) {
- this.hibernateTemplate.bulkUpdate("delete Teacher where name=? and age = ?", new Object[]{name, age});
- }
- public void batchDelete(String name, String newName) {
- this.hibernateTemplate.bulkUpdate("update Teacher set name=? where name=?", new Object[]{newName, name});
- }
此时要注意的一个问题是,使用bulkUpdate操作,必须手工清除相关对象在Hibernate中的缓存(包括一级缓存和二级缓存)
5:execute核心方法
- public Object execute(HibernateCallBack action, boolean exposeNativeSession) throws DataAccessException {
- //获取一个Session
- Session session = getSession();
- //当前session是否在事务中
- boolean existingTransaction = SessionFactoryUtils.isSessionTransactional(session, getSessionFactory());
- FlushMode previousFlushMode = null;
- try {
- previousFlushMode = applyFlushMode(session, existingTransaction); //应用flush模式
- enableFilters(session);
- //暴露给action的session
- Session sessionToExpose = (exposeNativeSession? session: createSessionProxy(session));
- //执行action
- Object result = action.doInHibernate(sessionToExpose);
- flushIfNecessary(session, existingTransaction);
- return result;
- } catch(HibernateException ex) {
- throw convertHibernateAccessException(ex);
- } catch(SQLException ex) {
- throw convertJdbcAccessException(ex);
- } catch(RuntimeException ex) {
- throw ex;
- } finally {
- //如果session在事务中,则不关闭session
- if(existingTransaction) {
- disableFilters(session);
- if(previousFlushMode != null) {
- session.setFlushMode(previousFlushMode);
- }
- } else {
- //释放session
- SessionFactoryUtils.releaseSession(session, getSessionFactory());
- }
- }
- }
*HibernateCallBack,一般用来实现特定的业务逻辑
*exposeNativeSession:是一个布尔值,要暴露给HibernateCallBack实际的session对象,而不是一个代理过的对象
6:一般情况下,只有HIberateTemplate提供的方法不能满足要求时才使用execute方法,它的使用情况如下所示,
- public void createDatabaseSchema() throws DataAccessException {
- HibernateTemplate hibernateTemplate = new HibernateTemplate(this.sessionFactory);
- //调用HibernateTempalte的execute方法
- hibernateTemplate.execute(new HibernateCallback() {
- public Object doInHibernate(Session session) throws HibernateException, SQLException { //
实现HibernateCallback的doInHibernate方法 - //具体实现
- Connection conn = session.connection();
- final Dialect dialect = Dialect.getDialect(configuration.getProperties);
- String[] sql = configuration.generateSchemaCreationScript(dialect);
- executeSchemaScript(conn, sql);
- }
- });
- }
使用execute方法的重点是实现
HibernateCallback的doInHibernate方法,它会传递一个Session实例,可以使用此Session实例操作数据库,由此
看出execute方法的好处是应用程序不用关心session的创建和释放,只需要处理关心的业务逻辑即可。
Spring和Hibernate集成的HibernateTemplate的一些常用方法总结的更多相关文章
- Spring与Hibernate集成中的Session问题
主要讨论Spring与Hibernate集成中的session问题 1.通过getSession()方法获得session进行操作 public class Test extends Hibernat ...
- spring和hibernate集成事物管理配置方法
spring+hibernate,采用声明式事务 1.声明式事务配置 * 配置SessionFactory * 配置事务管理器 * 事务的传播特性 * 那些类那些方法使用事务 2.编写业务逻辑方法 * ...
- Spring和Hibernate集成配置
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...
- Spring 与 Hibernate 集成 Transactional设置为只读
@Transactional标签用于标记ServiceImpl使用事务,并且能够打开一个sessionFactory的session,并且打开事务. 如果在这个标签为@Transactional(pr ...
- Hibernate(十)--spring整合hibernate
结构: Spring和Hibernate整合借助于HibernateTemplate applicationContext.xml <?xml version="1.0" e ...
- 【译】Spring 4 + Hibernate 4 + Mysql + Maven集成例子(注解 + XML)
前言 译文链接:http://websystique.com/spring/spring4-hibernate4-mysql-maven-integration-example-using-annot ...
- Java Hour 56 Spring 和 Hibernate 的集成
上一章节我们完成了一个简单的Spring 的试验品,这章要让Spring 上战场了,不要慌,步骤都是一样的. Spring 对 Hibernate 的支持是很多方面的,第一个战场是SessionFac ...
- Spring第12篇—— Spring对Hibernate的SessionFactory的集成功能
由于Spring和Hibernate处于不同的层次,Spring关心的是业务逻辑之间的组合关系,Spring提供了对他们的强大的管理能力, 而Hibernate完成了OR的映射,使开发人员不用再去关心 ...
- 菜鸟学习Spring——60s学会Spring与Hibernate的集成
一.概述. Spring与Hibernate的集成在企业应用中是很常用的做法通过Spring和Hibernate的结合能提高我们代码的灵活性和开发效率,下面我就一步一步的给大家讲述Spring如何和H ...
随机推荐
- UVA 11090 Going in Cycle!!(二分答案+判负环)
在加权有向图中求平均权值最小的回路. 一上手没有思路,看到“回路”,第一想法就是找连通分量,可又是加权图,没什么好思路,那就转换题意:由求回路权值->判负环,求最小值->常用二分答案. 二 ...
- uvalive 4255 Guess(拓扑排序)
算好题目,反正我没想到可以用图论做(虽然现在做的是图论专题= =) 首先是要把求每个位置上的值转化为求 “前缀和之差”,这是一个很有用的技巧 其次,由输入的(n+(n-1)+...+2+1)个符号,可 ...
- Java [Leetcode 189]Rotate Array
题目描述: Rotate an array of n elements to the right by k steps. For example, with n = 7 and k = 3, the ...
- MVC&WebForm对照学习:ajax异步请求
写在前面:由于工作需要,本人刚接触asp.net mvc,虽然webform的项目干过几个.但是也不是很精通.抛开asp.net webform和asp.net mvc的各自优劣和诸多差异先不说.我认 ...
- 数学语言和程序语言的对比:面向过程与面向集合&命题
共同之处:都使用字符串或数值来引用一个客观实体.当然数字和字符串也可以作为实体对象,这取决于人的解释. 不同之处:数学语句每一行都给出了一个结论, 程序语句的每一行都定义了一个过程.注意这里所指的程序 ...
- DataGuard相同SID物理Standby搭建
Oracle Data Guard 是针对企业数据库的最有效和最全面的数据可用性.数据保护和灾难恢复解决方案.它提供管理.监视和自动化软件基础架构来创建和维护一个或多个同步备用数据库,从而保护数据不受 ...
- 给定一个函数rand()能产生0到n-1之间的等概率随机数,问如何产生0到m-1之间等概率的随机数?
题目:给定一个函数rand()能产生1到n之间的等概率随机数,问如何产生1到m之间等概率的随机数? 先把问题特殊化,例如原题变为给定一个函数rand5(),该函数可以随机生成1-5的整数,且生成概率一 ...
- POJ 1716 Integer Intervals
题意:给出一些区间,求一个集合的长度要求每个区间里都至少有两个集合里的数. 解法:贪心或者差分约束.贪心的思路很简单,只要将区间按右边界排序,如果集合里最后两个元素都不在当前区间内,就把这个区间内的最 ...
- java web 学习四(http协议)
一.什么是HTTP协议 HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的 ...
- poj1247 bjfu1239水题
其实就是读题啦,读懂题很简单,就是问一个数组,存不存在一个点,按这个点切成两半,这两半的数字的和是一样的.不多说了,上代码 /* * Author : ben */ #include <cstd ...