อะไรคือข้อดีของ myBatis over Hibernate [ปิด]


33

ฉันได้ทำการค้นคว้าด้วยตัวเองและเข้าใจแนวคิดพื้นฐานแล้ว แต่ข้อมูลเชิงลึกบางอย่างสามารถรับได้จากประสบการณ์จริงเท่านั้น

อะไรคือข้อดีของ myBatis ที่จะทำให้คุ้มค่าในการเรียนรู้กรอบใหม่
คุณจะหลีกเลี่ยงการใช้งานในกรณีใด


3
ฉันทดสอบทั้งคู่และลงเอยด้วยการใช้ Cayenne
deadalnix

คำตอบ:


38

พิจารณาสิ่งที่คุณพยายามที่จะบรรลุ โดยทั่วไปแล้ว รูปแบบการแยกการตอบแบบสอบถามคำสั่งทำงานได้ดีสำหรับโดเมนที่ซับซ้อน

สาเหตุก็คือคุณกำลังพยายามทำหนึ่งในสองสิ่งต่อไปนี้:

  1. สร้าง / ปรับปรุง / ลบเอนทิตีโดเมนที่ซับซ้อนบางส่วน
  2. เรียกใช้คิวรีดึงข้อมูลการวิเคราะห์ (เช่นคิวรีการรวม / การรวม)

Hibernate ใช้งานได้ดีสำหรับกรณีที่ 1 ช่วยให้คุณสามารถสร้าง POJO และยืนยัน / อัปเดต มันทำได้อย่างรวดเร็วนอกจากโดเมนของคุณจะค่อนข้างใหญ่

myBatisยอดเยี่ยมสำหรับการสืบค้นคำค้น (กรณีที่ 2) ที่คุณต้องการคำตอบ ไฮเบอร์เนตจะพยายามโหลดกราฟวัตถุทั้งหมดและคุณจะต้องเริ่มปรับแต่งแบบสอบถามด้วยเทคนิค LazyLoading เพื่อให้ทำงานบนโดเมนขนาดใหญ่ได้ สิ่งนี้มีความสำคัญเมื่อเรียกใช้คิวรีการวิเคราะห์ที่ซับซ้อนที่ไม่ได้ส่งคืนวัตถุเอนทิตี Hibernate นำเสนอ SqlQuery และ bean Transformers ในกรณีนี้ด้วยประเภทเริ่มต้นขนาดใหญ่เช่น BigDecimal ในขณะที่ myBatis สามารถแมปกับ POJO ที่ไม่ใช่เอนทิตีได้ง่าย

ทั้งสองกรณีนี้เป็นความแตกต่างระหว่างคำสั่งที่คุณต้องการเปลี่ยนข้อมูลโดเมนและคำตอบที่คุณต้องการดึงข้อมูลบางอย่าง

ดังนั้นให้พิจารณาทั้งสองกรณีนี้และสิ่งที่แอปพลิเคชันของคุณทำ หากคุณมีโดเมนง่าย ๆ และเพียงดึงข้อมูลให้ใช้ myBatis หากคุณมีโดเมนที่ซับซ้อนและคงอยู่ให้ใช้ Hibernate หากคุณทำทั้งสองอย่างให้พิจารณาแนวทางไฮบริด นั่นคือสิ่งที่เราใช้ในโครงการของเราที่มีหลายพันหน่วยงานเพื่อให้อยู่ภายใต้การควบคุม ;)


2
ไฮเบอร์เนตใช้ได้ดีกับเคสของคุณ 2 เช่นกัน สำหรับตัวอย่างง่ายๆดูที่: mkyong.com/hibernate/hibernate-native-sql-queries-examples
Mike Partridge

