최대 절전 모드 대 iBATIS [닫힘]


80

신제품 리엔지니어링을 위해 Java에서 최상의 프레임 워크를 선택하는 중입니다. 고려 사항은 모델에 대한 데이터베이스에 구애받지 않는 접근 방식을 고려하는 것이므로 Struts + Spring과 iBATIS 또는 Hibernate 사이의 옵션에 대해 작업하고 있습니다. 둘 다 끈기를 제공하므로 가장 좋은 조언을 부탁드립니다.

답변:


192

iBATIS와 Hibernate는 완전히 다른 짐승입니다.

내가 보는 경향은 다음과 같습니다. Hibernate는 뷰가 객체 중심적 일 때 더 잘 작동합니다 . 그러나 더 데이터베이스 중심적 이라면 iBATIS가 훨씬 더 강력한 선택입니다.

스키마를 완전히 제어하고 있고 처리량이 매우 높지 않은 경우 Hibernate가 매우 잘 작동 할 수 있습니다. 개체 모델은 매우 편리 코드 만에 만드는 거대한 복잡성 비용.

상당히 복잡한 SQL 쿼리를 작성해야하는 "레거시"데이터베이스 스키마를 다루는 경우 iBATIS가 더 잘 작동 할 가능성이 있습니다.

HQL (Hibernate Query Language)은 여러분이 배워야 할 또 다른 언어이며, 그 후에도 여전히 SQL을 작성해야하는 경우를 찾을 수있을 것입니다 . 또한, Hibernate가 고성능 SQL 쿼리를 생성하도록하기 위해 XML, 속성, 주석 등의 올바른 조합을 파악하는 데 반나절을 소비 할 가능성이 있습니다.

이 질문에 대한 보편적 인 "A가 B보다 낫다"는 대답은 없습니다.


: 빌더 SQL과 가볍고 작은 ORM 들어 MentaBean 확인 mentabean.soliveirajr.com
TraderJoeChicago

20
2 년이 지난 지금도 JPA의 출현으로 여전히 사실입니까, 최대 절전 모드는 상당히 변경되었으며 ibatis는 이제 mybatis입니다. 현재 사람들의 생각이 무엇인지 궁금합니다.
Joelio

그러나 새로운 웹 애플리케이션 개발을 위해 Hibernatate, EclipseLink, Toplink 등과 같은 JPA2.0 호환 JPA 공급자 중 하나를 고려하는 것이 좋습니다. Cletus가 지적했듯이 iBatis도 좋습니다.
Sree Rama

2
mybatis로 더 명확하게 제어 할 수 있으므로 더 더러운 작업이 가능합니다. 하지만 저는 개인적으로 mybatis를 좋아합니다.
user218867

@cletus 여전히 사실입니까?
Suganthan Madhavan Pillai

52

달성하려는 것을 고려하십시오. 일반적으로 명령 쿼리 응답 분리 모델은 복잡한 도메인에 적합합니다.

그 이유는 일반적으로 다음 두 가지 중 하나를 수행하려고하기 때문입니다.

  1. 복잡한 도메인 엔티티 생성 / 업데이트 / 삭제
  2. 분석 가져 오기 쿼리 실행 (예 : 합계 / 집계 쿼리)

Hibernate 는 케이스 1에서 잘 작동하므로 POJO를 만들고 지속 / 업데이트 할 수 있습니다. 또한 도메인이 상당히 크지 않으면이 작업을 빠르게 수행합니다.

myBatis 는 답변을 원하는 쿼리 (케이스 2) 가져 오기에 적합합니다. Hibernate는 전체 개체 그래프를로드하려고 시도하며 대규모 도메인에서 계속 작동하려면 LazyLoading 트릭을 사용하여 쿼리 튜닝을 시작해야합니다. 반대로 분석적 POJO 페이지를 원하는 경우 동일한 쿼리의 myBatis 구현은 사소한 것입니다.

이 때문에 myBatis SELECTS에서 Hibernate보다 빠릅니다 .

이 두 경우는 도메인 데이터를 변경하려는 명령 과 일부 데이터를 가져 오려는 응답 의 차이 입니다.

