Những lợi thế của myBatis so với Hibernate là gì? [đóng cửa]


33

Tôi đã tự mình thực hiện một số nghiên cứu và hiểu khái niệm cơ bản. Nhưng một số hiểu biết chỉ có thể đạt được thông qua kinh nghiệm thực tế.

Những lợi thế của myBatis sẽ làm cho nó đáng để học một khuôn khổ mới là gì?
Trong trường hợp nào bạn sẽ tránh sử dụng nó?


3
Tôi đã thử nghiệm cả hai và kết thúc bằng cách sử dụng Cayenne.
deadalnix

Câu trả lời:


38

Hãy xem xét những gì bạn đang cố gắng để đạt được. Thông thường, mô hình Phân đoạn Phản hồi Truy vấn Lệnh hoạt động tốt cho các miền phức.

Lý do là bạn đang cố gắng thực hiện một trong hai điều sau:

  1. Tạo / Cập nhật / Xóa một số thực thể miền phức tạp
  2. Chạy các truy vấn tìm nạp phân tích (nghĩa là truy vấn tổng hợp / tổng hợp)

Hibernate hoạt động tốt cho trường hợp 1 cho phép bạn chỉ cần tạo POJO và duy trì / cập nhật nó. Nó cũng làm điều này một cách nhanh chóng, trừ khi tên miền của bạn khá lớn.

myBatis là tuyệt vời để tìm nạp các truy vấn (trường hợp 2) trong đó bạn chỉ muốn một câu trả lời. Hibernate sẽ cố gắng tải toàn bộ biểu đồ đối tượng và bạn cần bắt đầu điều chỉnh các truy vấn bằng các thủ thuật LazyLoading để giữ cho nó hoạt động trên một miền lớn. Điều này rất quan trọng khi chạy các truy vấn phân tích phức tạp thậm chí không trả về các đối tượng thực thể. Hibernate chỉ cung cấp SqlQuery và Bean Transformers trong trường hợp này với các loại mặc định lớn như BigDecimal, trong khi myBatis có thể dễ dàng ánh xạ tới một phi thực thể POJO đơn giản.

Hai trường hợp này là sự khác biệt giữa các Lệnh nơi bạn muốn thay đổi dữ liệu miền và Phản hồi nơi bạn chỉ muốn tìm nạp một số dữ liệu.

Vì vậy, hãy xem xét hai trường hợp này và những gì ứng dụng của bạn làm. Nếu bạn có một tên miền đơn giản và chỉ cần tìm nạp thông tin, hãy sử dụng myBatis. Nếu bạn có một miền phức tạp và các thực thể tồn tại, hãy sử dụng Hibernate. Nếu bạn làm cả hai, hãy xem xét một phương pháp lai. Đó là những gì chúng tôi sử dụng trong dự án của chúng tôi có hàng ngàn thực thể để kiểm soát nó. ;)


2
Hibernate hoạt động tốt với trường hợp 2 của bạn là tốt. Để biết một ví dụ đơn giản, hãy xem: mkyong.com/hibernate/hibernate-native-sql-queries-examples
Mike Partridge

3
"Hibernate sẽ cố tải toàn bộ biểu đồ đối tượng" điều này nghe có vẻ như là một lỗi cấu hình. "Cần bắt đầu điều chỉnh truy vấn bằng thủ thuật LazyLoading" nghe có vẻ như bạn đã đặt fetch = háo hức ở đâu đó. JPA có JPQL thực tế là SQL, nhưng được tích hợp tốt với Hibernate / JPA. Tôi nghĩ rằng nó làm # 2 rất tốt. Mọi người thường chạy trong sản xuất từ ​​một năm trở lên trước khi ORM được cấu hình chính xác 100%. Tôi không giảm thiểu khi tôi nói rằng đó là lỗi cấu hình - cấu hình với các công cụ này có thể thực sự tốn thời gian và khó khăn!
GlenPeterson

