用Hibernate3作为一个JDBC框架

Spring Framework 1.1.3是Spring框架1.1系列中的一个版本,于2004年12月12日发布 需要注意的是,由于当时的技术背景限制,部分现代常用的特性尚未加入到这个较早发布的版本当中。:为了迎合日益增长的高并发需求场景,特别加入了 Project Reactor 库作为底层支撑体系的一部分,从而实现了真正的非阻塞式 I/O 处理流程设计模式转换可能性。Spring Framework 1.1.3是Spring框架1.1系列中的一个版本,于2004年12月12日发布。Spring Framework 1.1.3 是一个维护版本,主要用于修复已知问题并改进框架的稳定性和兼容性。 阅读详情

作者:Gavin King
翻译:ChiKai          

        最近围绕着简单的JDBC框架,像iBATIS,总有一些喧闹声。就我个人观点,在一个只有单一事务,实体间有着难懂的关联图,而且并不需要面向对象的域模式的应用,我自己是喜欢iBATIS的。假如你正在进行解决一些“极愚蠢的”遗留数据库问题的工作,一个JDBC框架也是可以产生强的判断力的。ORM的解决方案更趋向于假定那些同样具有正确完整性约束参考的,比较清晰的外键联合关系被体现出来的实体(Hiberante3这方面比Hibernate2.x少的多)。
        有些人甚至建议JDBC框架是对ORM比较好的可供选择的办法,甚至对那些最适合用ORM的系统:具有一目了然的关系模型的面向对象的系统.他们说服自己说,你手写的SQL代码总是会比生成的SQL状况好。我并不认为这是正确的,并非仅仅是因为大多数应用所需要的有压倒性的显得重要的SQL代码是单调乏味,且不需要人们干涉的,而是因为,JDBC框架是在ORM的不同语义级别起作用的。作为一个解决方案,iBATIS关于SQL发布的语义和作为结果的资料这方面了解得非常少。这意味着非常少的时机为了性能优化,例如,有效的缓存,(依据“有效”,我提及到的大体上地有效缓存无效策略,这对缓存的使用是至关紧要的)。而且,无论什么时候我们手写SQL,我们都知道N+1的Selects问题。那是非常单调乏味的为了每个我可能需要连接在一起的关联结合手写一个新的SQL查询。HQL在这方面有值得关注的帮助,因为HQL是决不比SQL详细的。如果说,一个JDBC框架能做ORM所能做的几分性能优化,那将不得不成了一个类似诡辩的级别。本质上,它将需要成为一个ORM,减少SQL的产生。事实上,我们已经开始注意到现有的JDBC框架发生的这种演变。这开始侵蚀任何一个规定的好处:需求的简单。
         这也会增加对下列问题有趣味的思考:如果,逐渐地增加原料,一个JDBC框架最后将会作为ORM而结束,减少SQL的产生,为什么不接受一个现有的ORM解决方案呢?就像,呵呵,嗯,Hibernate,或许...和减去SQL的产生。
 
         Hibernate团队经过长期的验证,需要混合和匹配产生SQL在那些特殊场合来手写查询。在Hibernate的老一版本,我们的解决方案就是简单地暴露Hibernate正在使用的JDBC连接,因此,你能执行你自己的prepared statement。这将刚刚开始改变,马克斯.安徒生最近在这方面已经做了很多工作了。现在,在Hibernate3,写一个没有产生SQL的应用实体将是可能的,这个时候仍然可以利用Hiberante的所有其它特性。
  
         我们真的期望和打算人们以这种方式来用Hibernate?那好,并不是真正的-我怀疑有好多人会真正享受整天写INSERT,UPDATE,DELETE 陈述语句的乐趣。另一方面,我也认为相当少的人需要自定义特殊场合的查询。除每一点的证明之外,我将给你展示怎么用Hibernate来做,如果你真的想那么做的话。
        让我们拿一个简单的Person-Employment-Organization 域模式来做为例子,(你可以在org.hibernate.test.sql 测试包里面找到这些代码,因此我并不打算在拷贝它们到这里。)最简单的类是Person;
  这里就是它的映射文件:
  <class name="Person" lazy="true">
    <id name="id" unsaved-value="0">
        <generator class="increment"/>
    </id>
   
    <property name="name" not-null="true"/>
   
    <loader query-ref="person"/>
   
    <sql-insert>
     INSERT INTO PERSON (NAME, ID) VALUES ( UPPER(?), ? )
   </sql-insert>
    <sql-update>UPDATE PERSON SET NAME=UPPER(?) WHERE ID=?</sql-update>
    <sql-delete>DELETE FROM PERSON WHERE ID=?</sql-delete>
