แสดงบทความที่มีป้ายกำกับ hibernate แสดงบทความทั้งหมด
แสดงบทความที่มีป้ายกำกับ hibernate แสดงบทความทั้งหมด

วันพุธที่ 27 เมษายน พ.ศ. 2559

Spring 4 Restful web services with Hibernate 4 example using Maven

เพราะไม่อยากเหินห่างความรู้ที่เคยศึกษาเกี่ยวกับ Spring กับ Hibernate ไปมากนัก จึงต้องแวะเวียนมาอ่านหรือหาความรู้จากโปรเจ็กต์ออนไลน์ต่างๆ และครั้งนี้ได้พบกับตัวอย่างประยุกต์ที่น่าจะนำมาลองเขียนเองและอธิบายให้ตัวเองฟัง เล่าไปว่าเราเข้าใจมันอย่างไรบ้างครับ โดยอาศัยความรู้พื้นฐานจากบทความต่างๆก่อนหน้านี้ที่เราได้เรียนรู้ร่วมกันไงล่ะ

Note
ตัวอย่างนี้นำมาจากเว็บ http://www.beingjavaguys.com/2014/08/spring-restful-web-services.html ขอขอบคุณยิ่งครับ

เตรียมเครื่องมือให้พร้อมก่อนลุย

  • Spring tool suite ของผมเวอร์ชัน 3.7.3.RELEASE
  • jdk ของผมเวอร์ชัน 1.8.0_65

ขั้นตอนที่ควรทราบก่อนโค้ด

  • เตรียม database ให้พร้อม
  • สร้างโปรเจ้กต์ด้วย Maven
  • configuration ไฟล์ web.xml สำหรับ DispatcherServlet ที่ Spring MVC จำเป็นต้องใช้
  • เตรียม java beans
  • เตรียม dao layer
  • เตรียม service layer
  • เดรียม web services layer
  • และทดสอบ web services ด้วย jersey client (ถ้าทำได้นะ)

Note
นี่เป็นการโค้ดสดซึ่งผมเองก็ไม่ได้เตรียมโปรเจ็กต์ไว้ก่อน ผิดพลาดประการใดขออภัยมา ณ ที่นี้ด้วยนะครับ สำหรับ jersey client ขออ้างอิงไปที่ https://jersey.java.net/documentation/latest/client.html

เตรียม database

ผมใช้ฐานข้อมูล MySQL ซึ่งมีมาให้เมื่อติดตั้ง XAMPP (ของผมเวอร์ชัน 3.2.2) ดังนั้นผมจึงใช้ http://localhost/phpmyadmin/ เป็นเครื่องมือบริหารจัดการฐานข้อมูลครับ และต่อไปนี้คือ MySQL script ที่ใช้สร้างฐานข้อมูลชื่อ employee_db

CREATE DATABASE IF NOT EXISTS `employee_db` 
DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci

enter image description here

Note
ในกรณีที่เพื่อนๆใช้ phpmyadmin เหมือนกับผม หากมองไม่เห็นฐานข้อมูลที่เพิ่งสร้างนี้ ให้กดปุ่ม F5 หรือ reload page สักครั้งครับ

ให้เลือกฐานข้อมูล employee_db นี้ไว้ก่อนนะครับ ต่อไปก็สร้าง table ชื่อ employee ไว้ภายใน

CREATE TABLE IF NOT EXISTS `employee` ( 
`id` bigint(20) NOT NULL AUTO_INCREMENT, 
`first_name` varchar(45) DEFAULT NULL, 
`last_name` varchar(45) DEFAULT NULL, 
`email` varchar(45) DEFAULT NULL, 
`phone` varchar(45) DEFAULT NULL, 
PRIMARY KEY (`id`) 
) ENGINE=InnoDB CHARACTER SET utf8 COLLATE utf8_unicode_ci

enter image description here

Note
ในกรณีที่เพื่อนๆใช้ phpmyadmin เหมือนกับผม หากมองไม่เห็นตารางที่เพิ่งสร้างนี้ ให้กดปุ่ม F5 หรือ reload page สักครั้งครับ

สุดท้ายของการเตรียมฐานข้อมูล ก็ใส่ข้อมูลของ employee สักหนึ่งคนลงไป

INSERT INTO `employee` (`id`, `first_name`, `last_name`, `email`, `phone`) 
VALUES (2, 'Hoston', 'lindey', 'hl@gmail.com', '90908989899')

enter image description here

สร้างโปรเจ็กต์ด้วย Maven

enter image description here
อุ้ย!ดึกแล้ว ไว้โอกาสหน้าผมจะมาเขียนต่อนะครับ

วันเสาร์ที่ 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 ครับ (ผมทดสอบไปหลายครั้ง)



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

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


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