3
@GlenPeterson Tôi không nói Hibernate không thể được thuần hóa, nhưng đối với hầu hết mọi người, ngoài hộp, các thực thể tên miền phức tạp sẽ được tải chậm trừ khi tối ưu hóa được thực hiện, như bạn đã trích dẫn. Các truy vấn phân tích phức tạp đơn giản hơn với myBatis cho hầu hết người dùng, mặc dù điều tương tự thực sự có thể đạt được với ORM. Câu hỏi cho nhiều người là liệu họ có cần sự độc lập của nhà cung cấp ORM cho sản phẩm của họ hay không.
Joseph Lust

10
Kiểu giả vờ ngủ đông không có DB bên dưới và bạn chỉ coi bạn mô hình dữ liệu như thể nó được thiết kế bằng các bộ sưu tập Java. Đó là rất thường xuyên không phải là trường hợp. Trên biểu diễn dữ liệu mức DB có thể rất khác nhau và cố gắng ánh xạ nó tự động vào các bộ sưu tập Java không nhất thiết phải có ý nghĩa gì. Đây là lý do tại sao Hibernate là một ví dụ hoàn hảo về "sự trừu tượng rò rỉ". MyBatis đơn giản hơn nhiều, dễ hiểu, không có phép thuật và .. vâng, có SQL mà tôi tìm thấy một điều tốt vì không có gì sai khi sử dụng SQL cho cơ sở dữ liệu dựa trên SQL.
Marcin

2
@Marcin điểm tuyệt vời. Tôi đã thấy quá nhiều vấn đề với việc mô phỏng các bộ sưu tập trong Hibernate. Ví dụ, một số mã gọi myBag.size () và Hibernate cố tải 750K đối tượng vào bộ nhớ trước khi đếm chúng. Nếu bạn chỉ cần SQL, hãy sử dụng SQL.
Joseph Lust

19

MyBatis là trung tâm SQL. Nó gọi bạn câu lệnh SQL và kết quả ánh xạ (bảng) tới các cây đối tượng.

Lợi ích chính là nó không phải là ORM. Nó không ánh xạ các bảng tới đối tượng nên không chịu sự không khớp trở kháng orm. Phù hợp tốt cho các cơ sở dữ liệu phức tạp hoặc cũ hoặc để sử dụng các tính năng db như các thủ tục được lưu trữ, các khung nhìn và như vậy.

Nó khá đơn giản và dễ học nên cũng phù hợp với các đội có tay nghề thấp vì không cần phải có một bậc thầy ngủ đông trong số họ.

Hãy xem jpetstore 6 http://mybatis.org/spring/sample.html


2
Những "đội có tay nghề thấp" vẫn cần biết SQL.
perp

Câu trả lời ngắn gọn súc tích, hai điểm khác biệt chính là: db centric + đường cong học tập nông. Nhưng tôi không hoàn toàn đồng ý với "Phù hợp tốt cho cơ sở dữ liệu phức tạp hoặc di sản". Lợi thế của việc lấy trung tâm db trở nên rõ ràng hơn khi bạn có nhiều quyền kiểm soát hơn đối với thiết kế db.
DPM

5

câu hỏi đề cập đến nhận xét của tôi , đây là những gì tôi có trong đầu khi viết nó.

Trước hết, nó bắt nguồn từ bối cảnh câu hỏi ban đầu của bạn. Trong những trường hợp khác tôi có thể đưa ra một lời khuyên khác. Điểm khiến tôi đề xuất MyBatis là đây:

... Chúng tôi đã gặp một số vấn đề về hiệu suất.

Chúng tôi đã quyết định bỏ ngủ đông để ủng hộ Jdbc đơn giản để đạt được hiệu suất cơ sở dữ liệu ...

Trong một trong những dự án trước đây, nhóm của chúng tôi đã xem xét chuyển từ Hibernate vì những lý do như bạn mô tả. Tương tự như bạn, chúng tôi sẽ chuyển sang JDBC, nhưng các đồng nghiệp từ một dự án khác đã đề nghị chúng tôi MyBatis. Nhóm đã quyết định thử, đồng thời giữ JDBC làm tùy chọn dự phòng trong trường hợp xảy ra sự cố.