</class>
        首先我们要注意的是手写INSERT, UPDATE and DELETE 陈述语句的时候,这个?参数的次序是匹配被列在上面的属性的(我们最后将不得不支持指定的参数,我猜想)。我猜这没什么引起感兴趣的地方。

        更多的是对这<loader>标签感兴趣:它定义一个将会在当我们用get(),load(),或者延迟关联来加载一个person实体的任何时候被用在指定的查询的参考。特殊的,这指定的查询可能是一个原生SQL查询,既然这样,下面的就是:
<sql-query name="person">
    <return alias="p" class="Person" lock-mode="upgrade"/>
    SELECT NAME AS {p.name}, ID AS {p.id} FROM PERSON WHERE ID=? FOR   
   UPDATE
</sql-query>
        (原生SQL查询可能会返回实体的多重的“列”;这就是最简单的例子,在这里仅仅只有一个实体被返回。)

        Employment 是有些复杂,特殊的,并不是所有的属性被包括在INSERT和UPDATE 陈述语句中:

<class name="Employment" lazy="true">
    <id name="id" unsaved-value="0">
        <generator class="increment"/>
    </id>
   
    <many-to-one name="employee" not-null="true" update="false"/>
    <many-to-one name="employer" not-null="true" update="false"/>
    <property name="startDate" not-null="true" update="false"
        insert="false"/>
    <property name="endDate" insert="false"/>
    <property name="regionCode" update="false"/>
   
    <loader query-ref="employment"/>
   
    <sql-insert>
        INSERT INTO EMPLOYMENT
            (EMPLOYEE, EMPLOYER, STARTDATE, REGIONCODE, ID)
            VALUES (?, ?, CURRENT_DATE, UPPER(?), ?)
    </sql-insert>
    <sql-update>UPDATE EMPLOYMENT SET ENDDATE=? WHERE ID=?</sql-update>
    <sql-delete>DELETE FROM EMPLOYMENT WHERE ID=?</sql-delete>
</class>

<sql-query name="employment">
    <return alias="emp" class="Employment"/>
    SELECT EMPLOYEE AS {emp.employee}, EMPLOYER AS {emp.employer},
        STARTDATE AS {emp.startDate}, ENDDATE AS {emp.endDate},
        REGIONCODE as {emp.regionCode}, ID AS {emp.id}
    FROM EMPLOYMENT
    WHERE ID = ?
</sql-query>
在Organization实体的映射中有一个Employments的collection 集合:
<class name="Organization" lazy="true">
    <id name="id" unsaved-value="0">
        <generator class="increment"/>
    </id>
   
    <property name="name" not-null="true"/>
   
    <set name="employments"
        lazy="true"
        inverse="true">
       
        <key column="employer"/> <!-- only needed for DDL generation -->
       
        <one-to-many class="Employment"/>
       
        <loader query-ref="organizationEmployments"/>
    </set>
   
    <loader query-ref="organization"/>
   
    <sql-insert>
        INSERT INTO ORGANIZATION (NAME, ID) VALUES ( UPPER(?), ? )
    </sql-insert>
    <sql-update>
     UPDATE ORGANIZATION SET NAME=UPPER(?) WHERE ID=?
  </sql-update>
    <sql-delete>DELETE FROM ORGANIZATION WHERE ID=?</sql-delete>
</class>

        这里的<loader>查询并不仅仅是为了Organization对象,也是为了它的Employments集合:
<sql-query name="organization">
    <return alias="org" class="Organization"/>
    SELECT NAME AS {org.name}, ID AS {org.id} FROM ORGANIZATION
    WHERE ID=?
</sql-query>

<sql-query name="organizationEmployments">
    <return alias="empcol" collection="Organization.employments"/>
    <return alias="emp" class="Employment"/>
    SELECT {empcol.*},
        EMPLOYER AS {emp.employer}, EMPLOYEE AS {emp.employee},
        STARTDATE AS {emp.startDate}, ENDDATE AS {emp.endDate},
        REGIONCODE as {emp.regionCode}, ID AS {emp.id}
    FROM EMPLOYMENT empcol
    WHERE EMPLOYER = :id AND DELETED_DATETIME IS NULL
