持久层 技术选型如何决策?JPA,Hibernate,ibatis(mybatis)

2024-06-24 13:58

本文主要是介绍持久层 技术选型如何决策?JPA,Hibernate,ibatis(mybatis),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转自:http://t.51jdy.cn/thread-259-1-1.html

持久层 是一个项目 后台 最重要的部分。他直接 决定了 数据读写的性能,业务编写的复杂度,数据结构(对象结构)等问题。

因此 架构师在考虑 使用那个持久层框架的时候 要考虑清楚。
选择的 标准:
1,项目的场景。
2,团队的技能掌握情况。
3,开发周期(开发效率)。


传统的 业务系统,通常业务都比较复杂,懂业务的运维人员 对sql查询工具都比较熟悉。
这种以 数据库 为主的 业务场景 使用 以sql为主的持久层框架 例如:ibatis,mybatis
这种 性能优化的时候 sql 语句调整较为方便,甚至 业务人员 会直接提供 业务对于的 sql给开发人员。

对于快速迭代的中小型 新项目,适合使用hibernate(JPA + hibernate驱动)。
快速迭代 适合 使用面向对象的 持久层框架。在开发过程中 对象的变更非常频繁。
这种 持久层框架 适合 快速 重构 ,提高开发效率。
但是 这种框架 易学难精,用的不好就容易造成性能问题,用的好性能并不输于ibatis框架。
在做性能优化方面 可借助 缓存实现。

以上说说到了 项目场景 和 开发效率。
再说说 团队技能掌握情况,这个情况 有的时候 可以忽略,但有时缺不能忽视。
这个情况也和上面说的两个情况 对比着 分析,需要做一个平衡。
分以下几个情况:
老团队新项目 :这个要考虑 是重用公司已有框架资源,持续积累改进,还是放弃旧的,开发新的。
                        这个时候,大部分开发人员会怂恿技术主管或架构师 使用新的框架,尝试新的技术;不关心新技术带来的风险,项目的进度,已用积累的放弃。
                        作为架构师/技术主管,需要考虑项目的场景,周期,核心点,公司技术的可持续积累,风险性,团队技术的培训提升 等方面综合考虑。
                        结论:结合项目场景适度引进新技术(这也是提升团队技术的一个机会,但风险与机会并存,进度紧张的时候不建议更换)。
新项目新团队 :这个要区分地方,大城市好招人,以项目场景为主,选择框架,招聘精通此类框架的人才即可。
                        小城市 招聘人才困难,如果 没有 技术牛人引导使用,建议 还是要以团队技术人员掌握的技术为主。
                        一群人 用一个不熟悉的框架,不如 大部分用一个熟悉的框架。(技术培训 是需要一个周期的,如果没有牛人不建议现学现用)。
                        这里 可能有另外一个声音:大家一起学,边学边用。在项目非紧急的情况下 可以考虑。
                        但本人不太建议拿项目当试验;稳定,高效,靠谱,好扩展,这是作为一个架构师 要肩负的责任。
以技术为核心的项目 :要招聘一些技术牛人,使用符合项目场景的框架,而不是复合团队的框架,但团队技术问题 要通过培训,牛人带路等方式解决。

以上是抽象的说法,以下是我 选取的框架对比资料,选来选取 其实就围绕在两个方向:
是面向对象 还是面向数据结构;
是hibernate 还是ibatis;


何时使用iBATIS

iBATIS最好是用在你需要全面地控制SQL的时候,在需要对SQL查询做微调的时候也很有用。
当你在应用和数据库设计两方面都有完全的控制权的时候,就不应该使用iBATIS,
因为在这样的情况下,应用可能会做出修改以适应数据库,或是反过来。
在这种情形中,你可以构建一个完全的对象-关系应用,其他的ORM工具更适于使用,
因为iBATIS较为以SQL为中心,其通常被称作反转的——功能齐全的ORM工具生成SQL,
而iBATIS直接使用SQL。iBATIS也不适合于非关系型的数据库,
因为这类数据库不支持事务和其他iBATIS用到的键特性。