따라서이 두 가지 경우와 애플리케이션이 수행하는 작업을 고려하십시오. 간단한 도메인이 있고 정보 만 가져 오면 myBatis를 사용하십시오. 복잡한 도메인이 있고 엔티티가 지속되는 경우 Hibernate를 사용하십시오. 둘 다 수행하는 경우 하이브리드 접근 방식을 고려하십시오. 그것이 우리가 프로젝트에서 사용하는 것인데,이를 통제하기 위해 수천 개의 엔티티가 있습니다. ;)


23

ORM 대 지속성 프레임 워크

Hibernate는 Java 클래스를 데이터베이스 테이블에 매핑하는 객체 관계 매핑 프레임 워크 (ORM)입니다. MyBatis는 ORM이 아닌 지속성 프레임 워크입니다. SQL 문을 Java 메서드에 매핑합니다.

데이터베이스 스키마

Hibernate는 Java 모델에 따라 데이터베이스 스키마를 생성하거나 유효성을 검사 할 수 있지만 MyBatis에는 이러한 기능이 없습니다. 또한 In-memory DB를 사용할 때 테스트 환경에 편리합니다. 관련 토론 :

은닉처

Hibernate에는 비활성화 할 수없는 첫 번째 수준 캐시가 있습니다. ORM을 통해 항목을 쿼리 한 다음 SQL로 직접 삭제하면 캐시에 남아 있음을 의미합니다. 캐시를 명시 적으로 지워 데이터베이스에서 가장 최근에 업데이트 된 결과를 얻을 수 있습니다. 관련 토론 :

낙관적 잠금 관리

또한 낙관적 잠금 관리에 대한 차이점이 있습니다.

MyBatis는 @Version 주석이있는 Hibernate / JPA와 같은 ORM 도구와 달리 낙관적 동시성 제어를 기본적으로 지원하지 않습니다.

관련 토론 :

지연 로딩

Hibernate는 지연 로딩으로 표시된 객체를 제외하고 전체 객체 그래프를로드하려고합니다. myBatis는 SQL 쿼리에 따라 데이터를로드합니다. 지연로드는 성능을 향상시킬 수 있지만 <property name="hibernate.enable_lazy_load_no_trans" value="true" /> 속성 과 함께 사용하면 연결 누수가 발생할 수 있습니다 . 관련 토론 :

Hibernate 세션 관리

저장, 업데이트 또는 삭제와 같은 엔티티 작업은 Hibernate Session을 통해 수행됩니다 . Hibernate detached entity passed to persist와 관련된 다른 현상 을 피하기 위해 적절한 Hibernate Session 관리 전략을 구현하는 방법을 잘 이해해야합니다 .

때로는 약간의 작업을 추가하고 myBatis에 대한 원시 SQL 문을 작성하는 것보다 기본 Hibernate 동작을 이해하는 데 더 많은 시간이 걸릴 수 있습니다.

계단식

Hibernate는 myBatis에 존재하지 않는 객체 그래프에 대해 계단식, 고아 제거 및 기타 기능을 제공합니다.이를 구현하려면 SQL 쿼리를 명시 적으로 작성해야합니다.

쿼리

myBatis에서는 거의 일반 SQL 쿼리를 작성합니다. Hibernate에는 SQL, HQL, Criteria API와 같은 쿼리를 구성하는 여러 옵션이 있습니다. 기준에 선택적 필드가 많은 경우 Criteria API를 사용하는 것이 적합 할 수 있습니다. 쿼리를 구성하는보다 구조화 된 접근 방식을 제공하고 관련 실수를 방지 할 수 있습니다.


18

Cletus는이 비교를 요약하는 데 큰 역할을했습니다. Hibernate는 데이터 모델을 제어 할 때 잘 작동하고 더 객체 중심적이지만 iBATIS는 기존 데이터베이스와 통합해야 할 때 잘 작동하고 더 데이터 중심적입니다.

또한 Hibernate는 학습 곡선이 조금 더 많다고 생각합니다. iBATIS를 사용하면 Hibernate에서 더 많은 "마법"이 발생하는 동안 무슨 일이 일어나고 있는지 알기가 매우 쉽습니다. 즉, 초보자는 iBatis를 사용하고 이해하기가 더 쉬울 수 있습니다.

