`

hinernate 杂文

阅读更多
1.hiberante,将部分查询字段值封装成自定义的bean
List<MyBean> users = this.hibernateTemplate.find("select new MyBean(usename, password) from JBAUser u where u.username='" + jbaUser.getUsername() + "'");    
    
for(JBAUser user : users) {    
   System.out.println(user.getUsername());    
   System.out.println(user.getPassword());    
}   
注:把选取的部分属性值用自定义的new MyBean包含起来
2.hibernate的批量更新
效率最低的一种方式
session.find("from Customer c where c.age>0")执行的结果是想符合的数据都查询到内存中。然后对查询结果再进行遍历再修改。
这种方式第一消耗内存,第二参数大量的更新sql语句,浪费资源。
改进方式
session.flush();
session.evict(customer);
flush方法会马上让hibernate根据对象的状态马上同步数据库。从而立即执行update语句
evict方法会让session把该对象从缓存中清除掉
虽然上面对内存进行了及时释放进行了一些处理,但是还是要进行大量的更新操作。
所以可以通过JDBC的批处理的方式进行更新,即使用
tx = session.beginTransaction();
Connection con=session.connection(); //该方法过期,可以使用SessionFactoryUtils的getDataSource方法
PreparedStatement stmt=con.prepareStatement("update语句");//直接通过sql语句更新了
stmt.executeUpdate();
tx.commit();
当然也可以调用存储过程
create or replace procedure batchUpdateObject(p_age in number) as
begin
更新语句;
end;
调用存储过程
tx = session.beginTransaction();
Connection con=session.connection();
String procedure = "{call 存储过程名称(?)}";
CallableStatement cstmt = con.prepareCall(procedure);
cstmt.setInt(1,0); //把年龄参数设为0
cstmt.executeUpdate();
tx.commit();

session的各自update方法重载一次就只能更新一个对象。
session的delete方法可以传入hql语句,但是delete方法并没有直接执行delete的sql语句。而是先将delete的对象加载到内存然后再一条一条delete的。
如它会先执行:
select * from CUSTOMERS where AGE>0;
接下来执行一万条delete语句,逐个删除Customer对象:
delete from CUSTOMERS where ID=i;
delete from CUSTOMERS where ID=j;
……
delete from CUSTOMERS where ID=k;
但是hibernate的Query对批量更新和批量删除提供了支持
批量更新:
1.Session session = sessionFactory.openSession();  
2.Transaction tx = session.beginTransaction();  
3.String hqlUpdate = "update Customer set name = :newName where name =ldName";  
4.int updatedEntities = s.createQuery( hqlUpdate )  
5..setString( "newName", newName )  
6..setString( "oldName", oldName )  
7..executeUpdate();  
8.tx.commit();  
9.session.close();
批量删除:
1.Session session = sessionFactory.openSession();  
2.Transaction tx = session.beginTransaction();  
3.String hqlDelete = "delete Customer where name =ldName";  
4.int deletedEntities = s.createQuery( hqlDelete )  
5..setString( "oldName", oldName )  
6..executeUpdate();  
7.tx.commit();  
8.session.close();

3.Hibernate 3中引入了用于批量更新或者删除数据的HQL语句
HQL语句可以处理批量更新或是删除,使用HQL要通过Query对象。
如:
String HQL="delete User";
Query query=session.createQuery(HQL);
int size=query.executeUpdate();
这种使用方式与直接使用JDBC性能相差无几。
如果使用JDBC进行批处理如插入,修改,删除无疑具有最高的性能。
因为省去了
● HQL语句到SQL语句的转换。
● Java对象的初始化。
● Java对象的缓存处理。
但是直接使用JDBC一个最重要的问题就是要处理缓存中的Java对象。因为通过这种底层方式对数据的修改将不能通知缓存去进行相应的更新操作,以保证缓存中的对象与数据库中的数据是一致的。
4.hibernate中SQL语句的生产方式有2种,一种是编程人员自动编写的SQL语句。而是使用关联对象自动生成的SQL语句,如criteria。
5.对象关联时使用的抓取策略是非常重要的。
6.Hibernate执行查询的基本方法:
执行单个基本查询使用的方法get和load
他们的基本区别就是在二级缓存的使用上,load会去查询二级缓存,而get在1级缓存查找不到数据时就会直接去数据库进行查询了。
如果使用了二级缓存,则使用load方法。
查询多个对象使用list()方法和iterator()方法
区别是list()方法在运行时直接执行查询结果所需要的查询语句,而iterator()方法会先查找持久化对象的id,然后再根据id查询需要的对象。因此list()方法只会执行一条SQL语句,而iterator()可能需要执行N+1条语句(具体情况要看缓存)。
7.缓存的使用
list()方法只能使用二级缓存中的查询缓存。而无法使用二级缓存的单个对象缓存(但是会把查询出来的对象放入二级缓存中)。除非执行相同的查询操作,否则无法运用缓存机制来提高效率。
 iterator()方法则可以充分利用二级缓存,在根据ID检索对象的时候会首先到缓存中查找,只有在找不到的情况下才会执行相应的查询语句。所以,缓存中对象的存在与否会影响到SQL语句的执行数量。
对结果处理的使用不同
list()方法会一次性获取所有的查询结果,然后根据结果进行对象的初始化,如果数据量特别大可能会照成内存溢出的情况。
iterator()方法在执行时不会一次初始化所有的对象,而是根据对结果集的访问情况来初始化对象。因此在访问中可以控制缓存中对象的数量,以避免占用过多缓存,导致内存溢出情况的发生。使用iterator()方法的另外一个好处是,如果只需要结果集中的部分记录,那么没有被用到的结果对象根本不会被初始化。所以,对结果集的访问情况也是调用iterator()方法时执行数据库SQL语句多少的一个因素。
8.hibernate的clear清除全部session缓存数据。evict(Object)清除指定的缓存对象
9.query.setCacheable(true);//激活查询缓存
10.createQuery和createSQLQuery()需要注意的问题
使用createSQLQuery()会去数据库查询数据。若是想要直接出对应的pojo对象可以使用
session.createSQLQuery().addEntity(Product.class);的方式,
createSQLQuery不会去利用二级缓存
如果不添加addEntity(Product.class)会是返回object[]的数组。即对应返回字段的值的数组

createQuery若是设置.setCacheable(true)表示使用二级缓存

分享到:
评论

相关推荐

    Hibernate 配置各种数据库

    Hibernate 配置各种数据库 Hibernate 是一个基于 Java 的持久层框架,提供了一个抽象的数据访问层,能够与多种数据库进行集成。在 Hibernate 的配置文件中,我们可以配置不同的数据库连接,包括驱动程序、URL 等...

    Hibernate入门到精通

    "Hibernate入门到精通" Hibernate 是一个基于Java的ORM(Object-Relational Mapping,对象关系映射)框架,它提供了一种简洁高效的方式来访问和操作关系数据库。下面是 Hibernate 的主要知识点: Hibernate 简介 ...

    hibernate jar包:hibernate-commons-annotations-4.0.1.Final.jar等

    Hibernate.jar包,Hibernate可以应用在任何使用JDBC的场合,包含 hibernate-commons-annotations-4.0.1.Final.jar hibernate-core-4.1.12.Final.jar hibernate-ehcache-4.1.12.Final.jar hibernate-entitymanager-...

    hibernate3.zip 包含hibernate3.jar

    Hibernate3 是一个非常重要的Java持久化框架,它简化了数据库操作,使得开发人员可以更加专注于业务逻辑而不是数据库的细节。这个`hibernate3.zip`压缩包包含了`hibernate3.jar`,它是Hibernate 3版本的核心库,包含...

    hibernate基础jar包

    Hibernate是一个开源的对象关系映射(ORM)框架,它允许Java开发者使用面向对象的方式来操作数据库,极大地简化了数据访问层的编程工作。这个压缩包包含了Hibernate的基础jar包,这些jar文件是开发Hibernate应用所...

    kingbaseV8 hibernate jdbc 驱动

    在Java开发环境中,与KingbaseV8数据库进行交互通常会用到Hibernate框架和JDBC驱动。 Hibernate是一个优秀的对象关系映射(ORM)框架,它简化了Java应用程序对数据库的操作,通过将Java对象与数据库表进行映射,...

    hibernate和MySQL的jar

    标题中的“hibernate和MySQL的jar”指的是Hibernate ORM框架与MySQL数据库之间的连接库。Hibernate是一种流行的Java对象关系映射(ORM)工具,它允许开发者使用面向对象的编程方式来操作数据库,而无需直接编写SQL...

    Hibernate-extensions 完整安装包

    《Hibernate-Extensions全面指南》 Hibernate,作为Java领域中的一款著名对象关系映射(ORM)框架,极大地简化了数据库操作。然而,为了满足更复杂的业务需求,Hibernate还提供了丰富的扩展功能,这就是我们今天要...

    Hibernate,hibernate笔记

    Hibernate 是一个开源的对象关系映射(ORM)框架,它允许Java开发者使用面向对象的方式来操作数据库。这个框架将数据库操作转化为对Java对象的操作,简化了数据持久化的复杂度。以下是对Hibernate的一些关键知识点的...

    hibernate3全部jar包:hibernate3.jar.zip 下载

    Hibernate3 是一个强大的Java持久化框架,它允许开发者将数据库操作与业务逻辑解耦,使得应用程序的开发更为简便。这个“hibernate3全部jar包:hibernate3.jar.zip”包含了所有必要的库文件,方便用户一次性下载并...

    HibernateTools-3.2.4

    HibernateTools是Java开发人员在使用Hibernate ORM框架时的有力辅助工具集,主要目的是为了提高开发效率,简化数据库操作。在HibernateTools 3.2.4版本中,它包含了一系列的特性与插件,以支持更便捷地进行对象关系...

    hibernate 5.2.15

    hibernate 5.2.15 hibernate 5.2.15 hibernate 5.2.15 hibernate 5.2.15 hibernate 5.2.15hibernate 5.2.15

    hibernate3必要jar包

    Hibernate3 是一个非常重要的Java持久化框架,它允许开发者将对象模型与数据库关系模型进行映射,从而简化了数据存取的过程。这个压缩包“hibernate3必要jar包”显然是针对Hibernate3版本的,已经去除了冗余的库文件...

    hibernate-release-4.1.4

    【描述】中的"hibernate的jar包"指的是Hibernate框架的运行库文件,这些JAR文件包含了Hibernate的所有核心API、实现和依赖库,如Hibernate Commons Annotations、Hibernate EntityManager、Hibernate Core等。...

    Hibernate3的依赖包

    Hibernate3是一个广泛使用的Java对象关系映射(ORM)框架,它允许开发者用面向对象的方式处理数据库操作,极大地简化了Java应用程序与数据库之间的交互。在这个"Hibernate3的依赖包"中,包含了运行Hibernate3应用...

    hibernate5相关jar包

    Hibernate 是一个开源的对象关系映射(ORM)框架,它允许开发者使用面向对象的方式来操作数据库,极大地简化了Java应用中的数据存取工作。本压缩包包含了与Hibernate 5相关的jar包,这些jar包是构建和运行基于...

    Hibernate 中文api 等学习资料

    标题"Hibernate 中文api 等学习资料"暗示了这是一组针对Hibernate ORM框架的中文学习资源,包括API文档和其他指南,旨在帮助用户更好地理解和使用Hibernate。 描述中的"hibernate orm框架api中文文档,学习资料,...

    hibernate-extensions和Middlegen-Hibernate

    《hibernate-extensions与Middlegen-Hibernate:数据库到Java对象的自动化转换》 在Java的持久化层开发中,Hibernate作为一款强大的ORM(对象关系映射)框架,极大地简化了数据库操作。然而,手动编写实体类和映射...

    hibernate-release-5.2.10

    Hibernate是Java平台上的一款开源对象关系映射(ORM)框架,它允许开发者用面向对象的方式处理数据库操作。在SSH(Spring、Struts、Hibernate)框架中,Hibernate作为持久层的解决方案,极大地简化了数据库操作的...

    Hibernate入门jar包

    Hibernate是一款强大的Java持久化框架,它简化了数据库与Java对象之间的交互,使开发者可以更加专注于业务逻辑而不是数据访问层的实现。本压缩包提供的是Hibernate入门所需的jar包,包括了Hibernate的核心库以及与之...

Global site tag (gtag.js) - Google Analytics