ibatis和hibernate的比较
IBATIS:
iBATIS一词来源于“internet”和“abatis”的组合,是一个由Clinton Begin在2001年发起的开放源代码项目,最初侧重于密码软件的开发,现在是一个基于Java的持久层框架。
iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO),同时还提供一个利用这个框架开发的JPetStore实例,相对Hibernate和Apache OJB等“一站式”ORM解决方案而言,ibatis 是一种“半自动化”的ORM实现,iBATIS需要开发人员自己来写sql语句,这可以增加了程序的灵活性,在一定程度上可以作为ORM的一种补充,程序设计人员应该结合自己的项目的实际情况,来选择使用不同的策略。
iBATIS和Hibernate都做了映射,但iBATIS是把实体类和sql语句之间建立了映射关系,这种策略可以允许开发人员自己来写合适的sql语句,而Hibernate在实体类和数据库之间建立了映射关系,sql对于开发人员是不可见的,对于那些数据量非常大的应用,无法去优化sql语句。
所谓“半自动”,可能理解上有点生涩,纵观目前主流的ORM,无论Hibernate还是Apache OJB,都对数据库结构提供了较为完整的封装,提供了从POJO到数据库表的全套映射机制,程序员往往只需定义好了POJO到数据库表的映射关系,即可通过 Hibernate或者 OJB 提供的方法完成持久层操作,程序员甚至不需要对 SQL 的熟练掌握, Hibernate/OJB 会根据制定的存储逻辑,自动生成对应的SQL并调用JDBC接口加以执行。
HIBERNATE:
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库.
Hibernate可以应用在任何使用JDBC的场合,既可以在Java的客户端程序使用,也可以在Servlet/JSP的Web应用中使用,最具革命意义的是,Hibernate可以在应用EJB的J2EE架构中取代CMP,完成数据持久化的重任.
Hibernate是一个免费的开源Java包,它使得与关系数据库打交道变得十分轻松,就像您的数据库中包含每天使用的普通Java对象一样,同时不必考虑如何把它们从神秘的数据库表中取出(或放回到数据库表中)
IBATIS和HIBERNATE的比较:
在系统咨询工作过程中,常常遇到以下情况:
1. 系统的部分或全部数据来自现有数据库,处于安全考虑,只对开发团队提供几条Select SQL(或存储过程)以获取所需数据,具体的表结构不予公开
2. 开发规范中要求,所有牵涉到业务逻辑部分的数据库操作,必须在数据库层由存储过程实现(就笔者工作所面向的金融行业而言,工商银行、中国银行、交通银行,都在开发规范中严格指定)
3. 系统数据处理量巨大,性能要求极为苛刻,这往往意味着我们必须通过经过高度优化的SQL语句(或存储过程)才能达到系统性能设计指标,面对这样的需求,再次举起 Hibernate 大刀,却发现刀锋不再锐利,甚至无法使用,奈何?恍惚之际,只好再摸出JDBC 准备拼死一搏……,说得未免有些凄凉,直接使用 JDBC进行数据库操作实际上也是不错的选择,只是拖沓的数据库访问代码,乏味的字段读取操作令人厌烦,“半自动化”的ibatis,却刚好解决了这个问题,这里的“半自动化”,是相对Hibernate等提供了全面的数据库封装机制的“全自动化”,ORM 实现而言,“全自动”ORM 实现了 POJO 和数据库表之间的映射,以及 SQL 的自动生成和执行,而ibatis 的着力点,则在于POJO 与 SQL之间的映射关系,也就是说,ibatis并不会为程序员在运行期自动生成 SQL 执行,具体的 SQL 需要程序员编写,然后通过映射配置文件,将SQL所需的参数,以及返回的结果字段映射到指定 POJO。
使用ibatis 提供的ORM机制,对业务逻辑实现人员而言,面对的是纯粹的 Java对象,这一层与通过 Hibernate 实现 ORM 而言基本一致,而对于具体的数据操作,Hibernate会自动生成SQL 语句,而ibatis 则要求开发者编写具体的 SQL 语句,相对Hibernate等“全自动”ORM机制而言,ibatis 以 SQL开发的工作量和数据库移植性上的让步,为系统设计提供了更大的自由空间,作为“全自动”ORM实现的一种有益补充,ibatis 的出现显得别具意义。
IBATIS的优势:
1. iBatis 易于掌握。拿来文档看半天到两天就可以掌握了。
Hibernate 可能需要 3 倍以上的时间来掌握。
2. iBatis 更容易进行 sql 的 优化。
这个应该大家都有共识了。另外 Hibernate 生成的 sql 也实在是太难看了。鉴于有的朋友提到了 sql 不太重要。我想在这里强调一下我的经验,一般系统性能的瓶颈都在数据库上。所以这一点是 iBatis 非常重要的一个优势。
3. iBatis 可以进行细粒度的优化
3.1 比如说我有一个表,这个表有几个或者几十个字段,我需要更新其中的一个字段,iBatis 很简单,执行一个sql
UPDATE TABLE_A SET column_1=#column_1# WHERE id=#id#但是用 Hibernate 的话就比较麻烦了,缺省的情况下hibernate 会更新所有字段。当然我记得 hibernate 有一个选项可以控制只保存修改过的字段,但是我不太确定这个功能的负面效果。
3.2 我需要列出一个表的部分内容,用 iBatis 的时候,这里面的好处是可以少从数据库读很多数据,节省流量SELECT ID, NAME FROM TABLE_WITH_A_LOT_OF_COLUMN WHERE ...
3.2.1 一般情况下,Hibernate 会把所有的字段都选出来。比如说有一个上面表有8个字段,其中有一两个比较大的字段,varchar(255)/text。上面的场景中我为什么要把他们也选出来呢?
3.2.2 用 hibernate 的话,你又不能把这两个不需要的字段设置为 lazy load,因为还有很多地方需要一次把整个 domain object 加载出来。这个时候就能显现出ibatis 的好处了
3.2.3 Hibernate 还有一个方案,就是生成 javabean/map/object[],但是这样的话就可能会产生大量的多余class。map/object[] 的方式应该不错,我比较喜欢这种方式。
3.3 如果我需要更新一条记录(一个对象),如果使用 hibernate,需要现把对象 select 出来,然后再做update。这对数据库来说就是两条 sql。而 iBatis只需要一条 update 的 sql 就可以了。减少一次与数据库的交互,对于性能的提升是非常重要。
4. 开发方面
4.1 开发效率上,我觉得两者应该差不多
4.2 可维护性方面,我觉得 iBatis 更好一些。因为 iBatis 的 sql 都保存到单独的文件中。而 Hibernate 在有些情况下可能会在 java 代码中保存sql/hql。
5. 运行效率
5.1 在不考虑 cache 的情况下,iBatis 应该会比hibernate 快一些或者很多(根据实际情况会有所不同)。
当然 iBatis 也有比较大的缺点
1. 不同数据库类型的支持不好,如果你要开发的系统是要在对中数据间移植,那可能用 hibernate 比较好。
2. 缺省的 cache 支持不好,但是 hibernate 的 cache 支持其实也不是很好,而且很复杂。尤其是对于大并发量的应用。所以我更倾向于自己管理 cache。
在实际应用中,应该根据不同的应用场景,来选择适合自己的框架。
分享到:
相关推荐
项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea、微信开发者工具 数据库:MySql5.7以上 部署环境:maven 数据库工具:navicat
项目均经过测试,可正常运行! 环境说明: 开发语言:java JDK版本:jdk1.8 框架:springboot 数据库:mysql 5.7/8 数据库工具:navicat 开发软件:eclipse/idea
编译的 python 3.8.20 windows install 安装包
【资源说明】 基于go-zero的用户管理系统全部资料+详细文档.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
时间管理系统采用java技术,基于springboot框架,mysql数据库进行开发,实现了首页,个人中心,系统公告管理,用户管理,时间分类管理,事件数据管理,目标数据管理,用户日记管理等内容进行管理。 环境说明: 开发语言:java JDK版本:jdk1.8 框架:springboot 数据库:mysql 5.7/8 数据库工具:navicat 开发软件:eclipse/idea
项目均经过测试,可正常运行! 环境说明: 开发语言:java JDK版本:jdk1.8 框架:springboot 数据库:mysql 5.7/8 数据库工具:navicat 开发软件:eclipse/idea
收到防护服快快快啊啊啊啊啊
制作报表
simulink相位调制器PM
2023-04-06-项目笔记-第三百六十阶段-课前小分享_小分享1.坚持提交gitee 小分享2.作业中提交代码 小分享3.写代码注意代码风格 4.3.1变量的使用 4.4变量的作用域与生命周期 4.4.1局部变量的作用域 4.4.2全局变量的作用域 4.4.2.1全局变量的作用域_1 4.4.2.358局变量的作用域_358- 2024-12-27
【指纹识别】基于matlab GUI指纹识别是一种生物特征识别技术,它利用了人类指纹的唯一性和稳定性进行身份验证。在本项目中,我们探讨的是如何使用MATLAB图形用户界面(GUI)来实现这一过程,包括图像采集、预处理、特征提取和匹配等多个步骤。 指纹图像的采集是整个系统的基础。这通常通过专用的指纹传感器完成,它们可以捕获高质量的指纹图像。在MATLAB中,我们可以使用摄像头或其他图像输入设备模拟这一过程,将捕获的图像导入到GUI中。 接下来是预处理阶段。指纹图像往往含有噪声和不清晰的部分,因此需要进行图像增强,以突出指纹的细节特征,如脊线和谷线。这可能包括二值化、直方图均衡化、滤波等操作。MATLAB的图像处理工具箱提供了丰富的函数支持这些预处理步骤。 特征提取是识别的核心环节。指纹的特征通常包括核心点、三角点、终结点以及脊线的方向和纹路模式。MATLAB中可以使用方向图像和细化算法来检测这些特征点,并生成特征描述符。例如,使用Gabor滤波器可以提取脊线方向信息,而细化算法可以帮助找到特征点。 GUI设计是用户交互的关键。在这里,用户可以上传指纹图像,系统会实时显示预处理和特征提取的
【资源说明】 基于Go后端的外挂式评论系统全部资料+详细文档.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
### NoSQL分布式数据库知识点解析 #### 一、选择题知识点详解 **1. 关系数据库与非关系数据库** - **关系数据库**: MySQL、SQL Server 和 Oracle 均属于关系数据库,它们采用 SQL 作为标准查询语言,支持 ACID 特性(原子性、一致性、隔离性和持久性)。 - **非关系数据库**: 指的是不采用表格形式来组织数据的数据库类型,通常用于处理大量非结构化或半结构化数据。 **2. 数据库语言分类** - **数据定义语言 (DDL)**: 用于定义数据库结构的语言,如创建、修改和删除表等操作。 - **数据操纵语言 (DML)**: 用于添加、修改和删除数据的语言,如 INSERT、UPDATE 和 DELETE 等命令。 - **数据查询语言 (DQL)**: 用于查询数据的语言,主要是 SELECT 语句。 - **数据控制语言 (DCL)**: 用于管理权限和安全性的语言,如 GRANT 和 REVOKE 命令。 **3. 关系数据库优点** - **易于理解**: 使用表格形式组织数据,符合人类直观认知习惯。 - **易于维护**: 支持事务处理,确保数据一致性。 - **支持 SQL**: 使用标准查询语言,便于数据查询和处理。 **4. MongoDB 编程语言** - **JavaScript**: MongoDB 是用 C++ 开发的,但其 Shell 环境使用 JavaScript,使得数据查询和管理更加便捷。 **5. NoSQL 数据库特点** - **分布式**: 能够在多台计算机上分布存储数据,适用于大数据量的处理。 - **不基于 ACID**: 相对于传统的关系数据库,NoSQL 数据库往往牺牲了部分 ACID 特性以换取更高的性能和可扩展性。 **6. CAP 理论** - **一致性 (C)**: 所有节点在同一时间具有相同的数据。 - **可用性 (A)**: 每个请求都能得到一个合理的时间内非错误的响应,但不保证是最新的数据。 - **分区容错性 (P)**: 系统中任意信息丢失的子网故障都不会导致整个系统不可用。 - **CAP 定理**: 在一个分布式系统中,只能同时满足一致性、可用性和分区容错性中的两个。 **7. 知识图谱与 NoSQL 数据库** - **MongoDB**: 适合用于构建知识图谱,因为它支持灵活的数据模型和高效的查询能力。 - **Redis**: 一种键值存储数据库,适用于缓存和实时数据分析。 - **HBase**: 一种列族存储数据库,适合大规模随机读写访问。 **8. HBase 特点** - **容量巨大**: 可以存储非常大量的数据。 - **列存储**: 数据按列族存储,方便进行列级别的访问。 - **稀疏性**: 允许某些列未填充,即某些单元格为空。 **9. HBase 核心组件** - **HMaster**: 负责协调客户端请求、分配 Region 以及负载均衡等工作。 - **RegionServer**: 存储数据的实际服务器。 - **Zookeeper**: 用于协调分布式环境中的服务,例如选举 HMaster。 **10. MongoDB 集合命名规则** - **system.**: 系统保留前缀,用于系统集合。 - **保留字符 $**: 用于特殊目的,如聚合管道。 - **空字符串**: 不允许作为集合名称。 **11. MongoDB 主键** - **UUID**: 通用唯一识别码,常用于作为主键。 - **Sequence**: 序列,也可以作为主键生成方式之一。 - **Auto-increment**: 自动递增,MongoDB 默认为主键使用 BSON 类型的 ObjectId。 **12. MongoDB 逻辑结构** - **数据库 (db)**: MongoDB 中的最高层级,可以包含多个集合。 - **集合 (collection)**: 数据库内的数据容器,类似于关系数据库中的表。 - **文档 (document)**: 数据的基本单位,由键值对组成。 **13. 内存数据库** - **Redis**: 键值存储数据库,常作为内存数据库使用。 - **MongoDB**: 非内存数据库,但可以通过配置将常用数据驻留在内存中。 - **Bigtable**: 谷歌的分布式数据存储系统,并非专门设计为内存数据库。 **14. Neo4j 图形数据库应用场景** - **快递物流数据管理**: 适用于关系较为复杂的数据管理场景。 - **家庭用电数据管理**: 更偏向于使用时序数据库。 - **企业考勤数
双工位多吸嘴龙门式取放模块proe5.0可编辑全套技术资料100%好用.zip
主持稿22222222222
【资源说明】 基于ssm的模拟麦当劳点餐系统全部资料+详细文档.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
php.html.mysql.zip
Java 入门教程.md
CD668cb芯片电路图
【资源说明】 基于C语言课程设计大作业 - 马里奥游戏、详细文档+全部资料+高分项目.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!