</sql-query> 
         当我写这代码时,我才真正开始感受到让Hibernate帮我写这些SQL的好处。
在这个简单的例子中,我将已经排除至少35行以后不得不拥护的代码。
         最后,为了一个特别的查询,我们可以用一个原生SQL查询(一个指定的查询,或者一个嵌入到java中的代码)。例子如下:
<sql-query name="allOrganizationsWithEmployees">
    <return alias="org" class="Organization"/>
    SELECT DISTINCT NAME AS {org.name}, ID AS {org.id}
    FROM ORGANIZATION org
    INNER JOIN EMPLOYMENT e ON e.EMPLOYER = org.ID
</sql-query>
         我更宁愿亲自在Java中比在XML中写代码,为了我的嗜好,因此所有的原料是那么大量的臃肿的XML。我认为我将会坚持从事SQL的生成,无论哪里什么地方。那并不是因为我不喜欢SQL,事实上,我是一个SQL的狂热迷,并仅仅喜欢当我打开Hibernate的日志时候观察过往查询的翻动。那是因为Hibernate比我会写代码多了。

Hibernate3项目所需jar包全面指南 Hibernate是一个流行的对象关系映射(ORM)框架,为Java应用程序提供了一种简便的方式来操作数据库。通过使用Hibernate,开发人员可以用Java对象来表示数据库表,并且可以利用ORM的特性来简化数据持久化的操作。它允许开发者以面向对象的方式进行数据库的CRUD(创建、读取、更新、删除)操作,而无需深入底层的SQL语句。Hibernate ORM框架支持广泛的数据库服务器,并提供了一系列工具和API来提高开发效率和应用程序的性能。 阅读详情

相关推荐

Unity AR开发实战:从Vuforia图片识别到实体识别全流程解析

增强现实(AR)技术通过计算机视觉算法将虚拟信息叠加到现实世界,其核心原理在于对现实环境的感知与理解。在移动端AR开发中,图像识别与物体识别是实现虚实融合的关键技术,它们决定了虚拟内容能否准确、稳定地与现实对象对齐。Vuforia作为成熟的商业AR SDK,为开发者提供了从平面图像识别(Image Target)到三维实体识别(Model Target)的完整解决方案,极大降低了计算机视觉技术的应用门槛。在工程实践中,Vuforia通过封装复杂的特征提取与匹配算法,使开发者能够专注于交互设计与内容制作,广泛

weixin_30972263的博客 301

Hibernate与JDBC的区别,Hibernate的三种状态以及状态的转换

一、Hibernate与JDBC的区别1、hibernate和jdbc主要区别就是,hibernate先检索缓存中的映射对象( 即hibernate操作的是对象),而jdbc则是直接操作数据库.2、Hibernate是JDBC的轻量级的对象封装,它是一个独立的对象持久层框架。Hibernate可以用在任何JDBC可以使用的场合3、Hibernate是一个和JDBC密切关联的框架,所以Hiberna...

yuanaili的博客 971

0032期基于深度学习的大米识别-含数据集

083基于深度学习的手势识别小程序版本_含10多种模型包括alexnet、DenseNet、DLA、GoogleNet、Mobilenet、ResNet、ResNeXt、ShuffleNet、VGG、EfficientNet和Swin transformer等10多种模型。117nlp自然语言处理-文本情感分类-joy-sadness-anger-fear-love-surprise。运行02深度学习模型训练.py就会将txt文本中记录的训练集和验证集进行读取训练,训练好后会保存模型在本地。

grehtsfrs的博客 1506

Using Hibernate3 as a JDBC framework (转载自TSS)

Theres been a certain amount of noise recently surrounding simple JDBC frameworks like iBATIS. Ive liked the idea of iBATIS myself, for use in applications which dont need an object-oriented domain

951

交通小白首投TRB就中Oral?我的完整时间线与避坑指南(附Editorial Manager实操截图)

本文详细解析了交通领域新手如何高效完成TRB国际会议投稿的全流程,从选题策略到投稿系统实操,再到评审过程解析和常见误区避坑指南。特别针对初次投稿者提供了实用建议,包括时间规划、选题考量、Editorial Manager系统操作技巧,以及如何应对评审意见。文章还分享了从录用到会议参与的关键步骤,帮助研究者提升投稿成功率。

