Đó là một câu hỏi kết thúc khá mở. Tôi sẽ bắt đầu một dự án mới và đang xem xét các ORM khác nhau để tích hợp với truy cập cơ sở dữ liệu.
Bạn có yêu thích nào không? Có bất cứ điều gì bạn sẽ khuyên ở lại?
Đó là một câu hỏi kết thúc khá mở. Tôi sẽ bắt đầu một dự án mới và đang xem xét các ORM khác nhau để tích hợp với truy cập cơ sở dữ liệu.
Bạn có yêu thích nào không? Có bất cứ điều gì bạn sẽ khuyên ở lại?
Câu trả lời:
Tôi đã ngừng sử dụng ORM.
Lý do không phải là bất kỳ lỗ hổng lớn trong khái niệm. Hibernate hoạt động tốt. Thay vào đó, tôi đã thấy rằng các truy vấn có chi phí thấp và tôi có thể điều chỉnh nhiều logic phức tạp thành các truy vấn SQL lớn và chuyển rất nhiều xử lý của tôi vào cơ sở dữ liệu.
Vì vậy, hãy xem xét chỉ sử dụng gói JDBC.
Không, bởi vì có ORM sẽ mất quá nhiều quyền kiểm soát với những lợi ích nhỏ. Tiết kiệm thời gian thu được dễ dàng bị thổi bay khi bạn phải gỡ lỗi bất thường do sử dụng ORM. Hơn nữa, các ORM không khuyến khích các nhà phát triển học SQL và cách các cơ sở dữ liệu quan hệ hoạt động và sử dụng điều này vì lợi ích của họ.
Nhiều ORM rất tuyệt, bạn cần biết lý do tại sao bạn muốn thêm tính trừu tượng lên trên JDBC. Tôi có thể giới thiệu http://www.jooq.org cho bạn (từ chối trách nhiệm: Tôi là người tạo ra jOOQ, vì vậy câu trả lời này là sai lệch). JOOQ chấp nhận mô hình sau:
Có nhiều ORM tốt khác. Đặc biệt Hibernate hoặc iBATIS có một cộng đồng tuyệt vời. Nhưng nếu bạn đang tìm kiếm một thứ trực quan, đơn giản, tôi sẽ nói hãy thử jOOQ. Bạn sẽ yêu nó! :-)
Hãy xem ví dụ SQL này:
// Select authors with books that are sold out
SELECT *
FROM T_AUTHOR a
WHERE EXISTS (SELECT 1
FROM T_BOOK
WHERE T_BOOK.STATUS = 'SOLD OUT'
AND T_BOOK.AUTHOR_ID = a.ID);
Và làm thế nào nó có thể được thể hiện trong jOOQ:
// Alias the author table
TAuthor a = T_AUTHOR.as("a");
// Use the aliased table in the select statement
create.selectFrom(a)
.whereExists(create.selectOne()
.from(T_BOOK)
.where(T_BOOK.STATUS.equal(TBookStatus.SOLD_OUT)
.and(T_BOOK.AUTHOR_ID.equal(a.ID))))));
Hibernate, vì về cơ bản, nó là tiêu chuẩn defacto trong Java và là một trong những động lực trong việc tạo ra JPA. Nó có sự hỗ trợ tuyệt vời trong Spring và hầu như mọi khung công tác Java đều hỗ trợ nó. Cuối cùng, GORM là một trình bao bọc thực sự thú vị xung quanh nó đang thực hiện các công cụ tìm động và tiếp tục sử dụng Groovy.
Nó thậm chí còn được chuyển sang .NET (NHibernate) để bạn cũng có thể sử dụng nó ở đó.
Ngủ đông, bởi vì nó:
Một vài điểm về lý do tại sao (và khi nào) sử dụng ORM:
Tôi khuyên bạn nên sử dụng MyBatis . Nó là một lớp mỏng trên đầu JDBC, rất dễ dàng ánh xạ các đối tượng vào các bảng và vẫn sử dụng SQL đơn giản, mọi thứ đều nằm trong tầm kiểm soát của bạn.
Tôi đã có trải nghiệm thực sự tốt với Avaje Ebean khi tôi đang viết một ứng dụng JavaSE cỡ trung bình.
Nó sử dụng các chú thích JPA tiêu chuẩn để xác định các thực thể, nhưng hiển thị API đơn giản hơn nhiều (Không có EntityManager hoặc bất kỳ thực thể nào được đính kèm / tách rời đó). Nó cũng cho phép bạn dễ dàng sử dụng các truy vấn SQL hoặc các cuộc gọi JDBC đơn giản khi cần thiết.
Nó cũng có API chất lỏng và loại an toàn rất tốt cho các truy vấn. Bạn có thể viết những thứ như:
List<Person> boys = Ebean.find(Person.class)
.where()
.eq("gender", "M")
.le("age", 18)
.orderBy("firstName")
.findList();
SimpleORM , bởi vì nó đơn giản và không có phép thuật. Nó định nghĩa tất cả các cấu trúc dữ liệu meta trong mã Java và rất linh hoạt.
SimpleORM cung cấp chức năng tương tự như Hibernate bằng cách ánh xạ dữ liệu trong cơ sở dữ liệu quan hệ đến các đối tượng Java trong bộ nhớ. Các truy vấn có thể được chỉ định theo các đối tượng Java, danh tính đối tượng được căn chỉnh với các khóa cơ sở dữ liệu, các mối quan hệ giữa các đối tượng được duy trì và các đối tượng được sửa đổi sẽ tự động được chuyển đến cơ sở dữ liệu với các khóa tối ưu.
Nhưng không giống như Hibernate, SimpleORM sử dụng cấu trúc và kiến trúc đối tượng rất đơn giản, tránh sự cần thiết phải phân tích cú pháp phức tạp, xử lý mã byte, v.v. SimpleORM nhỏ và trong suốt, được đóng gói trong hai lọ có kích thước chỉ 79K và 52K, chỉ có một nhỏ và tùy chọn phụ thuộc (Slf4j). (Hibernate có hơn 2400K cộng với khoảng 2000K lọ phụ thuộc.) Điều này giúp SimpleORM dễ hiểu và do đó giảm đáng kể rủi ro kỹ thuật.
Liên kết Eclipse , vì nhiều lý do, nhưng đáng chú ý là tôi cảm thấy như nó có ít sự phình to hơn các giải pháp luồng chính khác (ít nhất là ít phình ra trên khuôn mặt của bạn).
Liên kết Oh và Eclipse đã được chọn là triển khai tham chiếu cho JPA 2.0
Trong khi tôi chia sẻ các mối quan tâm về việc thay thế Java cho các truy vấn SQL dạng tự do, tôi thực sự nghĩ rằng mọi người chỉ trích ORM đang làm như vậy vì thiết kế ứng dụng thường kém.
True OOD được điều khiển bởi các lớp và các mối quan hệ và ORM cung cấp cho bạn ánh xạ nhất quán của các loại mối quan hệ và đối tượng khác nhau. Nếu bạn sử dụng công cụ ORM và kết thúc các biểu thức truy vấn mã hóa bằng bất kỳ ngôn ngữ truy vấn nào, khung ORM hỗ trợ (bao gồm, nhưng không giới hạn ở các cây biểu thức Java, phương thức truy vấn, OQL, v.v.), bạn chắc chắn đang làm gì đó sai, ví dụ như mô hình lớp của bạn rất có thể không hỗ trợ các yêu cầu của bạn theo cách nó nên. Một thiết kế ứng dụng sạch không thực sự cần truy vấn ở cấp ứng dụng. Tôi đã tái cấu trúc nhiều dự án, mọi người bắt đầu sử dụng khung ORM theo cách tương tự như chúng được sử dụng để nhúng các hằng chuỗi SQL trong mã của họ, và cuối cùng mọi người đều ngạc nhiên về việc toàn bộ ứng dụng có thể duy trì được như thế nào khi bạn khớp mô hình lớp học của bạn với mô hình sử dụng. Cấp, đối với những thứ như chức năng tìm kiếm, v.v. bạn cần một ngôn ngữ truy vấn, nhưng ngay cả khi đó các truy vấn bị hạn chế rất nhiều đến mức tạo ra một VIEW thậm chí phức tạp để duy trì và nhìn vào lớp bền vững chỉ đọc sẽ tốt hơn nhiều so với việc xây dựng các biểu thức trong một số ngôn ngữ truy vấn trong mã ứng dụng của bạn. Cách tiếp cận VIEW cũng tận dụng các khả năng của cơ sở dữ liệu và, thông qua việc cụ thể hóa, có thể hiệu quả hơn nhiều so với bất kỳ SQL viết tay nào trong nguồn Java của bạn. Vì vậy, tôi không thấy bất kỳ lý do nào cho một ứng dụng không tầm thường KHÔNG sử dụng ORM. nhưng ngay cả các truy vấn sau đó bị hạn chế rất nhiều đến mức tạo ra một VIEW thậm chí phức tạp đến mức một lớp liên tục chỉ đọc sẽ dễ duy trì và xem xét hơn so với việc xây dựng các biểu thức trong một số ngôn ngữ truy vấn trong mã ứng dụng của bạn. Cách tiếp cận VIEW cũng tận dụng các khả năng của cơ sở dữ liệu và, thông qua việc cụ thể hóa, có thể hiệu quả hơn nhiều so với bất kỳ SQL viết tay nào trong nguồn Java của bạn. Vì vậy, tôi không thấy bất kỳ lý do nào cho một ứng dụng không tầm thường KHÔNG sử dụng ORM. nhưng ngay cả các truy vấn sau đó bị hạn chế rất nhiều đến mức tạo ra một VIEW thậm chí phức tạp đến mức một lớp liên tục chỉ đọc sẽ dễ duy trì và xem xét hơn so với việc xây dựng các biểu thức trong một số ngôn ngữ truy vấn trong mã ứng dụng của bạn. Cách tiếp cận VIEW cũng tận dụng các khả năng của cơ sở dữ liệu và, thông qua việc cụ thể hóa, có thể hiệu quả hơn nhiều so với bất kỳ SQL viết tay nào trong nguồn Java của bạn. Vì vậy, tôi không thấy bất kỳ lý do nào cho một ứng dụng không tầm thường KHÔNG sử dụng ORM.