วันเสาร์ที่ 19 มีนาคม พ.ศ. 2559

Spring4 & Hibernate4 & MySQL project example

>> น้องคณะคนหนึ่งถามผมเกี่ยวกับเรื่องนี้ว่า เราจะใช้ spring มาจัดการ config เข้ากับ hibernate โดยสร้างเป็นโปรเจ็กต์เล็กๆได้อย่างไร ในเมื่อตอนนี้เพื่อนๆและตัวผมเองก็ได้ทบทวน spring bean ขั้นพื้นฐานกันไปเรียบร้อยแล้ว (ทบทวนเนื้อหาที่ผ่านมา)

>> ผมจะขอใช้ตัวอย่างจากสองเว็บไซต์ด้านล่างนี้มาประยุกต์เป็นตัวอย่างของเรานะครับ และขอขอบคุณพวกเขาทั้งสองที่แชร์ความรู้มา ณ ที่นี้ครับ
- https://dzone.com/articles/securing-mongodb-part-2-database-access-control
- http://www.journaldev.com/3524/spring-hibernate-integration-example-tutorial-spring-4-hibernate-3-and-hibernate-4

>> เราจะใช้ spring เวอร์ชัน 4.x, ใช้ hibernate เวอร์ชัน 4.x ติดต่อกับฐานข้อมูล mysql และเขียนอยู่บนจาวาโปรเจ็กต์ธรรมดา ทั้งหมดนี้ก็จะเป็นพื้นฐานสู่เรื่องจาวาเว็บ (servlet) และ spring mvc ต่อไป

>> ผมคงไม่ได้อธิบายว่าแต่ละค่า config รวมถึงประดา method ทั้งหลายมีความหมายและใช้งานอย่างไร ตัวผมเองก็เป็นผู้เริ่มต้น เพื่อนๆก็ยังสามารถแนะนำหรือให้คำอธิบายแก่ผมเพิ่มเติมโดย comment ไว้ด้านล่างของบทความนี้นะครับ

>> เอาล่ะ ในตอนนี้จากที่เราเรียนรู้กันมาจาก part ก่อนหน้านี้ เพื่อนๆทราบแเล้วว่า spring ถูกนำมาใช้เพื่อ ฉีดออบเจ็กต์ รวมถึงกำหนดค่าต่างๆให้กับออบเจ็กต์เจ้ากรรมนั้น เพื่อที่เราจะสามารถใช้งานมันได้เลยเมื่อต้องการ อีกทั้งยังส่งผลให้การ config ที่ควรเกิดขึ้นในจาวาโค้ดถูกย้ายไปไว้ในไฟล์ xml ทำให้โค้ดจาวาของเราสะอาดขึ้นและมุ่งเน้นไปที่ business logic มากกว่า (มันดีอย่างนี้นี่เอง)

>> ส่วน hibernate ก็เป็นความคิดการใช้ ออบเจ็กต์ ซึ่งในที่นี้ก็คือ จาวาบีนธรรมดา เป็นตัวนำพาข้อมูลไปจัดเก็บไว้ยังฐานข้อมูล* โดยตัวมันเองรับประกันว่า** ขั้นตอนการทำธุรกรรมจะต้องเรียบร้อยสมบูรณ์ไม่มีผิดพลาดแน่นอน
* ความคิดการนำพาข้อมูลไปจัดเก็บนี้เรียกว่า Java Persistence API ซึ่งเป็นหนึ่งในข้อกำหนดของเทคโนโลยี JEE
** สิ่งนี้สำหรับ Java Persistence API เรียกว่า Transaction (อ่านเพิ่มเติม...)

>> ฐานข้อมูลผมใช้ mysql ที่ถูกติดตั้งมาพร้อมกับ XAMPP เวอร์ชัน 3.2.2 ดังนั้นผมจึงสร้าง database ด้วย phpMyAdmin โดยตั้งชื่อว่า

spring_hibernate_part_1

ใช้คำสั่ง sql ต่อไปนี้สร้างมันขึ้นมาครับ

CREATE TABLE `spring_hibernate_part_1`.`USER` ( `id` INT NOT NULL AUTO_INCREMENT , `name` VARCHAR(20) NOT NULL , PRIMARY KEY (`id`)) ENGINE = InnoDB;