3
"ไฮเบอร์เนตจะพยายามโหลดกราฟวัตถุทั้งหมด" ซึ่งฟังดูเหมือนความผิดพลาดในการกำหนดค่า "ต้องการเริ่มปรับแต่งแบบสอบถามด้วยเทคนิค LazyLoading" ดูเหมือนว่าคุณได้ตั้งค่า fetch = กระตือรือร้นอยู่ที่ไหนสักแห่ง JPA มี JPQL ซึ่งเป็น SQL จริง แต่ยังรวมเข้ากับ Hibernate / JPA ได้ดี ฉันคิดว่ามันทำได้ดีมาก # 2 เป็นเรื่องปกติที่ผู้คนจะทำงานในการผลิตเป็นเวลาหนึ่งปีขึ้นไปก่อนที่ ORM จะกำหนดค่าได้อย่างถูกต้อง 100% ฉันไม่ย่อขนาดเมื่อฉันบอกว่ามันเป็นข้อผิดพลาดในการกำหนดค่า - การกำหนดค่าด้วยเครื่องมือเหล่านี้อาจใช้เวลานานและยุ่งยากมาก!
GlenPeterson

3
@GlenPeterson ฉันไม่ได้บอกว่าไฮเบอร์เนตไม่สามารถทำให้เชื่องได้ แต่สำหรับคนส่วนใหญ่แล้วจะมีการโหลดเอนทิตีของโดเมนที่ซับซ้อนออกมานอกกรอบยกเว้นว่าจะมีการเพิ่มประสิทธิภาพตามที่คุณยกมา ข้อความค้นหาการวิเคราะห์ที่ซับซ้อนนั้นตรงไปตรงมากับ myBatis สำหรับผู้ใช้ส่วนใหญ่ถึงแม้ว่า ORM สามารถทำได้เช่นเดียวกัน คำถามสำหรับหลาย ๆ คนคือพวกเขาต้องการความเป็นอิสระจากผู้ขายของ ORM สำหรับผลิตภัณฑ์ของพวกเขาหรือไม่
Joseph Lust

10
การจำศีลในแบบไฮเบอร์เนตไม่มีฐานข้อมูลอยู่ข้างใต้และคุณเพียงแค่ปฏิบัติต่อตัวแบบข้อมูลของคุณราวกับว่ามันถูกออกแบบโดยใช้คอลเลกชัน Java ซึ่งเป็นกรณีที่ไม่บ่อยมาก ในการแสดงข้อมูลระดับ DB อาจแตกต่างกันมากและพยายามแมปมันโดยอัตโนมัติในคอลเลกชัน Java ไม่จำเป็นต้องมีเหตุผลใด ๆ นี่คือเหตุผลที่ Hibernate เป็นตัวอย่างที่สมบูรณ์แบบของ MyBatis ง่ายกว่ามากเข้าใจง่ายไม่มีเวทย์มนตร์และใช่มี SQL ที่ฉันพบสิ่งที่ดีเพราะไม่มีอะไรผิดปกติกับการใช้ SQL สำหรับฐานข้อมูล SQL
Marcin

2
@ Marcin จุดที่ดี ฉันเคยเห็นปัญหาเกี่ยวกับการจำลองคอลเล็กชันใน Hibernate มากเกินไป ตัวอย่างเช่นบางรหัสเรียก myBag.size () และไฮเบอร์เนตพยายามโหลดวัตถุ 750K เข้าสู่หน่วยความจำก่อนที่จะนับ ถ้าคุณต้องการ SQL ใช้ SQL
Joseph Lust

19

MyBatis คือศูนย์กลางของ SQL มันจะเรียกคำสั่ง SQL และผลลัพธ์การแม็พ (ตาราง) ไปยังออบเจ็กต์ต้นไม้

ประโยชน์หลักคือไม่ใช่ออม มันไม่ได้แมปตารางกับวัตถุดังนั้นจะไม่ได้รับความต้านทานออร์มไม่ตรงกัน เหมาะสำหรับฐานข้อมูลที่ซับซ้อนหรือแบบดั้งเดิมหรือใช้คุณสมบัติ db เช่นขั้นตอนการจัดเก็บมุมมองและอื่น ๆ