Vào lúc đó, tôi không biết gì về MyBatis nhưng có đủ kinh nghiệm với JDBC để chắc chắn rằng nó sẽ thực hiện công việc. Mặc dù vậy, tôi đã rất ủng hộ ý tưởng dùng thử MyBatis, lý do chính là theo kinh nghiệm trước đây của tôi, số lượng mã soạn sẵn mà chúng tôi sẽ phải viết với JDBC sẽ chỉ là khó khăn.

  • Công bằng mà nói, tôi thích JDBC vì nó đơn giản để hiểu, đáng tin cậy và cho cảm giác tốt về kiểm soát tương tác cơ sở dữ liệu, nhưng cái giá mà người ta phải trả cho nó thực sự cao. Các ngón tay của tôi bắt đầu đau mỗi khi tôi nhớ lại mình phải gõ bao nhiêu với JDBC.

Dù sao, chúng tôi đã thử MyBatis và nó hoạt động như quảng cáo. Đó là lý do tại sao tôi viết bình luận mà bạn hỏi về.

Trong trường hợp nếu bạn mong đợi tôi đưa ra một cái nhìn tổng quan chi tiết về công nghệ, hoặc bằng cách nào đó ca ngợi sự vượt trội của nó - xin lỗi tôi không thể làm điều đó. Nếu tôi có thể - tôi đã viết nó trong một câu trả lời riêng cho câu hỏi ban đầu của bạn, thay vì đưa ra nhận xét ngắn. Tôi đã đề cập rằng tôi không biết gì về MyBatis hồi đó - tôi vẫn còn khá ít kiến ​​thức về nó. Việc chuyển đổi từ Hibernate được thực hiện bởi các thành viên khác trong nhóm và nó không ảnh hưởng đến mã mà tôi đang làm việc. Tôi chỉ nhớ lại các vấn đề chính (dựa vào đó tôi đã đưa ra nhận xét của mình), cụ thể là 1) MyBatis đã giải quyết các vấn đề chúng tôi gặp phải với Hibernate, 2) nó không đưa ra các vấn đề của riêng mình và 3) nó cho phép chúng tôi tránh viết mã nồi hơi đã mong đợi trong trường hợp nếu chúng ta chuyển sang JDBC. Đó là tất cả.


3

Hibernate được biết đến với quá nhiều phép thuật , hành vi bất ngờ và đường cong học tập lớn. Có những khung khác ngoài đó tập trung hơn vào sự đơn giản và sẽ cho phép bạn kiểm soát.

myBatis là một trong số đó, dự án của tôi MentaBean là một dự án khác. Tôi đã viết một bài đăng trên blog về nó có thể giúp đỡ.


6
Xin chào và chào mừng. Cộng đồng của chúng tôi thường cau mày khi tự quảng cáo quá mức và chúng tôi yêu cầu bạn tiết lộ rõ ràng mối liên hệ của bạn trong câu trả lời của bạn. Tôi đã chỉnh sửa câu trả lời của bạn để chỉ ra rằng MentaBean là một dự án mà bạn tham gia và bạn đã viết bài đăng trên blog mà bạn chỉ đến, nếu bạn không thích phrasing thay đổi, nhưng vui lòng duy trì một số loại tiết lộ mà bạn tham gia với MentaBean. Đọc phần có liên quan trong Câu hỏi thường gặp của chúng tôi để biết thêm chi tiết.
yannis

Xin chào Yannis. Tôi sẽ làm điều đó. Cảm ơn cho những người đứng đầu lên. :)
Sergio Oliveira Jr.

-1

Tôi đã sử dụng Hibernate cho một dự án tải dữ liệu và chuyển đổi dữ liệu 5 năm trước bằng Hibernate 3 và tôi nghĩ nó thật tuyệt vời. Tôi đang làm một ứng dụng thương mại điện tử nhỏ và tôi đã thử sử dụng Hibernate 4 và tôi đã vô cùng thất vọng. Họ đã gỡ bỏ các công cụ và tích hợp chặt chẽ với IDE. Tôi đã thử MyBatis và tôi làm mọi thứ chỉ trong một đêm và tôi rất hài lòng với việc tích hợp vào ứng dụng dễ dàng như thế nào. Tôi nghĩ rằng Hibernate đã trở nên quá cồng kềnh và tôi sẽ sử dụng EJB 3 hơn Hibernate vào thời điểm này.


1
EJB 3 và Hibernate so sánh như thế nào ???
Jose
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.