>> โครงสร้างของโปรเจ็กต์ประกอบด้วย 2 layers ดังนี้
- com.pros.example.model สำหรับเก็บจาวาบีนธรรมดา
- com.pros.example.dao สำหรับเก็บจาวาบีนที่มีบทบาทในการพูดคุยกับ hibernate
ส่วน Main.java นั้นเป็นคลาสเริ่มต้นการทำงานครับ ตามรูปด้านล่าง


>> ปกติแล้วเมื่อติดต่อกับ hibernate เราจำเป็นต้องเขียนไฟล์ configuration ในรูปแบบ .xml ขึ้นมา หรือไม่ก็ใช้ java annotation ก็ได้ เพื่อจะบอกแก่ hibernate ว่าฐานข้อมูลของเราคืออะไร (MySQL, Oracle, PostgreSQL ฯลฯ), มันอยู่ที่ไหน (บอกเป็น url), มันใช้ port อะไร (ถ้าเป็น MySQL ค่า default คือ 3306), มี username กับ password ต้องใส่หรือไม่ และต้องใช้จาร์ driver ตัวไหนเป็นตัวขอ connect เข้าไป เป็นต้น ด้วยเหตุนี้ hibernate จึงจะสามารถคุยกับฐานข้อมูลได้ แต่สำหรับงานนี้เราจะไม่บอกกับ hibernate ตรงๆหรอกครับ เราจะบอกให้ spring แทน แล้วให้พวกมันไปคุยกันเองอีกที

>> ขอพูดแบบภาษาของผมนะ ได้ว่า เรา (ในที่นี้คือ Main.java) จะคุยกับ spring จากนั้น spring จะคุยกับ hibernate จากนั้น hibernate จะคุยกับ mysql

>> รายละเอียดของไฟล์ spring_configuration.xml มีดังต่อไปนี้

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

>> นี่คือ Main.java ของผม

- เริ่มจากขอ context จาก spring ในที่นี้ก็คือการสั่งให้ spring อ่านไฟล์ spring_configuration.xml นั่นเอง
- จากนั้นขอ spring ฉีดออบเจ็กต์ UserDao มาให้ ซึ่งแท้จริงคือ UserDaoImpl
- จากนั้นสร้างผู้ใช้มาหนึ่งคน ซึ่งก็คือตัวผมเอง proS พร้อมทั้งกำหนดชื่อให้ผมว่า proSbeginner ผมนี่คือจาวาบีนธรรมดาฮี่ๆ
- จากนั้นเอาผมไปจัดเก็บยังฐานข้อมูลผ่านบริการ save ของ UserDao (ผมถูก persistent ในที่สุด)
- จากนั้นทดสอบเรียกผมออกมาดู (เพื่อนๆอาจลองเขียน save ผู้ใช้เข้าไปหลายๆคนนะ) ผมก็จะกลับมาอยู่ในสถานะจาวาออบเจ็กต์อีกครั้ง

>> จาวาบีน User

- คลาส User นี้จะติดต่อกับตารางในฐานข้อมูลที่ชื่อ USER
- คลาส User นี้มี id ชื่อเดียวกับคอลัมน์ในฐานข้อมูล (คอลัมน์ id) โดยจะเพิ่มค่าเองอัตโนมัติ

>> interface UserDao

- ให้บริการ save นำจาวาออบเจ็กต์ User ไปเก็บไว้ยังฐานข้อมูล
- ให้บริการ findAll คือค้นหาออบเจ็กต์ User ทั้งหมดใส่ไว้ใน list (ชุด java collection)

>> จาวาบีน UserDaoImpl

- เพื่อนๆจะสังเกตได้ว่า บีน ตัวนี้แหละที่เป็นหัวใจ กล่าวคือ spring จะฉีดมันให้กับเราผ่านทาง setter method, มันคุยกับ hibernate แทนเรา (ในแง่การใช้ฐานข้อมูล)

>> และนี่คือรูปผลลัพธ์เมื่อรันไฟล์ Main.java ครับ (ผมทดสอบไปหลายครั้ง)



>> สุดท้ายคือลำดับของไฟล์จาร์ทั้งหมดที่ผมทยอยโหลดและจับมาใส่โปรเจ็กต์ ไล่จากบนลงล่าง ดังนี้

หรือใครอยากจะดูแบบเรียงลำดับชื่อก็ตามนี้


>> คืนนี้นอนหลับฝันดีครับผม

ไม่มีความคิดเห็น:

แสดงความคิดเห็น