简单是iBATIS最大的优势,因为它提供一个简单的映射和用于构建数据访问代码的API层。
在这一框架中,数据模型和对象模型不需要做精确的彼此映射。
这是因为iBATIS使用了一个数据映射器(data mapper),
其经由一个XML描述符而不是元数据映射器把对象映射到存储过程、SQL语句或是ResultSet上,
而元数据映射器起的是把领域中的对象映射到数据库中的表上的作用。
因此,iBATIS能够使得数据模型和对象模型彼此独立,互不相干。

为什么我们需要Hibernate?

传统上用于对象-关系映射的实体bean(entity bean)非常难以理解和维护,Hibernate使得对象-关系映射变得简单起来,它的方法是在一个XML文件中映射元数据,该文件定义了需要映射到某个特定类上的数据库中的表。
在其他的持久性框架中,你需要修改应用类来实现对象-关系映射;而在Hibernate中则不需要这样做。
使用了Hibernate后,你就无需担心数据库的改变,因为手工修改SQL脚本文件的工作已被免除。
如果你需要不时改变应用使用到的数据库的话,也可以通过修改配置文件中的dialet属性来很容易地解决这一问题。
Hibernate提供了全部的SQL功能,其中的有些是早先的商业ORM框架一直没有提供的。
Hibernate也支持许多的数据库,其中包括MySQL、Oracle、Sybase、Derby和PostgreSQL等,而且也能够与基于简单Java对象(plain old Java object,POJO)的模型配合得很好。
Hibernate基于所选择的底层数据库来生产JDBC代码,因此省去了编写JDBC代码的麻烦,它还支持连接的池化。Hibernate使用的API很简单也很容易学习,只有很少SQL知识的开发者也能够使用Hibernate,因为它减轻了编写SQL查询的负担。
Hibernate架构

就内部来说,Hibernate用到了JDBC,JDBC提供了数据库的一个抽象层,它同时也采用了Java Transaction API(JTA)和JNDI来集成其他应用。Hibernate需要用来与数据库交互的连接信息由JDBC连接池提供,这需要做配置。
Hibernate的架构主要由两个接口——Session和Transaction组成——以及一个Query接口,该接口位于应用的持久层中。定义于应用的业务层中的类通过Hibernate持久层的独立元数据来进行交互,持久层转而使用某些JDBC API来与数据库层对话。此外,Hibernate还用到了其他的配置接口,其中主要是有着适当命名的Configuration类。Hibernate还使用回调接口和一些用于扩展映射功能的可选接口。


Hibernate组成部分的主要编程接口:
Ÿ           org.hibernate.SessionFactory基本上是用来获取一个session实例,并且可看作是连接池化机制的一个模拟。这是线程安全的,因为所有的应用线程都使用单一的SessionFactory(只要Hibernate只使用一个数据库)。该接口通过配置文件来配置,配置文件决定了要加载的映射文件。
Ÿ           org.hibernate.Session提供了一个单独的线程,该线程确定应用和数据库之间的对话。这是对一个特定(单个)连接的模拟。该接口是非常轻量级的,而且是非线程安全的。
Ÿ           org.hibernate.Transaction提供了一个单线程对象,其横跨整个应用并确定原子工作单元。其基本上抽象了JDBC、JTA和CORBA事务。
Ÿ           org.hibernate.Query被用来执行查询,或以HQL的形式或是以底层数据库的SQL方言形式。Query实例是轻量级的,需要提到的很重要的一点是,它不能用在创建它的session的外部。

51筋斗云(微信公众号:cn51jdy ),欢迎分享本文!

这篇关于持久层 技术选型如何决策?JPA,Hibernate,ibatis(mybatis)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1090340

相关文章

MyBatis-Plus 与 Spring Boot 集成原理实战示例

