[Java] รู้จัก OR-Mapping และ Hibernate เบื้องต้น
Hibernate คือ Java library ที่เพิ่มความสะดวกสะบายในการใช้งาน database เป็นอย่างมาก เป็นที่รู้จักของ Java Developer เป็นอย่างดี อีกทั้งมี community กว้างขวางมาก ๆ แบบไม่ต้องกลัวว่าถ้าติดปัญหาจะถูกทิ้งให้โดดเดี่ยวเดียวดายกันเลย
ปกติแล้วการใช้งาน Relational Database เราจะต้องรู้จัก TABLE, COLUMN เป็นคำคุ้นหูอยู่แล้ว ซึ่งแน่นอนว่า Class ที่จะนำมาใช้เป็นตัวแทนฐานข้อมูลนั้น ก็มีความใกล้เคียงกันด้วย (พื้นฐาน ต้องอย่าทิ้ง)
ลองมาดูตัวอย่างเต็ม ๆ กัน
จากตัวอย่าง ผมตั้งข้อสังเกตให้ 3 อย่าง คือ
Native Query
Hibernate Query Language (HQL)
**ควรตั้งชื่อตาม Naming Convention ของแต่ละภาษาด้วยนะ
การเขียน Hibernate สำหรับเรียกใช้งานแบบง่าย ๆ
ref
stackoverflow : DTO and DAO concepts and MVC
ORM
หรือ OR-Mapping หรือชื่อเต็มๆก็คือ Object-Relational Mapping เป็นเทคนิคการใช้ฐานข้อมูลผ่าน Object แทนการใช้ SQL ซึ่งเพิ่มความสะดวกมาก ๆ ให้เหล่าโปรแกรมเมอร์ ซึ่งบางคนก็เรียก Entity บางคนก็เรียก DTO (Data Transfer Object) สุดแล้วแต่ถนัดเลยครับปกติแล้วการใช้งาน Relational Database เราจะต้องรู้จัก TABLE, COLUMN เป็นคำคุ้นหูอยู่แล้ว ซึ่งแน่นอนว่า Class ที่จะนำมาใช้เป็นตัวแทนฐานข้อมูลนั้น ก็มีความใกล้เคียงกันด้วย (พื้นฐาน ต้องอย่าทิ้ง)
Relational Database | Java Class |
---|---|
Table | Class |
Column | Attribute |
ลองมาดูตัวอย่างเต็ม ๆ กัน
จากตัวอย่าง ผมตั้งข้อสังเกตให้ 3 อย่าง คือ
- TABLE, COLUMN จะถูก mapping เข้ากับ class, attribute ผ่าน annotation
- data type มีความหมายอย่างเดียวกันแต่ไม่ใช่ตัวเดียวกัน
- ความสัมพันธ์ของ TABLE ถูกจัดให้เป็น attribute ที่มี data type ของ class ที่สัมพันธ์กัน
Query Language
การดึงข้อมูล (query) โดยทั่วไปเราจะต้องเขียนคำสั่ง SQL เพื่อดึงข้อมูลมาแสดงผลในรูปแบบของตาราง แต่เมื่อเราใช้ Hibernate ก็จะมีสิ่งที่คล้ายกับ SQL ให้เราสามารถ query ขึ้นมาในรูปแบบ Object ได้เลย และสามารถทำความสัมพันธ์ได้เสมือนการ JOIN ได้ด้วยNative Query
select * from user_account a left join user_profile p on a.profile_id = p.profile_id
Hibernate Query Language (HQL)
select * from UserAccount a left join fetch a.userProfileสิ่งที่แตกต่างกันอย่างเห็นได้ชัดคือ ชื่อของ table เวลาเขียน HQL จะมีการอ้างอิงด้วย class หรือ attribute แทนการใช้ชื่อจริงๆของ table และ column รวมถึง syntax บางอย่างที่ต้องศึกษาเพิ่มเติม ซึ่งผลลัพธ์ของการใช้ HQL จะออกมาในลักษณะ object พร้อมใช้งานได้เลย
**ควรตั้งชื่อตาม Naming Convention ของแต่ละภาษาด้วยนะ
Persistent
ในชั้นของการทำ Persistent นั้น จะเป็นการยุ่งเกี่ยวกับ database ทั้งสิ้น โดยเริ่มตั้งแต่การเชื่อมต่อ, การขอใช้งาน Database Connection, Transaction Control และทำคำสั่ง CRUD ต่าง ๆ ซึ่งในชั้นนี้จะประกอบด้วย DAO (Data Access Object) ซึ่งก็คือ Class ที่ทำหน้าที่ดังกล่าวนั่นเอง
UserAccount user = new UserAccount(); user.setUsername("LordGift"); user.setPassword("unknown"); try (SessionFactory sf = HibernateUtil.getSessionFactory(); Session session = sf.openSession()) { Transaction tx = session.beginTransaction(); session.saveOrUpdate(user); tx.commit(); } catch (HibernateException e) { log.error("can't commit transaction", e); }
ref
stackoverflow : DTO and DAO concepts and MVC