그러나 iBatis를 선호해야한다는 것은 아닙니다. iBatis와 Hibernate는 위에서 말한 것과 다릅니다.

그리고 Hibernate를 선택한다면 Hibernate Annotations에서 제공하는 표준화 된 JPA 및 EJB 3.0 (JSR-220) 객체 / 관계형 매핑 주석 사용을 고려해보십시오 .


8

Hibernate는 ORM입니다. 즉, (가장 기본적인 수준에서) 자바 객체의 인스턴스를 데이터베이스 테이블의 실제 행에 매핑합니다. 일반적으로 Hibernate를 통해 검색된 pojo의 경우 : 이러한 pojo에 대한 모든 조작 및 수정이 데이터베이스에 나타납니다. Hibernate는 적절한 시간에 관련 SQL을 생성하고 실행합니다.

Mybatis (가장 기본적인 수준)는 xml 파일에 저장된 SQL을 함께 연결하고 실행하기위한 도구입니다. Java 개체의 인스턴스를 데이터베이스 테이블의 행에 매핑하는 것이 아니라 Java 메서드를 SQL 문에 매핑하므로 ORM이 아닙니다. 물론 pojo를 반환 할 수도 있지만 어떤 종류의 지속성 컨텍스트와도 연결되어 있지 않습니다.

두 도구 모두 위에서 설명한 것보다 훨씬 많은 작업을 수행하지만 하나는 ORM이고 다른 하나는 그렇지 않습니다.

어떤 것을 사용할 것인지 선택할 수있는 기준은 작업해야하는 데이터베이스 모델에 따라 결정적으로 달라집니다.

예를 들어 일부 보험 모델을 나타내는 대규모 확장 스키마를 상상해보십시오. 개발자는 데이터를 검색하고 현재 비즈니스에 부합하는 방식으로 해당 데이터와 상호 작용해야합니다.

개발자는 이동 중이며 모든 SQL을 손 으로 작성하는 데 필요한 비즈니스 지식을 갖지 못할 것입니다 (Mybatis에서 필요로 할 것임). Hibernate는 이와 같은 시나리오에 적합합니다.

비즈니스 분석가는 전문 지식과 마찬가지로 데이터 모델, 엔터티, 관계 및 상호 작용을 정의합니다. Java 개발자는 Hibernate를 사용하여 "모델을 실행"합니다. 비즈니스 개발자는 매우 복잡한 스키마에서 실행하기 위해 복잡한 오류가 발생하기 쉬운 SQL을 작성할 필요없이 빠르게 생산성을 높일 수 있습니다.

내 경험상, Hibernate와 Mybatis는 같은 프로젝트에서 정기적으로 사용됩니다.

Hibernate가 사용되는 곳

  • 일반 CRUD 기능
  • '도메인 객체'관계형 모델 '워킹'
  • 세션 관리

Mybatis가 사용되는 곳

  • 임시 쿼리
  • 저장 프로 시저 시작 (및 상호 작용)
  • 매우 구체적이거나 복잡한 쿼리 지원
  • 검색 기준이 동적 인 복잡한 검색 쿼리 및 결과 페이징 지원

6

이미 Spring을 사용하고 있다면 Hibernate 또는 iBatis로 바로 들어가는 대신 Spring JDBC로 시작할 것입니다. 인터페이스와 관련하여 지속성 계층을 작성하는 경우 Hibernate 또는 iBatis를 확보 한 후 구현을 전환하는 데 문제가 없어야합니다.

"전부 또는 전무"결정이어야 할 이유가 없습니다. 상황에 가장 적합한 것을 사용하십시오.


8
Spring JDBC는 Ibatis보다 훨씬 열등합니다. 우선 행 매퍼 (지루한)를 작성해야하거나 Spring의 빈 매핑이 엄청나게 느립니다. Spring MVC에서 양식을 바인딩하는 경우 중요하지 않지만 수천 개의 행을 반환하는 경우에는 확실합니다. Spring JDBC의 Spring 빈 매핑을 명시적인 행 매퍼로 대체하여 쿼리 실행 시간을 50 초 이상에서 <2로 줄 였지만 누가 작성하고 싶습니까?
cletus
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.