在Hibernate中直接操作JDBC接口

简介: Hibernate 在处理多表关联及分组排序等复杂数据库查询操作时,其固有的 O-R 映射机制会 产生大量冗余 SQL 操作,系统性能比传统的 JDBC 低很多。本文分析了 Hibernate 产生此类问题的原因 ,提出了一个在 Hibernate 框架内直接操作 JDBC 的接口的解决方案,在实际项目中验证了该解决方案 可以有效提高此类查询的效率。文中提供的示例代码可以直接运用于使用 Hibernate 框架的 J2EE 系统 项目。

在 Hibernate 框架中提供直接操作 JDBC 接口的原因

Hibernate 框架在处理复杂查询方面的 问题

Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封 装,使得 Java 程序员可以随心所欲的使用面向对象编程思维来操纵数据库。Hibernate 的优势在于屏蔽 了数据库细节,对于新增修改删除的数据层操作,不再需要跟具体的 SQL 语句打交道,简单的对对象实 例进行增删改操作即可。

但是,对于多表关联、分组统计、排序等复杂的查询功能时,由于 Hibernate 自身的 O-R 映射机制 ,父子表之间关联取数据会产生大量冗余的查询操作,性能低下。此类情况下,直接使用 JDBC 的 SQL 语句反而更加灵活和高效。

Hibernate 框架处理复杂查询问题实例分析

考虑如下数据库实 体示例,表 A 为主表,表 B 和表 C 为子表,A 与 B、A 与 C 表均为 1 对多关系,在 B 表和 C 表中 以 A_ID 外键字段关联 A 表父记录。

图 1. 数据库实体示例图

时间: 2024-08-24 03:49:17

在Hibernate中直接操作JDBC接口的相关文章

C#中COM操作(二) 接口查询

上一篇末留下的一个疑问这一回来作个解答吧.大家看了下面的图就清楚了: 结论就是t1,t2,t3是三个不同的引用,也就是说在.NET里面代表了三种不同的类型,但是三种类型的GUID却是一样的,因为在COM里GUID代表了一个COM类,只要GUID是一样的那么就表示是一个COM类,因此仅从COM类这一角度出发的话,这三种类型就是同一个COM类型. 第1种方式创建的COM对象的.NET包装的类型一般来说就是COM导入的.NET包装程序集里面对应声明的类型. 第2种方式创建的COM对象的.NET包装的类

Java的Hibernate框架中用于操作数据库的HQL语句讲解_java

 上次我们一起学习了用Criteria进行相关的操作,但由于Criteria并不是Hibernate官方推荐的查询方式,我们也并不多用.现在我们来看一下官方推荐的HQL,一起学习一下它的强大.  说是HQL,也就是Hibernate查询语句,和SQL有什么区别呢?一个字母的区别,哈哈.  当然不是这样,HQL和SQL的区别在于思想的不同,HQL是用面向对象的方向进行查询,而SQL则是对数据库二维表进行查询,这里包含的是思想的不同.HQL实际上也是SQL,它由Hibernate帮我们在内部进行转换

在Hibernate中正确实现关联关系中的级联操作(cascading)

关系数据库系统本身就比较复杂,加上Hibernate的O/R映射层,复杂度加重了,很容易出现问题,本人将最近遇到的问题和解决方法做一个总结,整理在下面的一系列文章中 正确理解Hibernate的聚合类型(collection)的使用 在Hibernate中正确实现关联关系中的级联操作(cascading) 在Hibernate框架中编写持久对象类实现外键关联的几点注意事项 本文是第二篇,讲解在one-to-many(一对多)和many-to-one(多对一)关联关系中的cascade特性的声明方

hibernate中我要监听事件,并将事件类型和时间写入到log表中,如何操作呢?

问题描述 hibernate中我要监听事件,并将事件类型和时间写入到log表中,如何操作呢? hibernate中我要监听事件,并将事件类型和时间写入到log表中,如何操作呢? log 表就3个字段:操作人,操作名,操作时间. 应该如何弄呢啊?

hibernate-新手求助!Hibernate中如何把几个核心接口写在一个工具类中?

问题描述 新手求助!Hibernate中如何把几个核心接口写在一个工具类中? 要写一个Struts2+Hibernate 整合的CRUD , 然后不知道怎么把 Session.SessionFactory.Configuration.Transaction这几个类写在 util包中的工具类里?求各位大神解答一下.万分感谢!!! 解决方案 定义一个类,把这些作为内嵌类全部贴过来 解决方案二: http://m.blog.csdn.net/blog/StubbornPotatoes/7705693

SSH 中 用了atomikos集成JTA 事务后,hibernate执行任何操作失败后都不抛异常

问题描述 在项目中, 用了atomikos集成JTA 事务后,hibernate执行任何操作失败后都不抛异常比如,我用getHibernateTemplate().load方法加载一个不存在的数据都不抛出异常,或者我删除一个不存在的记录也不抛异常,谁知道这是什么原因啊?????????? 问题补充:lizhi92574 写道 解决方案 load查询返回代理对象,在你使用的时候才会抛出异常

Hibernate中相关接口实现类的生命周期

问题描述 今天面试被问到:Hibernate中SessionFactory和Session以及Transaction的生命周期,哪位高手能帮忙解答下··谢谢了· 问题补充:aabcc 写道 解决方案 我一般不使用spring来声明事务但是很明显的,当你声明某些方法的事务模式后,SPRING会在你执行的方法环绕着 begin和commit 还有 rollback举个例,如果你 Service方法里面的session是交给spring管理的,那spring会在你service方法开始执行时 open

jdbc接口及其驱动程序

1.定义: JDBC(jdbc的本质是接口,由sun公司定义) JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成.JDBC为工具/数据库开发人员提供了一个标准的API,据此可以构建更高级的工具和接口,使数据库开发人员能够用纯 Java API 编写数据库应用程序. 有了JDBC,向各种关系数据发送SQL语句就是一件很容易的事.换言之,有了JD

Hibernate 中get()和load()与Hibernate简介

hibernate 中get()和load()与hibernate简介 session先判断对象是否存在,如果存在就不到数据库教程中检索.返回的对象都位于session缓存中,接下来修改了持久化对象的属性后,当session清理缓存时,会根据持久化对象的属性变化来同步更新数据库.     区别:    (1)当数据库中不存在与oid对应的记录时,load()方法抛出objectnotfoundexception异常,而get()方法返回null.    (2)两者采用不同的检索策略.