【hibernate初探】之接口说明,session使用
hibernate作为一个完整的ORM映射框架,通过配置即可以让我们从复杂的JDBC操作中脱离出来。hibernate封装了 JDBC,JTA(java transaction API) 和JNDI。hibernate 是一个轻量级的框架,对于开发人员,可以采用它提供的接口进行数据库操作,当然也可以直接绕过hibernate,采用原生JDBC操作。而且当与Spring整合之后,Spring也提供了jdbcTemplate 。所以,使用者最好区分到底用谁的。
hibernate主要接口
根据图示:configration中获取到sessionfactory,然后sessionfactory中获取session,在获取对应接口执行对应的操作。
在这个地方需要注意的是,sessionfactory是重量级的(用来缓存sql语句之类),session是轻量级的,主要缓存一些java对象。
缓存清理
java中对象生命周期是从 new开始,终止与没有引用指向。再说一下,session的清理缓存,在某些时间点按照缓存中对象的变化执行sql同步更新数据库,称为清理缓存。
时间点主要有 commit () flush() 加上查询的时候,如果存在脏数据也会先清理缓存。
2.1 java对象在session声明周期中的三种形态
new 一个对象 是临时态, session.save()将其持久化,session.close()如果再用该对象该对象实际上是游离态,假如不是session.close()而是session.delete()就会变成删除状态
注意:
临时态 对象OID为空,
被删除对象 是计划要删除,执行了tx.xommit()就会被删除
2.2 session相关方法
session.save() :不会立即执行insert语句,只有当session清理缓存的时候才会执行insert语句。
这个地方有个细节就是,session.save()之后在如果在修改值,会产生两条sql语句。一条insert一条update。所以应该先修改完值在save()
session.update() 也有一个细节点
session.update()只有在清理缓存的时候才会执行update,所以 下边的代码是一样的
sesion.saveOrupdate():会根据传入参数是临时态还是游离对象还是持久化对象,选择是save还是update
批量处理数据
当处理大量数据时,如果还是简单的在应用层一条条调用语句,会导致两个问题。第一个是内存占用过大,第二是效率低下
这种大数据就避免在应用层处理数据,而是直接采用数据库层处理数据。例如直接在数据库层执行批量操作,如果批量操作逻辑复杂,
可以写存储过程(),但是mysql不支持
当然,也可以在应用层做批量处理:
session:比如每处理20条就手动flush,再session.clear()
StatelessSession:无状态的session,不会加载到内存
HQL:根据条件
JDBC API(我开发中用此方法):涉及数据不会加载到内存,可以实现Work接口
作者:leader_Hoo
出处:http://www.cnblogs.com/ldh-better/
本文版权归作者和博客园共有,欢迎转载,唯一要求的就是请注明转载,此外,如果博客有帮助,希望可以帮忙点击推荐和分享,谢谢