มันค่อนข้างง่ายและง่ายต่อการเรียนรู้เหมาะกับทีมที่มีทักษะต่ำเพราะไม่จำเป็นต้องมีกูรูที่จำศีลอยู่ในหมู่พวกเขา

ดูที่ jpetstore 6 http://mybatis.org/spring/sample.html


2
ทีม "ที่มีทักษะต่ำ" เหล่านั้นยังจำเป็นต้องรู้ SQL
per per

คำตอบที่กระชับดีความแตกต่างหลักสองอย่างคือ: db centric + curve การเรียนรู้แบบตื้น แต่ฉันไม่เห็นด้วยกับ "พอดีดีสำหรับฐานข้อมูลที่ซับซ้อนหรือแบบดั้งเดิม" ข้อดีของการเป็น db centric จะชัดเจนขึ้นเมื่อคุณควบคุมการออกแบบ db ได้มากขึ้น
DPM

5

ตั้งแต่คำถามหมายถึงการแสดงความคิดเห็นของฉันนี่คือสิ่งที่ฉันมีในใจเขียนมัน

ก่อนอื่นมาจากบริบทของคำถามเดิมของคุณ ในสถานการณ์อื่น ๆ ฉันสามารถให้คำแนะนำที่แตกต่าง จุดที่ทำให้ฉันแนะนำ MyBatis คือ:

... เราพบปัญหาด้านประสิทธิภาพ

เราตัดสินใจเลิกจำศีลในความโปรดปรานของ Jdbc ธรรมดาเพื่อให้ได้ประสิทธิภาพของฐานข้อมูล ...

ในหนึ่งในโครงการที่ผ่านมาทีมงานของเรากำลังพิจารณาที่จะย้ายจาก Hibernate ด้วยเหตุผลที่คุณอธิบาย คล้ายกับคุณเรากำลังจะเปลี่ยนไปใช้ JDBC แต่เพื่อนร่วมงานจากโครงการอื่นแนะนำ MyBatis ทีมตัดสินใจที่จะลองขณะที่ยังคง JDBC เป็นตัวเลือกสำรองในกรณีที่สิ่งต่าง ๆ ผิดพลาด

ในขณะนั้นฉันไม่รู้อะไรเกี่ยวกับ MyBatis แต่มีประสบการณ์เพียงพอกับ JDBC เพื่อให้แน่ใจว่ามันจะทำงาน อย่างไรก็ตามเรื่องนี้ฉันได้รับการสนับสนุนอย่างมากในการลองใช้ MyBatis เหตุผลหลักคือจากประสบการณ์ที่ผ่านมาของฉันจำนวนของรหัสสำเร็จรูปที่เราต้องเขียนกับ JDBC นั้นน่ากลัวมาก

  • เพื่อความเป็นธรรมฉันชอบ JDBC เพราะเข้าใจง่ายเชื่อถือได้และให้ความรู้สึกที่ดีในการควบคุมการโต้ตอบของฐานข้อมูล แต่ราคาที่จ่ายไปนั้นสูงมาก นิ้วของฉันเริ่มเจ็บทุกครั้งที่ฉันจำได้ว่าฉันต้องพิมพ์ด้วย JDBC มากแค่ไหน

อย่างไรก็ตามเราลอง MyBatis แล้วมันก็ทำงานได้ตามที่โฆษณาไว้ นั่นเป็นเหตุผลที่ฉันเขียนความคิดเห็นที่คุณถามเกี่ยวกับ