weixin_27303545的博客 386

ESP32-S3开发环境避坑指南:VS Code+ESP-IDF离线安装全流程(附国内镜像加速)

本文提供了一份详细的ESP32-S3开发环境离线安装指南,重点解决网络依赖问题。通过整合国内镜像加速,手把手教你完成VS Code、ESP-IDF框架、工具链及Python依赖的本地化部署,实现稳定、可重复的开发环境搭建,大幅提升IoT开发效率。

peach的博客 962

Hibernate学习(3)----JDBC编程

3.1 JDBC的编程        JDBC是JAVA数据库编程API,JDBC提供了JA VA应用程序访问数据库资源的编程接口,提供了对SQL语言的支持。JDBC的主要作用是连接数据库,维护数据源,实现SQL语言,以及发送SQL到数据库并返回和处理结果。下面的ComputerAccess程序演示了利用JDBC访问MYSQL数据库中的Computer数据表的过程。package com.

joy_cz的专栏 1779

【制作100个Unity游戏之35】从零开始构建类《月圆之夜》《杀戮尖塔》的卡牌游戏(附带项目源码)

本文介绍了如何从零开始构建类似《月圆之夜》《杀戮尖塔》的卡牌游戏。主要内容包括:1)获取游戏素材资源;2)导入xyframe框架工具集;3)实现手牌弯曲排列效果,通过样条曲线控制卡牌位置和旋转;4)设计可扩展的MVD卡牌系统架构,分离数据层(ScriptableObject存储)、模型层(业务逻辑)和视图层(显示控制)。文中提供了完整的代码实现,并展示了卡牌动态排列的GIF效果演示。

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 1426

hibernate4使用原生jdbc进行批处理

在hibernate中,有一级缓存session和二级缓存sessionFactory这些机制,一方面为编码提供了便利,同时也会有一些副作用。比如有较大的数据量交互的话,缓存反而会降低效率。最近在做一个有关批量更新的程序,在调用session.update()之后,对象会保存在缓存中,如果数据量超过缓存的容量就会出错。解决方法是:在hibernate中调用jdbc批量处理的API,使用原...

diannao5430的博客 226

Spring AI 实战:第五章、Spring AI本地模型部署之省钱小能手

白嫖的快乐你想象不到经过这番折腾,我们成功实现了零成本使用大模型完全本地运行保障隐私可视化访问Java生态无缝集成但可能有的小伙伴要吐槽,怎么换个底层模型这次就新建一个工程了呢?不能在以前的工程上开发吗?这样也太不优雅了吧~,我知道你很急,但先别急,等下一章节再来解决这个问题。为什么程序员特别喜欢Ollama?因为它就像一只温顺的羊驼——不花钱还能24小时产出代码!

liaokailin的专栏 922

瑞芯微RV1126部署YOLOv8全流程:环境搭建、pt-onnx-rknn模型转换、C++推理代码、错误解决、优化、交叉编译第三方库

瑞芯微RV1126部署YOLOv8全流程:环境搭建、pt-onnx-rknn模型转换、C++推理代码、错误解决、优化、交叉编译第三方库

C/C++、嵌入式开发、深度学习算法、模型部署与推理优化 3106

关于Hibernate获取JDBC连接 直接执行SQL

今天要做一个显示数据库列表的功能,不想直接用JDBC,呵呵 于是用hibernate,由于对hibernate 不熟悉,想执行一条语句"show databases" 都找不到办法... 在网上找了下,说是使用 session.connection(),但是在 hibernate3中,这个方法不推荐使用,但是将就先用吧 晚上回来看了下资料,原来jdbc是另外有组件来管理的, 使用方式如下:做下记录...

184

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

使用Hibernate3作为JDBC框架

发布时间:2006.03.10 04:27     来源:优快云    作者:     There's been a certain amount of noise recently surrounding simple JDBC frameworks like iBATIS. I've liked the idea of iBATIS myself, for us...

第三帝国 217

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

想用Spring3.05+Strust2.3+JDBC/Hibernate搭建框架,但是持久层用Hibernate还是JDBC呢?