《MyBatis-Plus与SpringBoot集成原理实战示例》MyBatis-Plus通过自动配置与核心组件集成SpringBoot实现零配置,提供分页、逻辑删除等插件化功能,增强MyBa... 目录 一、MyBATis-Plus 简介 二、集成方式(Spring Boot)1. 引入依赖 三、核心机制

Python中高级文本模式匹配与查找技术指南

《Python中高级文本模式匹配与查找技术指南》文本处理是编程世界的永恒主题,而模式匹配则是文本处理的基石,本文将深度剖析PythonCookbook中的核心匹配技术,并结合实际工程案例展示其应用,希... 目录引言一、基础工具:字符串方法与序列匹配二、正则表达式:模式匹配的瑞士军刀2.1 re模块核心AP

MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)

《MyBatis的xml中字符串类型判空与非字符串类型判空处理方式(最新整理)》本文给大家介绍MyBatis的xml中字符串类型判空与非字符串类型判空处理方式,本文给大家介绍的非常详细,对大家的学习或... 目录完整 Hutool 写法版本对比优化为什么status变成Long?为什么 price 没事?怎

Mybatis-Plus 3.5.12 分页拦截器消失的问题及快速解决方法

《Mybatis-Plus3.5.12分页拦截器消失的问题及快速解决方法》作为Java开发者,我们都爱用Mybatis-Plus简化CRUD操作,尤其是它的分页功能,几行代码就能搞定复杂的分页查询... 目录一、问题场景:分页拦截器突然 “失踪”二、问题根源:依赖拆分惹的祸三、解决办法:添加扩展依赖四、分页

MyBatis流式查询两种实现方式

《MyBatis流式查询两种实现方式》本文详解MyBatis流式查询,通过ResultHandler和Cursor实现边读边处理,避免内存溢出,ResultHandler逐条回调,Cursor支持迭代... 目录MyBATis 流式查询详解:ResultHandler 与 Cursor1. 什么是流式查询?

mybatis用拦截器实现字段加解密全过程

《mybatis用拦截器实现字段加解密全过程》本文通过自定义注解和MyBatis拦截器实现敏感信息加密,处理Parameter和ResultSet,确保数据库存储安全且查询结果解密可用... 目录前言拦截器的使用总结前言根据公司业务需要,灵活对客户敏感信息进行加解密,这里采用myBATis拦截器进行简单实

MySQL中读写分离方案对比分析与选型建议

《MySQL中读写分离方案对比分析与选型建议》MySQL读写分离是提升数据库可用性和性能的常见手段,本文将围绕现实生产环境中常见的几种读写分离模式进行系统对比,希望对大家有所帮助... 目录一、问题背景介绍二、多种解决方案对比2.1 原生mysql主从复制2.2 Proxy层中间件:ProxySQL2.3

Spring Boot集成/输出/日志级别控制/持久化开发实践

《SpringBoot集成/输出/日志级别控制/持久化开发实践》SpringBoot默认集成Logback,支持灵活日志级别配置(INFO/DEBUG等),输出包含时间戳、级别、类名等信息,并可通过... 目录一、日志概述1.1、Spring Boot日志简介1.2、日志框架与默认配置1.3、日志的核心作用

破茧 JDBC:MyBatis 在 Spring Boot 中的轻量实践指南

《破茧JDBC:MyBatis在SpringBoot中的轻量实践指南》MyBatis是持久层框架,简化JDBC开发,通过接口+XML/注解实现数据访问,动态代理生成实现类,支持增删改查及参数... 目录一、什么是 MyBATis二、 MyBatis 入门2.1、创建项目2.2、配置数据库连接字符串2.3、入

springboot自定义注解RateLimiter限流注解技术文档详解

《springboot自定义注解RateLimiter限流注解技术文档详解》文章介绍了限流技术的概念、作用及实现方式,通过SpringAOP拦截方法、缓存存储计数器,结合注解、枚举、异常类等核心组件,... 目录什么是限流系统架构核心组件详解1. 限流注解 (@RateLimiter)2. 限流类型枚举 (