ในกรณีที่คุณคาดหวังว่าฉันจะให้ภาพรวมรายละเอียดของเทคโนโลยีหรืออย่างใดสรรเสริญมันเหนือกว่า - ขอโทษที่ฉันไม่สามารถทำเช่นนั้น ถ้าฉันทำได้ - ฉันได้เขียนไปแล้วในคำตอบแยกต่างหากสำหรับคำถามต้นฉบับของคุณแทนที่จะให้ความเห็นสั้น ๆ ฉันพูดถึงฉันไม่รู้อะไรเลยเกี่ยวกับ MyBatis เมื่อก่อน - ฉันยังมีความรู้เกี่ยวกับมันค่อนข้างน้อยขอโทษ การเปลี่ยนจากไฮเบอร์เนตดำเนินการโดยสมาชิกในทีมคนอื่น ๆ และไม่ได้ส่งผลกระทบต่อรหัสที่ฉันได้ทำ ฉันจำได้แค่ประเด็นสำคัญ (ตามที่ฉันได้แสดงความคิดเห็นของฉัน) ซึ่งก็คือ 1) MyBatis แก้ไขปัญหาที่เรามีกับ Hibernate, 2) มันไม่ได้แนะนำปัญหาของตนเองและ 3) อนุญาตให้เราหลีกเลี่ยงการเขียนรหัสสำเร็จรูป คาดว่าในกรณีที่ถ้าเราเปลี่ยนเป็น JDBC นั่นคือทั้งหมดที่


3

ไฮเบอร์เนตเป็นที่รู้จักกันดีในเรื่องเวทมนตร์มากเกินไปพฤติกรรมที่ไม่คาดคิด มีกรอบอื่น ๆ ออกมาซึ่งเน้นความเรียบง่ายมากกว่าและจะช่วยให้คุณสามารถควบคุมได้

myBatis เป็นหนึ่งในนั้นโครงการของฉันMentaBeanเป็นอีกหนึ่ง ฉันเขียนบทความในบล็อกที่อาจช่วยได้


6
สวัสดีเซอร์จิโอและยินดีต้อนรับ ชุมชนของเรามักจะขมวดคิ้วจากการส่งเสริมตนเองอย่างเปิดเผยและเราต้องการให้คุณเปิดเผยความร่วมมือในคำตอบของคุณอย่างชัดเจน ฉันได้แก้ไขคำตอบของคุณเพื่อชี้ให้เห็นว่า MentaBean เป็นโครงการที่คุณมีส่วนร่วมและคุณได้เขียนบทความในบล็อกที่คุณชี้ไปหากคุณไม่ชอบการใช้ถ้อยคำอย่าลังเลที่จะเปลี่ยน แต่โปรดรักษาไว้ การเปิดเผยบางประเภทที่คุณเกี่ยวข้องกับ MentaBean อ่านหัวข้อที่เกี่ยวข้องในคำถามที่พบบ่อยของเราสำหรับรายละเอียดเพิ่มเติม
yannis

สวัสดียานนิส ฉันจะทำอย่างนั้น. ขอบคุณสำหรับหัวขึ้น. :)
Sergio Oliveira Jr.

-1

ฉันใช้ Hibernate สำหรับการโหลดข้อมูลและโครงการแปลงข้อมูลเมื่อ 5 ปีที่แล้วโดยใช้ Hibernate 3 และฉันคิดว่ามันวิเศษมาก ฉันกำลังทำแอปพลิเคชันอีคอมเมิร์ซขนาดเล็กและฉันพยายามใช้ Hibernate 4 และฉันก็ผิดหวังอย่างมาก พวกเขาได้ลบเครื่องมือและรวมเข้ากับ IDE อย่างแน่นหนา ฉันลอง MyBatis แล้วฉันก็ไปทุกอย่างที่ทำงานในคืนเดียวและฉันก็พอใจมากกับการรวมเข้ากับแอปพลิเคชัน ฉันคิดว่าไฮเบอร์เนตกลายเป็นป่องเกินไปและฉันจะใช้ EJB 3 มากกว่าไฮเบอร์เนตในตอนนี้


1
EJB 3 และ Hibernate เปรียบเทียบได้อย่างไร?
Jose
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.