很少搭框架,显得有点无从着手,对spring与JDBC集成比较陌生,求熟悉此道的朋友指点。

laodao278838的专栏 445

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

[翻译]选择 Spring+Hibernate EJB3还是POJO + JDBC呢?

                       选择 Spring+Hibernate EJB3还是POJO + JDBC呢?     刚开始做项目的时候我们什么都没有,没有JAVA,没有数据。用户的数据存放到那呢?慢慢的,就出来了关系数据库,SQL也就诞生了。有人 说:“让JAVA访问数据库,JDBC诞生了。"有一些人说JDBC是好的,但也有人说JDBC是不好的,所以容器管理EJB出现了。有人说,...

sunjhgq的专栏 123

HIbernate3.6 环境搭建

一.下载Hibernate环境需要用到的jar包 1.http://sourceforge.net/projects/hibernate/files/hibernate32.由于在Hibernate3.6中使用的是slf4j来记录日志,而hibernate3.6的jar包中又没有带有slf4j的实现包,所以这里需要自己另外去下载slf4j的jar包 http://www.slf4j.org/do...

js_miaomiao的博客 132

Struts2.3整合Hibernate3.6

整合其实并没有什么难度的。只不过自己之前没有做过,心里不靠谱。而且在选择框架版本的时候有点首鼠两端还有的就是可能对jar包添加不是很靠谱,说到底就是没底。下面记录一下本次的整合过程:         选择struts2.3.15.2 + Hibernate3.6两个框架。         添加struts2.3.15.2的jar包:         1、     废话少说,找到struts2

805

Hibernate4之配置详解

Hibernate基本配置其实就是SessionFactory的配置,所有配置都在<session-factory/>标签之内。但是<session-factory/>标签又可以分成3个部分的配置: 1.JDBC连接参数的基本配置 2.Hibernate连接池的参数...

chifancui9836的博客 210

hibernate数据库框架运用(一)

hibernate数据库框架运用(一) Hibernate(数据库持久层框架) 对JDBC进行轻量级的封装 用面向对象的思维操作数据库 Jdbc------sql-------数据库 Hibernate--------------save(user)----------------数据库 搭建第一个Hibernate工程 1.导入jar包 antlr-2.7.6.jar commons-colle...

qq_36760873的博客 389

Hibernate 介绍与入门

目录 1.hibernate介绍 2.Hibernate3.6入门程序 ​ 1.hibernate介绍 问题:hibernate是什么,它能做什么? hibernate冬眠Hibernate是一个开放源代码的对象关系映射框架..它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据应 1.hihernate是一个开源框架 2.对idb...

joker柒月的博客 627

(Hibernte 学习篇) Hibernate框架属性配置

第一:Hibernate 的JDBC属性: hibernate.connection.driver_class:JDBC驱动类 hibernate.connection.url:JDBC连接字符 hibernate.connetion.username:数据库用户名 hibernate.connetion.password:数据库密码 //重点(Hibernate数据库连接池) hibernat

zhouzhiwengang的专栏 1209

3.5JDBC学习——数据库连接池工具C3P0数据源

C3P0 C3P0是目前醉流行的开源数据库连接池之一,它实现了DataSource数据源接口,支持JDBC2和JDBC3的标准规范,易于拓展并且性能优越,著名的开源框架Hibernate和Spring使用的都是该数据源。ComboPooledDataSource是DataSource接口的实现类,它提供了数据源的对象相关的方法。需要导入jar包。C3P0 它可以通过类似于DBCP中设置参数的方...

smallhc的博客 300

struts2.1.8 hibernate3.3.2 spring2.5 整合需要哪些jar包

一.struts2 commons-logging-1.0.4.jar 主要用于日志处理 freemarker-2.3.8.jar 模板相关操作需要包 ognl-2.6.11.jar ognl表达示所需包, xwork-2.0.7.jar xwork核心包 struts2-core-2.0.14.jar struts2核心包 struts2-spring-plugin-2.

そうふくのスタジオ 287

hibernate+spring会话自动关闭

spring2.x+hibernate3+struts2 在首次登陆系统时抛出的异常,再登陆就正常。 异常: javax.servlet.ServletException: org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transacti...

366
上一篇: 碰到一个郁闷的问题
下一篇: 呵呵,那郁闷的问题解决了
chikai
博客等级 码龄22年 1粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值