การอบรมหลักสูตรการพัฒนา Web Application ด้วย Java Introduction to Java • • • • • Javaคืออะไร? Java Platform Java Language Java Virtual Machine และ Java Compiler Java SDK (Software Development Kit) • เครื่ องมือในการพัฒนาโปรแกรม Microsoft Visual J++ • Hello World Java คืออะไร? • Java คือ Programming Language • Java ได้ถูกพัฒนาโดยบริ ษทั Sun Microsystems • Java คือภาษาที่ถูกพัฒนาให้สามารถใช้งานได้บนระบบ Computer ทุกๆ Platform Java Platform • สามารถใช้งานได้ ไม่วา่ เครื่ องคอมพิวเตอร์จะอยูใ่ นระบบปฏิบตั ิการ ใด เนื่องจากโปรแกรมภาษาจาวาไม่ได้รันบนระบบปฏิบตั ิการ แต่ รันบนแฟลตฟอร์มเสมือน ซึ่งเรี ยกว่า จาวา แพลตฟอร์ม (Java Platform) หรื อ จาวาเวอร์ชวั น์แมทชีน (Java Virtual Machine) Java Program Java Program Java Program Java Virtual Machine Windows OS UNIX OS Linux OS Java Language • Java Programming Language – สนับสนุนการเขียนโปรแกรมเชิงวัตถุ (Object- Oriented Programming) – ใช้ได้กบั คอมพิวเตอร์ ทุกระบบ (Multi Platform) – สร้างโปรแกรมเพื่อใช้งานผ่าน Network (Internet / Intranet / Extranet) ได้ – การรองรับมาตรฐานความปลอดภัยในการใช้งานรู ปแบบต่างๆ Java Language • Write Once, Run Anywhere. (Cross- Platform) Java Source code (.java file) Compile (javac) Java Byte code (.class file) Windows OS UNIX OS Linux OS Java Virtual Machine และ Java Compiler • จาวาเวอร์ ชัวน์ แมทชีน (Java Virtual Machine) คือ Engine ใน ระบบคอมพิวเตอร์ ที่เข้าใจโปรแกรมของภาษาจาวา ทาหน้าที่ จัดการ และตีความแต่ละคาสัง่ ในโปรแกรมจาวา ที่ถูกเรี ยกว่าไบต์ โค้ด (Bytecodes) แปลงให้เป็ นคาสัง่ เพื่อประมวลผลของแต่ละ ระบบปฏิบตั ิการที่ใช้งาน สาหรับการรันโปรแกรมที่เขียนด้วยภาษา จาวาJVM ของบริ ษทั ซัน มีชื่อว่า JRE (Java Runtime Environment) • จาวาคอมไพล์เลอร์ (Java Compiler) สาหรับการคอมไพล์ โปรแกรมภาษาจาวาคอมไพล์ซอร์สโค้ดที่สร้างจากภาษาจาวาให้ เป็ นไบต์โค้ด Java Compiler ของบริ ษทั ซัน มีชื่อว่า SDK (Software Development Kit) Java 2 SDK (Software Development Kit) • Download ได้ที่ http://java.sun.com • เป็ นชุดพัฒนาโปรแกรมด้วยภาษาจาวา ซึ่งมีเครื่ องมือช่วยสาหรับ นักพัฒนาโปรแกรม เช่น คอมไพลเลอร์ ดีบกั เกอร์ รันไทม์ (JRE) ไลบรารี่ และโปรแกรมสนับสนุ น อื่นๆอีกมากมาย Sun Microsystems ได้แบ่งรู ปแบบการทางานของ โปรแกรมที่สร้างจากภาษาจาวาออกเป็ น 3 ส่ วน คือ Java 2 SDK (Software Development Kit) • J2ME (Java 2 Micro Edition) เหมาะสมสาหรับการใช้งาน บนอุปกรณ์อิเล็กทรอนิกส์ขนาดเล็ก เช่น โทรศัพท์มือถือ PDA เครื่ องใช้ไฟฟ้ า หรื ออุปกรณ์ไร้สาย เป็ นต้น • J2SE (Java 2 Standard Edition) ทางานบนคอมพิวเตอร์ ทัว่ ไปในลักษณะ Standalone เช่น Java Application , Java Applet หรื อ JavaBean • J2EE (Java 2 Enterprise Edition) ทางานบนคอมพิวเตอร์ ระดับเซิร์ฟเวอร์ เพื่อรองรับการใช้งานจากผูใ้ ช้จานวนมากๆ เช่น Java Servlet , JSP (Java Server Page) เครื่ องมือในการพัฒนาโปรแกรม การสร้าง Source Code สามารถสร้างโดย • โปรแกรม Text Editor เช่น Notepad ,EditPlus … • โปรแกรม Visual Tools เช่น Microsoft Visual J++ ,Borland JBuilder, WebGain Visual Café, Oracle JDeveloper... • JBuiderX ~ Can debug, Support Any Plug-in Hello World HelloWorld.java public class HelloWorld { public static void main ( String [] args ) { System.out.println ( “Hello World” ) ; } } Java Programming Part I Java Programming Part I • • • • • • กฎการตั้งชื่อ (Identify) การประกาศตัวแปร (Data Member or Declaring Attribute) การประกาศเมธรอด (Method member or Declaring Methods) ข้ อมูลค่ าคงตัว (Literals) ชนิดข้ อมูล (Data Type) ตัวแปร (Variables) Java Programming Part I • กฎการตั้งชื่อ (Identify) – ใช้ต้ งั ชื่อ Class, Method หรื อ Variable – ประกอบด้วยตัวอักษร และหรื อตัวเลข โดยตัวอักษรควรใช้อกั ษร ภาษาอังกฤษ รวมถึงสัญลักษณ์พิเศษ _ (underscore) , หรื อ $ (dollar sign) – ตัวอักษรตัวเล็กและตัวใหญ่มีความแตกต่างกัน (case-sensitive) – ห้ามใช้ตวั เลขเป็ นตัวแรกของชื่อ เช่น 1Hello – ความยาวไม่ควรเกิน 65,535 ตัวอักษร – ต้องไม่ตรงกับคียเ์ วิร์ดใดในภาษาจาวาต่อไปนี้ Java Keywords abstract boolean break byte case catch char class const continue default do double else extends final finally float for goto if implements import instanceof int interface long native new package private protected public return short static strictfp super switch synchronized this throw throws transient try void volatile while Java Programming Part I การตั้งชื่อตามรู ปแบบ (Java Programming Language Coding Conventions) • Class : กาหนดให้พยัญชนะตัวแรกเป็ นตัวอักษรพิมพ์ใหญ่ ตัวอักษรที่ เหลือในคาเดียวกันเป็ นตัวพิมพ์เล็ก เช่น HelloWorld,VerifyLogin • Variable : ตัวอักษรทุกตัวเป็ นตัวพิมพ์เล็กทั้งหมด เช่น name , rowcount • Constant : ตัวอักษรทุกตัวเป็ นตัวพิมพ์ใหญ่ท้ งั หมด เช่น CORPERATE, FONTSIZE • Method : กาหนดให้พยัญชนะตัวแรกเป็ นตัวอักษรพิมพ์เล็ก คาถัดไปให้ เป็ นตัวอักษรตัวพิมพ์ใหญ่ เช่น setFontColor ,openDataFile Java Programming Part I การตั้งชื่อตามรู ปแบบ (Java Programming Language Coding Conventions) • Packages : ตัวอักษรทุกตัวเป็ นตัวพิมพ์เล็กทั้งหมด เช่น banking.domain, com.sun. • Interface : ใช้การตั้งชื่อ เช่นเดียวกับ Class Java Programming Part I การประกาศตัวแปร (Data Member or Declaring Attribute) รู ปแบบ <modifiers> <type> <name> modifiers = ระดับการเข้าถึง [public, private, protected, <default> ไม่ระบุ หมายถึง package] ตัวอย่าง public class Sample { private int a; private float b= 10000.0F; private String name = ‘Alice’; } Java Programming Part I การประกาศเมธรอด (Method member or Declaring Methods) รู ปแบบ <modifiers> <return_type> <name> ([<argument_list>]) { [<statements>] } ตัวอย่าง public class Fish { private int weight; public int getWeight(){return weight;} public void setWeight(int newWeight){weight = newWeight; } } Java Programming Part I • ข้ อมูลค่ าคงตัว (Literals) แบ่ งออกเป็ น 1. ค่ าคงตัวจานวนเต็ม • แบบปกติ (– 24783648 ถึง +247483647) เช่น 10 , -2 , 123 • แบบยาว (-9223372036854775808 ถึง 9223372036854775807) เช่น 100L, 12456L 2. ค่ าคงตัวทศนิยม • แบบปกติ (– 1 .4 x10 45 ถึง +3.4 x10 38) เช่น 10.2F , 2155.45f • แบบยาว (-4.9 x 1 0-324 ถึง 1 .7 x 1 0 308) เช่น 100.5D, 5.0, 258455.45d Java Programming Part I • ข้ อมูลค่ าคงตัว (Literals) แบ่ งออกเป็ น 3. ค่ าคงตัวตรรก (true,false) 4. ค่ าคงตัวตัวอักษร • ตัวอักษร ตัวเลข เครื่องหมาย สั ญลักษณ์ ต่ าง ๆ เช่ น ‘a’, ‘C’, ‘$’ 5. ค่ าคงตัวข้ อความ • มีความยาวมากกว่ า 1 ตัวอักษร เช่ น ‘This is a message’ Java Programming Part I • การใช้ งานข้ อมูลค่ าคงตัว – ทาการกาหนดค่ าเริ่มต้ นของตัวแปร int x = 1; float f = 3.14F; char c = ‘Z’; – ใช้ สร้ าง Expression b = = true; y += 10; Java Programming Part I • ชนิดข้ อมูล (Data Type) – ชนิดข้ อมูลพืน้ ฐาน (Primitive Types) เป็ นการสร้ างพืน้ ที่ใน หน่ วยความจา เพือ่ ใช้ เก็บข้ อมูลโดยตรงลงในพืน้ ทีน่ ้ัน ๆ โดย ขนาดพืน้ ทีท่ ใี่ ช้ เก็บ ขึน้ อยู่กบั การกาหนดประเภทข้ อมูล เช่ น ตัวอักษร ตัวเลขจานวนเต็ม – ชนิดข้อมูลอ้างอิง (Reference Types) เป็ นการสร้างพื้นที่ใน หน่วยความจาสาหรับเก็บข้อมูล พร้อมพื้นที่สาหรับอ้างถึงเพื่อ อ้างไปยังพื้นที่สาหรับเก็บข้อมูล Java Programming Part I • ชนิดข้อมูลพื้นฐาน (Primitive Types) – – – – Logical - boolean Textual - char Integral - byte, short, int, long Floating - double , float Java Programming Part I • ตัวแปรอ้างอิง (Reference Types) เกิดขึ้นได้จากการกาหนด 2 ลักษณะ – สร้างมาจากการกาหนด Instance – การกาหนดข้อมูลในลักษณะของแถวลาดับหรื ออะเรย์ (Array) Java Programming Part I • ตัวแปร (Variables) คือการนาเอาชนิดข้อมูลมาอ้างถึงด้วยชื่อ ซึ่งแยกประเภทตาม ตาแหน่งที่สร้างตัวแปร class Class1{ private int x; // Class Variable public static void main (String[] args){ private String s; //Method Variable } } Java Programming Part II Java Programming Part II • คาสั่ ง (Statements) • คาอธิบาย (Comments) • ตัวดาเนินการ (Operators) : ตัวดาเนินการทางคณิตศาสตร์ (Arithmetic Operators) : ตัวดาเนินการที่เกีย่ วข้ องกับบิต(Bitwise Operators) : ตัวดาเนินการข้ อความตรรกะ (Boolean Operators) : ตัวดาเนินการเกีย่ วกับสตริง (String Operators) Java Programming Part II • นิพจน์ (Expressions) • คาสั่ งควบคุมการทางานของ Statement (Control Flows) : เงื่อนไข (Condition) – if ... else : ตรวจสอบค่ า (Multiple Branch) – switch ... case Java Programming Part II : ลูป (Loop) - for … - do … while - while ... : กระโดด (Jumps) break, continue, return Java Programming Part II • คาสั่ ง (Statement) – ใช้ กาหนดตัวแปร ประมวลผลหรือสร้ าง Expression – ปิ ดท้ ายด้ วย ; ตัวอย่ าง int i; System.out.println(“Hello”); float f; f = 1.25; Integer id = new Integer(123); Java Programming Part II • คอมเม็นต์ (Comments) – คอมเม็นต์ ส่วนท้ ายบรรทัด สาหรับข้ อความยาวไม่เกินหนึ่งบรรทัด // ข้ อความ – คอมเม็นต์ ส่วนข้ อความ (สาหรับข้ อความยาวหลายบรรทัด) /* ข้ อความ */ /** ข้ อความ */ Java Programming Part II • ตัวดาเนินการ(Operator) – ตัวดาเนินการทางคณิตศาสตร์ (Arithmetic Operators) ประเภทการคานวณ (Arithmetic Operators) ตัวดาเนินการ ความหมาย ตัวอย่ างการใช้ งาน + 15 การบวก 10+5 5 การลบ 10-5 * การคูณ 50 10*5 ผลลัพธ์ Java Programming Part II ประเภทการคานวณและการให้ ค่า (Arithmetic Assignment Operators) ตัวดาเนินการ ความหมาย ตัวอย่ าง เปรียบได้ กบั ผลลัพธ์ (เมื่อ a=10) += การบวก a +=5 a=a+5 -= การลบ a -=5 a=a-5 15 5 *= การคูณ /= การหาร (ได้ ผลหาร) a*=5 a/=5 a=a*5 a=a/5 50 Java Programming Part II ประเภทการคานวณเพิม่ ค่ าและลดค่ าข้ อมูล (Increment/Decrement Arithmetic Operators) ตัวดาเนินการ (เมื่อ a=10) ความหมาย ตัวอย่ าง ผลลัพธ์ ผลลัพธ์ หลังคาสั่ ง ++Variable เพิม่ ค่ าหนึ่งค่ าก่ อนการเข้ าถึง System.out.println(++a) 11 11 Variable ++ เพิม่ ค่ าหนึ่งค่ าหลังการเข้ าถึง System.out.println(a++) 10 11 - - Variable ลดค่ าหนึ่งค่ าก่ อนการเข้ าถึง System.out.println(- -a) 9 9 Variable - - ลดค่ าหนึ่งค่ าหลังการเข้ าถึง System.out.println(a- -) 10 9 Java Programming Part II – ตัวดาเนินการที่เกีย่ วข้ องกับบิต(Bitwise Operators) ตัวดาเนินการ ความหมาย ตัวอย่ าง ผลลัพธ์ ของ a (เมือ่ a=1101; b=1001) ~ NOT ( 1 เป็ น 0; 0 เป็ น 1) & AND a&b 1001 | OR a|b 1101 << ขยับบิตทางซ้ าย a << 2 0100 >> ขยับบิตทางขวา a >> 2 0111 ~a 0010 Java Programming Part II – ตัวดาเนินการข้ อความตรรกะ (Boolean Operators) ตัวดาเนินการเปรียบเทียบ ตัวดาเนินการ ความหมาย 15 ;) ตัวอย่ าง ผลลัพธ์ (a = 10; b = == ค่ าเท่ ากันหรือไม่ a==b False (เท็จ) != ค่ าไม่ เท่ ากันหรือไม่ a != b True (จริง) > ค่ ามากกว่ าหรือไม่ a>b False (เท็จ) >= ค่ ามากกว่ าหรือเท่ ากันหรือไม่ a >= b False (เท็จ) < ค่ าน้ อยกว่ าหรือไม่ a<b True (จริง) <= ค่ าน้ อยกว่ าหรือเท่ ากันหรือไม่ a <= b True (จริง) Java Programming Part II ตัวดาเนินการข้ อมูลตรรกะ ตัวดาเนินการ 15 ;) ความหมาย ตัวอย่ าง ผลลัพธ์ (a = 10; b = True (จริง) ! กลับค่ าทางตรรกะ !(a = = b) && AND ค่ าทางตรรกะ (5>=a) && (5<=b) False (เท็จ) || OR ค่ าทางตรรกะ (15= = a) || (15= = b) True (จริง) Java Programming Part II – ตัวดาเนินการสาหรับข้ อความ (String Operators) * การเชื่อมข้ อความ : ใช้ เครื่องหมาย “+” ในการเชื่อมข้ อความ * การดาเนินการกับข้ อความ : สามารถใช้ เมธรอดของคลาส String เช่ น charAt ดึงตัวอักษรในข้ อความ ณ ตาแหน่ งใด ๆ length หาความยาวของตัวอักษรในข้ อความ subString ตัดบางส่ วนของข้ อความมาใช้ งาน toLowerCase แปลงตัวอักษรในข้ อความให้ เป็ นตัวเล็ก ….. ….. Java Programming Part II • นิพจน์ (expressions) คือการสร้ างคาสั่ งหรือส่ วนของคาสั่ งเพือ่ ให้ เกิดการประมวลผล มีการสร้ างหลายรูปแบบคือ – ประเภทการคานวณ – ประเภทการเรียกใช้ Java Programming Part II ประเภทการคานวณ – หมายถึงการเขียน Statement ในซอร์ สโค้ ดเพือ่ ให้ เกิดการ ประมวลผลที่ได้ ผลลัพธ์ – สร้ างได้ ท้งั จากข้ อมูลค่ าคงที่ ตัวแปร และตัวดาเนินการ ตัวอย่ าง 5 * 800; a = 12.5; (a<b) && (c>d) Java Programming Part II ประเภทการเรียกใช้ – หมายถึงการเขียน Statement ในการเรียกใช้ เมธรอดของคลาส หรือของ Object ตัวอย่ าง Integer.parseInt(“12”); System.out.println(“Hello Java”); Java Programming Part II • คาสั่ งควบคุมการทางานของ Statement (Control Flows) : เงือ่ นไข (Condition) if ไม่ มี else รู ปแบบ if (expression) statement; public class CheckPositiveNumber { public static void main(String arg[]){ if(Integer.parseInt(arg[0])>0) System.out.println(“Your Number [“ + Integer.parseInt(arg[0]) + “] is Positive”); } } Java Programming Part II : เงื่อนไข (Condition) if มี else รู ปแบบ if (expression) statement1; else statement2; public class YourAge{ public static void main(String arg[]){ if(Integer.parseInt(arg[0]) >30) System.out.println(“You’re Older”); else System.out.println(“Your’re Younger”); } } Java Programming Part II : ตรวจสอบค่ า (Multiple Branch) รู ปแบบ switch (Variable) { case Data_1 : statement_1; break; case Data_2: statement_2; break; … case Data_n: statement_n; break; default: statement } Java Programming Part II public class ShowString{ public static void main(String arg[]){ int a = Integer.parseInt(arg[0]); switch(a){ case 1 : System.out.println(“One”); break; case 2 : System.out.println(“Two”); break; default : System.out.println(“> Two”); } } } Java Programming Part II : ลูป (Loop) for … รู ปแบบ for( Initial_Counter; Condition; Increase_Counter/Decrease_counter) Statement; public class PrintWord{ public static void main(String art[]){ int a; for( a=0; a<10; a++) System.out.println(“Sawadee”); } } Java Programming Part II : ลูป (Loop) while … รู ปแบบ while (condition) Statement; public class FormulaMultiple{ public static void main(String arg[]){ int a = 1; //Initial Counter while (a <= 12){ //Counter Check System.out.println(Integer.parseInt(arg[0]) * a); a++; //Increase Counter } } } Java Programming Part II : ลูป (Loop) do ... while รู ปแบบ do statement while (Condition) public class DoWhile{ public static void main(String arg[]){ do System.out.println(“Don’t forget me”); while ( 5>10); } } Java Programming Part II : กระโดด (Jumps) break รู ปแบบ break label_name public class BreakScope{ public static void main(String args[]){ Comehere: for(int a=0; a<10; a++){ System.out.println("Line 1"); for(int b=0; b<10; b++){ System.out.println("Line 2"); break Comehere; } System.out.println("Line 3"); } } } Java Programming Part II : กระโดด (Jumps) continue รูปแบบ continue label_name public class BreakScope2{ public static void main(String args[]){ Comehere: for(int a=0; a<10; a++){ System.out.println("Line 1"); for(int b=0; b<10; b++){ System.out.println("Line 2"); continue Comehere; } System.out.println("Line 3"); } } } Java Programming Part II : กระโดด (Jumps) return รูปแบบ return expression - ใช้ สาหรับการหยุดการทางานของเมธรอด - เมื่อเมธรอดเป็ นแบบคืนค่ าได้ คีย์เวิร์ด return ตามด้ วยค่ าที่ต้องการส่ งกลับ Java Programming Part III Java Programming Part III • Class versus Object – Reference Variable – Instance • Reference Variable versus Instance • Method : Overload : Mutation and Assessor : Constructor Class versus Object • คลาส (Classes) – คือ นิยามของวัตถุ หรื อรู ปแบบ Template ของวัตถุ (Object) – คลาสหนึ่งคลาส คือ ไฟล์ Bytecode 1 ไฟล์ – คลาสสามารถใช้งานได้เมื่อนาไปสร้าง Instance ขึ้นมา – หรื อใช้งานในบางส่ วน เมื่อส่ วนนั้นถูกกาหนดด้วยคียเ์ วิร์ด Static Class versus Object • สิ่ งทีใ่ ช้ บอกความเป็ นวัตถุมี 2 ลักษณะ 1. วัตถุมีอะไรเป็ นส่ วนประกอบ เช่น รถยนต์มี ล้อ และ เครื่ องยนต์ เราเรี ยกว่า คุณสมบัติของวัตถุ ใน Java แทนด้ วยตัวแปรคลาส 2. วัตถุสามารถทาอะไรได้ เช่น รถยนต์ตอ้ งสามารถวิง่ ได้ เราเรี ยกว่า พฤติกรรมของวัตถุ ใน Java แทนด้ วยตัวแปรแมธรอส ซึ่งทั้ง คุณสมบัติของวัตถุ และ พฤติกรรมของวัตถุ คือสิ่ งที่ ประกอบขึน้ เป็ นคลาส (Classes) ตัวอย่าง • Vehicle class Vehicle -numberOfWheels: int -hasEngine: boolean +run() Class Diagram public class Vehicle{ //Attributes int numberOfWheels; boolean hasEngine; //Method void run(){ System.out.println(“I am running”); } } Class versus Object • คลาส (Classes) รูปแบบ <modifiers> class <class_name> { [<attribute_declarations>] [<constructor_declarations>] [<method_declarations>] } modifiers = ระดับการเข้าถึง [public, <default> ไม่ระบุ หมายถึง package] Class versus Object • ออปเจ็ค (Object) – คือสิ่ งที่มีคุณสมบัติและพฤติกรรมตามที่กาหนดไว้ในคลาส – วัตถุในภาษาจาวาเราเรี ยกว่า อินสแตนท์ (Instance) – การนาคลาสมาใช้งานโดยการสร้างวัตถุตามนิยามของคลาส เรี ยกว่า วิธีสร้ างอินสแตนท์ (Instance) การสร้ างอินสแตนท์ (Instance) • ตัวอย่ าง การสร้ างอินสแตนท์ (Instance) public class BuildCar { public static void main (String[] args) { new Vehicle(); // (1) Create new Instance new Vehicle(); // (2) Create new Instance System.out.println(“Two cars have been built.”); } } Subclassing • Employee class Employee -name : String = “” -salary : double -birthDate : Date +getDetails() : String Class Diagram public class Employee { //Attributes private String name =“” private double salary; private Date birthDate; //Method public String getDetails() {...} } Subclassing • Manager class Manager -name : String = “” -salary : double -birthDate : Date -department : String +getDetails() : String Class Diagram public class Manager{ //Attributes private String name =“” private double salary; private Date birthDate; private String department; //Method public String getDetails() {...} } Subclassing Superclass or Parentclass Subclass or Childclass Employee -name : String = “” -salary : double -birthDate : Date +getDetails() : String Manager -department : String public class Employee{ //Attributes private String name =“” private double salary; private Date birthDate; //Method public String getDetails() {...} } public class Manager extends Employee{ private String department; } Java Programming Part III • Single Inheritance – การสื บทอด Class สามารถสื บทอดได้ จาก Class เดียว รู ปแบบ <modifiers> class <name> [ extends <superclass>] { <declarations> } An Example Inheritance Tree Employee -name : String = “” -salary : double -birthDate : Date +getDetails() : String Engineer Manager -department : String Director -carAllowance : double + increaseAllowance() Secretary Access Control • Access Level – Variable และ Method (public, protected,default ,private) – Classes (public ,default) Modifier private default protected public Same Class Yes Yes Yes Yes Same Package Subclass Universe Yes Yes Yes Yes Reference Variable versus Instance • ตัวแปรอ้างอิง (Reference Variable ) – คือ ตัวแปรที่ใช้เก็บเลขบอกตาแน่งในแรม หรื อตัวชี้อินสแตนท์ – ไม่มีชื่อเรี ยกเฉพาะ เนื่องจากชื่อจะเปลี่ยนไปตามชื่อคลาสของ อินสแตนท์ที่ช้ ี • อินสแตนท์ (Instance) – วัตถุในภาษาจาวา – การสร้าง อินสแตนท์ทาได้โดยการใช้คียเ์ วิร์ด new – การทาลาย อินสแตนท์ จะถูกทาลายด้วยระบบ Garbage Collector โดยอัตโนมัติเมื่อไม่มีการอ้างถึงตัวแปรอ้างอิง Reference Variable versus Instance • การกาหนดตัวแปรอ้างอิงไปยังอินสแตนท์ วิธีที่ 1. กาหนด 2 Statement รูปแบบ Class_Name Reference_Name Reference_Name = new Class_Constructor(Parameter_List) Double d1; d1 = new Double(100.50); Reference Variable versus Instance • การกาหนดตัวแปรอ้างอิงไปยังอินสแตนท์ วิธีที่ 2. กาหนด 1 Statement รูปแบบ Class_ Name Reference_ Name = new Class_Constructor( Parameter_ List ) Integer x = new Integer(55); x = null; • การกาหนดค่ า null หมายถึง การทาให้ไม่มีการอ้างหรื อชี้ไปยังตาแหน่งใด ๆ Method • คอนสตรัคเตอร์ (Constructors) • เมธรอดตั้งค่า และ เมธรอดรับค่า (Mutation and Assessor) • โอเวอร์โหลดดิ่ง (Overloading) คอนสตรัคเตอร์ (Constructors) • ถูกเรี ยกใช้งานเมื่อมีการสร้างอินสแตนท์ (Instance) • ใช้สาหรับการกาหนดค่าเริ่ มต้นให้กบั ตัวแปรอินสแตนท์ • คลาสหนึ่งคลาส สามารถกาหนดคอนสตรัคเตอร์ (Constructors) ที่มี พารามิเตอร์ได้หลายรู ปแบบ • คอนสตรัคเตอร์ (Constructors) ไม่มีการกาหนดการคืนค่า เหมือน เมธรอดทัว่ ไป • ชื่อเหมือนชื่อ Class Java Programming Part III • Constructors รู ปแบบ <modifiers> <class_name>([<argument_list>]) { [<statements>] } public class Vehicle{ • int numberOfWheels; boolean hasEngine; //คอนสตรัคเตอร์ ปกติ • Vehicle(){ • numberOfWheels = 4; • hasEngine = true; • } //คอนสตรัคเตอร์ โอเวอร์ โหลด • Vehicle(int number, boolean engine) { // (1) • numberOfWheels = number; • hasEngine = engine; • System.out. println("A car has been built."); • } • } เมธรอดตั้งค่าและเมธรอดรับค่า (Mutation and Assessor) • เมธรอดตั้งค่ า (Mutation) – สาหรับการกระทาเพื่อเปลี่ยนแปลงค่าของ Data ภายในอินสแตนท์ – นาหน้าด้วย set เช่น setName() • เมธรอดรับค่ า (Assessor) – สาหรับการกระทาเพื่อดึงหรื ออ่านค่าของ Data ภายในคลาส – นาหน้าด้วย get เช่น getName() โอเวอร์โหลดดิ่ง (Overloading) • คือ Method ที่มีชื่อซ้ ากัน • การใช้ พิจารณาจาก Argument เป็ นหลัก แบ่งออกเป็ น 3 แบบ 1. ประเภทต่ าง cal (String s) cal (int x) 2. จานวนต่ าง cal (int x) cal (int x,int j) 3. ลาดับต่ าง cal(int x ,String s) cal(String s,int x) class Vehicle { int numberOfWheels; boolean hasEngine; void run(int mile){ // (1) System.out.println(“I am running on the ” + mile + “th mile.” ); } void run(float mile){ // (2) System.out.println(“I am running on the ” + mile + “th mile.” ); } } public class DriveACar { public static void main (String[] args) { Vehicle myCar = new Vehicle(); myCar.run(10); // (3) myCar.run(10.0F); // (4) } } โอเวอร์รายดิ่ง (Overriding) • คือ การเปลี่ยนแปลงคุณสมบัติที่สืบทอดมา • subclass สามารถสร้าง Method ที่มีการทางานต่างจาก SuperClass แต่มีขอ้ กาหนด ที่เมื่อทาการ override แล้วต้องเหมือน SuperClass ดังนี้ 1. Name 2. Return Type 3. Argument List • subclass ห้ามมีการเข้าถึงต่ากว่า SuperClass public class Employee{ //Attributes private String name =“”; private double salary; private Date birthDate; //Method public String getDetails() { return “Name : “+ name + “\n”+ “Salary : ” + salary; } } public class Manager extends Employee{ //Attributes private String department; //Method public String getDetails() { return “Name : “+ name + “\n”+ “Salary : ” + salary + “\n”+ “ Manager of : “ + department ; } } The super Keyword • อ้างถึง Method ของ SuperClass ใช้เมื่อมีการ Override และจะต้อง เรี ยกเป็ น Statement แรกเสมอ public class Employee{ private String name =“”; private double salary; private Date birthDate; public String getDetails() { return “Name : “+ name + “\n”+ “Salary : ” + salary; } } public class Manager extends Employee{ private String department; public String getDetails() { // Call parent Method return super.getDetails() + “\n Department : “ +department ; } } The instanceof Operator • ใช้ในการตรวจสอบ parent จะ return ค่าเป็ น boolean public class Employee extends Object public class Manager extends Employee public class Engineer extends Employee public void doSomething (Employee e) { if (e instanceof Manager){ //Process Manager }else if (e instanceof Engineer){ //Process Engineer }else{ //Process any other type of Employee } } Advanced Class Features • • • • • static variables, methods, and initializers final classes,methods and variables abstract classes and methods inner classes interface The static Keyword • ใช้กบั variables, methods และ inner classes • ใน memory เก็บที่เดียว ไม่ใช่ Global Variable ใช้ได้เฉพาะ Object ที่ใช้งานร่ วมกัน – Attribute มีชีวิตเมื่อสร้าง Object (new) – static มีชีวติ เมื่อ Load Class Class Attributes Count +counter : int = 0 -serialNumber : int <<instanceOf>> <<instanceOf>> c1 : Count serialNumber = 1 c2 : Count serialNumber = 2 public class Count { private int serialNumber; public class OtherClass { public static int counter = 0; public void incrementNumber () { Count.counter++; public Count() { } counter++; } serialNumber = counter; /* ไม่ ต้องทาการสร้ าง Object } เพียงแต่ ระบุ Class และตัวแปร } */ Class Methods public class Count { private int serialNumber; public TestCounter { public static void main (String[] args) { public static int counter = 0; System.out.println(“Number of counter is ” + Count.getTotalCount()); public static int getTotalCount(){ return counter; } Count c1 = new Count(); public Count(){ System.out.println(“Number of counter is ” + Count.getTotalCount()); counter++; } serialNumber = counter; } } } //The Output is: Number of counter is 0 public class Count { Number of counter is 1 private int serialNumber; public static int counter = 0; public static int getTotalCount(){ //COMPILER ERROR return serialNumber; } } ภายใน static ห้ ามเรียกใช้ non-static (ทั้ง Attribute และ Method) Static Initializers public class Count { private int serialNumber; public TestCounter { public static void main (String[] args) { public static int counter = 0; System.out.println(“Number of counter is ” + Count.getTotalCount()); public static int getTotalCount(){ return counter; } Count c1 = new Count(); public Count(){ System.out.println(“Number of counter is ” + Count.getTotalCount()); counter++; } serialNumber = counter; } } } //The Output is: Number of counter is 0 public class Count { Number of counter is 1 private int serialNumber; public static int counter = 0; public static int getTotalCount(){ //COMPILER ERROR return serialNumber; } } ภายใน static ห้ ามเรียกใช้ non-static (ทั้ง Attribute และ Method) final classes,methods and variables Abstract Class • คุณสมบัติ – 1. ลูกของ abstract ต้องเอา Method มา Override – 2. ไม่สามารถสร้าง Object แต่ประกาศตัวแปรได้ • new Vehicle() //ไม่ ได้ , Vehicle v ; //ได้ – 3. ภายใน Abstract class สามารถมี Method ธรรมดาได้ – 4. สามารถสร้าง Constructor ได้ (เรี ยกโดย subclass ไม่ใช่จาก การ new) ควรเขียนให้อยูใ่ น modifier <protected> The Abstract Vehicle Using a Template Method Vehicle public abstract class Vehicle { - load : double = 0 public abstract double calcFuelEffiency(); -maxload : double = 0 public abstract double calcTripDistance(); #Vehicle(max_load : double) +getLoad() : double } +getmaxLoad () : double +addBox(weight : double) +calcFuelNeeds() : double Subclass ต้ องทาการ Override Method ของ SuperClass #calcFuelEfficiency() : double #calcTripDistance() : double Truck RiverBarge +Truck(max_load : double) +RiverBarge(max_load : double) #calcFuelEfficiency() : double #calcFuelEfficiency() : double #calcTripDistance() : double #calcTripDistance() : double public class Truck extends Vehicle { public class RiverBarge extends Vehicle { public Truck (double max_load); public RiverBarge (double max_load); public double calcFuelEffiency(){…cal..} public double calcFuelEffiency(){…cal..} public double calcTripDistance(){…cal..} } public double calcTripDistance(){…cal..} } Java Programming Part IV Java Programming Part IV • Exceptions Handling • Java Servlets • JDBC (Java Database Connectivity) Exceptions Handling • การตรวจสอบความผิดพลาดที่เกิดขึ้นขณะใช้งานโปรแกรม • จาวามีวิธีการที่มีประสิ ทธิภาพโดยใช้เอ็กซ์เซฟชัน่ ซึ่งเป็ นวัตถุใน ภาษาจาวา สื บทอดมาจากคลาส Throwable ซึ่งอยูใ่ นแพคเกจ java.lang • ภายในคลาส Throwable มี 2 Subclasses คือ – Error : จัดการเอ็กซ์เซฟชัน่ ที่เกิดขึ้นกับ Java Virtual Machine ซึ่ งเรามัก แก้ไขหรื อควบคุมไม่ได้ เช่น Harddisk fail ,JVM Error – Exception : จัดการความผิดพลาดอื่น ๆ ซึ่ งเราสามารถควบคุมได้ เช่น การหารด้วยศูนย์ ตัวอย่าง Exception Throwable Error Exception ... InterruptedException .. ArithmeticException RuntimeException .. .. IOException NullPointerException ตัวอย่างเอ็กซ์เซฟชัน่ ในกลุ่ม runtimeException • ArithmeticException เกิดเมือ่ มีการกระทาทางคณิตศาสตร์ ที่ผดิ กฏเกณฑ์ เช่ น การหารด้ วยศูนย์ • ClassCastExcception เกิดเมือ่ มีการพยายามแคสวัตถุทไี่ ม่ได้เป็ นวัตถุของ Classes หรือ Subclasses นั้น • IllegalArgumentException เกิดเมือ่ มีการส่ งตัวแปรผิดชนิดให้ กบั เมธรอด • IndexOutOfBoundsException เกิดเมือ่ มีการอ้างถึงตาแหน่ งในอะเรย์ที่ไม่มอี ยู่ • NullPointerException เกิดเมือ่ มีการนาตัวแปรอ้างอิงที่มีค่าเป็ น null ไปใช้ ภายในเมธรอด ตัวอย่าง class DivisionByZero { public static void main(String args[ ]){ int a = 20, b = 0; System.out.println(a / b ); } } try - catch Block การดักจับความผิดพลาดโดยการใช้ กลุ่มคาสั่ ง try – catch รูปแบบ try { //คาสั่ งสาหรับดักกลุ่ม Statement ทีค่ าดว่ าจะเกิด Exception }catch ( Exception_Class1 ){ //คาสั่ งดักจับ Instance ใด ๆ ใน Exception Class Resolve_Statement1 // กลุ่ม Statement เพือ่ ทางาน }catch ( Exception_ClassN ){ Resolve_StatementN }finally{ //คาสั่ งสาหรับกาหนดให้ ทา Statement ใน Final Statemet ทุก ๆ กรณี Final_Statement // กลุ่ม Statement เพือ่ ทางานไม่ ว่าจะเกิดหรือไม่ เกิด Exception } try - catch Block • ลาดับของบล็อก catch มีความสาคัญในกรณี ที่ตอ้ งการดัก Exception มากกว่า 1 ตัว และมี Exception บางตัวที่สืบทอดกัน • ควรเขียนเรี ยงจาก Exception ที่เป็ น Subclasses ก่อน SuperClasses เช่น IOException , ArithmeticException , Exception เนื่องจาก Exception เป็ น SuperClasses ของทุก Exception ถ้า เขียนไว้ก่อน Subclasses ก็จะไม่ทางาน คาสัง่ throws • การโยนความรับผิดชอบให้กบั เมธรอดอื่น ที่เรี ยกใช้เมธรอดที่ควร จะมีการดักจับ Exception ให้ทาการดักจับ Exception เอง class DevidedByZeroDemo { void devidedByZero() throws ArithmeticException {//(1) int i = 20; int j =0; System.out.println(i/j); } } public class TestException3{ public static void main(String args[]) { try { // (2) new DevidedByZeroDemo().devidedByZero(); } catch (ArithmeticException ae) { System.out.println("Divided by Zero."); } } } Java Servlets • An Introduction to Servlets – – – – – Servlets คืออะไร ? การรับส่ งข้ อมูลโดยใช้ เว็บ URL และ URI การรับส่ งข้ อมูลระหว่ างเว็บและ Servlet รูปแบบโครงสร้ างของ Servlet – Servlet Architecture Overview HTTP servlets – Servlet Life Cycle • How to Write a servlet – Interacting with Clients Servlets คืออะไร ? • Servlet คือเทคโนโลยี ที่เกิดขึ ้นมาจาก Java เพื่อใช้ งานทางด้ านการสร้ าง โปรแกรมในรูปแบบ CGI สาหรับทางานบนเว็บเซิร์ฟเวอร์ เพื่อให้ ผลการแสดง เว็บสูผ่ ้ อู า่ น มีการเปลี่ยนแปลงตามการใช้ งาน ซึง่ เป็ นเทคโนโลยีที่สืบ เนื่องมาจากเหตุผลดังนี ้ - ความต้ องการให้ หน้ าเว็บเปลี่ยนตามข้ อมูลที่ผ้ อู า่ นส่งให้ - ความต้ องการให้ หน้ าเว็บเปลี่ยนตามข้ อมูลที่มีการเปลี่ยนแปลงบ่อยครัง้ - ความต้ องการให้ หน้ าเว็บเปลี่ยนตามระบบฐานข้ อมูล การรับส่ งข้อมูลโดยใช้เว็บ การรับส่ งข้อมูลโดยใช้เว็บ ผ่านทางแท็กฟอร์ ม <FORM ...> มีรูปแบบการส่ งอยู่ 2 ลักษณะคือ GET และ POST โดยที่การส่ งแบบ GET เป็ นรู ปแบบการส่ งข้อมูล ผ่านทาง URL ซึ่ งผูใ้ ช้อาจจะพิมพ์ได้เองโดยตรง เช่น http://127.0.0.1?username=user1&pwd=1234 หรื อฟอร์ มที่แท็กกาหนดแอททริ บิวต์ METHOD เป็ น GET เช่น <FORM NAME="LOGIN" METHOD="GET" > สาหรับการส่ งข้อมูลผ่านฟอร์ มในแบบ POST คือการกาหนดแท็กฟอร์ มให้มี แอททริ บิวต์ METHOD เป็ น POST เช่น <FORM NAME="LOGIN" METHOD="POST" > หมายเหตุ หากไมมี ่ การกาหนด METHOD ในฟอร์มโดย Default จะมีค่า เป็ น GET URL และ URI • URL (Uniform Resource Locator) คือเส้นทางในการอ้างถึงแหล่งข้อมูลบน อินเตอร์เน็ต URL จึงเป็ นข้อกาหนดที่สามารถเข้าถึงเอกสารที่ตอ้ งการได้ • URI (Uniform Resource Identifier) คือข้อมูลส่ วนหนึ่งของ URL ซึ่ งเป็ นกลุ่ม ข้อมูลที่อยูต่ ่อท้ายจากชื่อเครื่ องปลายทางและหมายเลขพอร์ ต (หากระบุ) เพื่อ ใช้สาหรับเป็ นข้อมูลดาเนินงานในส่ วนโปรแกรมที่อยูบ่ นเว็บเซิ ร์ฟเวอร์ ตัวอย่าง เมื่อ URL คือ http://localhost:8080/servlet/HelloWorld ดังนั้น URI คือ /servlet/HelloWorld การรับส่ งข้อมูลระหว่างเว็บและ Servlet • GET requests : รู ปแบบการส่ งข้อมูลผ่าน URL โดย Parameter1 และ Parameter2 คือชื่อ พารามิเตอร์ที่ถูกเซิร์ฟเวอร์อา้ งถึงได้ ในขณะที่ Data1 และ Data2 คือข้อมูลที่อยูใ่ นพารามิเตอร์ แต่ละตัว หากต้องการส่ งข้อมูลมากกว่า 2 ตัว ก็จะเพิม่ ต่อท้ายไปได้เรื่ อยๆ เช่น .../servlet/ViewCourse?Parameter1=Data1&Parameter2=Data2&Parameter3=D ata3 • POST requests: เป็ นการส่ งด้วยโปรโตคอล HTTP ที่ใช้ในเว็บเป็ นตัวจัดการ การส่ งแบบนี้มี ข้อดีที่ผอู้ ื่น ไม่สามารถล่วงรู ้ได้วา่ ลักษณะการส่ งข้อมูลไปใช้เซิ ร์ฟเวอร์ ส่ งข้อมูลอะไรไป และส่ ง โดยการใช้พารามิเตอร์ชื่ออะไร การส่ งข้อมูลในแบบ POST ทาได้โดยการใช้ แท็ก FORM แต่ กาหนดวิธีการส่ งเป็ น POST .../servlet/PlaceOrderProcess รู ปแบบโครงสร้างของ Servlet import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class ServletTemplate extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { PrintWriter out = res.getWriter(); } } Servlet Architecture Overview HTTP servlets parameters, protocol, remote host, ServerInputStream(binary data etc..) Servlet interface ServletRequest GET doGet(ServletRequest req, ServletResponse res); Servlet ServletResponnse Client ServletRequest POST doPost(ServletRequest req, ServletResponse res); Servlet ServletResponse mime type to reply,reply data, ServletOutputStream IS-A Servlet Life Cycle Server loads Servlets - run init method No Concurrency Issue Server runs init only once, not per request Servlets Accept Request from Clients and return Data back - run service method service must be thread-safe - multiple service method at a time if that is impossible, servlet must implement SingleThreadModel interface Server removes Servlets - run destroy method Server reloads Servlets - run init method destroy must be thread-safe - when server runs destroy, other threads might be accessing shared resources How to Write a servlet คลาสที่จะสามารถทางานเป็ น Servlet ได้ตอ้ ง extends (สื บทอด) มา จากคลาส javax.servlet.http.HttpServlet หากต้องการรับข้อมูลที่ส่งมาด้วย รู ปแบบ GET ให้สร้างเมธรอดชื่อ doGet หรื อหากต้องการ รับข้อมูลที่ส่ง มาด้วยรู ปแบบ POST ให้สร้างเมธรอดชื่อ doPost ในเมธรอดต้องมีอาร์ กิวเม็นต์ 2 ตัวคือ HttpServletRequest สาหรับอ้างข้อมูลที่ส่งข้อมูลจากผูใ้ ช้ (จาก ตัวอย่างอ้างด้วยตัวแปร req) HttpServletResponse สาหรับส่ งข้อมูลกลับไปยังผูใ้ ช้ ทั้งที่เป็ น ข้อมูล Header และส่ วนเนื้อความ (BODY) (จากตัวอย่างอ้างด้วยตัวแปร res) How to Write a servlet • เมื่อต้องการส่ งเนื้อความสู่ ผใู ้ ช้ มักจะส่ งไปให้คลาส PrintWriter จัดการอีกที • คลาสดังกล่าวมีส่วนตรวจสอบข้อผิดพลาด หรื อ Exception Handling โดย อาศัยคลาส ServletException และ IOException โดยตรวจจับในเมธรอด • import ถูกใช้เพื่อเรี ยกใช้งานคลาสต่างๆ ในแพ็กเกจที่สนับสนุนการทางาน Servlet ดังนี้ – import java.io.* – import javax.servlet.* – import javax.servlet.http.* สาหรับคลาส PrintWriter สาหรับคลาส HttpServlet สาหรับคลาส HttpServletRequest และ HttpServletResponse First Servlet import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloServlet extends HttpServlet { public void doGet(HttpServletRequest req,HttpServletResponse res) throws ServletException, IOException { //res.setContentType("text/html"); res.setContentType("text/html; charset=tis-620"); //Thai Lang. PrintWriter out = res.getWriter(); out.println("<title>First Servlet</title>"); out.println("<H1>สวัสดี Servlet !</H1>"); } } JDBC (Java Database Connectivity) • JDBC คืออะไร ? • JDBC driver types • การใช้ งาน JDBC JDBC คืออะไร ? • Java DataBase Connectivity หรื อ JDBC คือมิดเดิลแวร์ที่ถูกใช้บน เทคโนโลยีจาวา ในการเข้าถึงระบบฐานข้อมูล โดยสามารถเรี ยกใช้ งานข้อมูล หรื อจัดการระบบฐานข้อมูลผ่าน คาสัง่ SQL-92 หรื อ ภาษา SQL มาตรฐาน JDBC driver types • JDBC ซึ่งเป็ นมิดเดิลแวร์ตวั หนึ่ง มีรูปแบบและชื่อเรี ยกที่แบ่ง ออกเป็ น 4 แบบด้วยกันคือ Type 1, Type 2, Type 3 และ Type 4 โดยเป็ นข้อกาหนดที่ถูกกาหนดมาโดยบริ ษทั ซัน ไมโครซิส เท็มซ์ ซึ่งเป็ นผูก้ าหนดรายละเอียดของแต่ละประเภท ดังนี้ – Type1: JDBC-ODBC Bridge – Type2: Partial Java Driver – Type 3: Pure Java Driver – Type 4: Direct-to-DB Type1: JDBC-ODBC Bridge • หมายถึง JDBC ที่ทางานอยูบ่ นชั้นการสื่ อสารมิดเดิลแวร์ทชี่ ื่อ ODBC อีกที หนึ่ง เนื่องจากการทางานของคอมพิวเตอร์บนพื้นฐานของระบบปฏิบตั ิการ ไมโครซอฟต์วินโดว์ส มีมิดเดิลแวร์ที่ชื่อ ODBC เป็ นมาตรฐานในการ สื่ อสารอยูแ่ ล้ว และเนื่องมาจากระบบที่พฒั นาให้ใช้งานบนวินโดว์ส่วน ใหญ่กม็ กั จะถูกพัฒนาโดยอาศัย ODBC มาช่วยในการทางานอยูด่ ว้ ย ดังนั้น ในการสร้างโปรแกรมด้วยภาษาจาวาให้สามารถทางานอยูบ่ นพื้นฐาน ODBC เดิม เพื่อหลีกเหลี่ยงปัญหาอันเกิดจากความยุง่ ยากในการติดตั้ง และ ต้องแปลงระบบที่ใช้อยูไ่ ปเป็ นระบบใหม่ท้ งั หมด ดังนั้นเมื่อมีการพัฒนาโปรแกรมด้วยภาษาจาวา โดยมีการใช้งาน ระบบเดิมที่เรี ยกใช้ ODBC อยูแ่ ล้ว จึงนิยมที่จะพัฒนาโปรแกรมในรู ปแบบ การใช้งาน JDBC ประเภทที่ 1 Type1: JDBC-ODBC Bridge • ลักษณะของการนาไปใช้งาน ถูกใช้สาหรับการศึกษาวิธีการเขียนโปรแกรมจาวา เพื่อติดต่อกับ JDBC (ซึ่ งในหนังสื อจะมีการอ้างถึง JDBC ประเภทนี้ในตัวอย่าง) เหมาะกับระบบงานที่มี ODBC ในการใช้งานอยูแ่ ล้ว สาหรับระบบงานที่ท้ งั หมดทางานอยูบ่ นพื้นฐานของแพลตฟอร์ มวินโดว์ • ข้อด้อยของการนาไปใช้งาน ไม่เหมาะกับการนาไปใช้งานบนระบบงานที่มีขนาดใหญ่ๆ เนื่องจากทา ให้เกิดความช้าในการทางาน และประสิ ทธิ ภาพในการทางานที่ไม่ดี มีขอ้ มูลในส่ วนโอเวอร์ เฮด(Overhead) สู ง เนื่องจากต้องมีส่วนในการ ติดต่อระหว่าง JDBC และ ODBC เพิม่ เติม ไม่สนับสนุนความสามารถทั้งหมดของมาตรฐาน JDBC เนื่องจาก ข้อจากัดของ ODBC ที่มีรูปแบบการทางานน้อยกว่า JDBC Type2: Partial Java Driver • สาหรับ JDBC ประเภทนี้ ตัวไดรเวอร์ (มิดเดิลแวร์ของแต่ละผลิตภัณฑ์ มักจะใช้คาว่าไดร์เวอร์แทนมิดเดิลแวร์ตวั นั้นๆ) จะถูกโหลดไว้ที่ไคล แอนท์ (Client) หรื อเทียร์ (Tier) ส่ วนติดต่อกับผูใ้ ช้ ดังนั้นรู ปแบบในการสร้างโปรแกรมไคลแอนท์จะต้องพยายามโหลด ไดร์เวอร์ของผลิตภัณฑ์เซิร์ฟเวอร์ที่ตอ้ งการติดต่อด้วย เช่น ถ้ามีระบบ ฐานข้อมูล Oracle โปรแกรมในส่ วนไคลแอนท์ตอ้ งสร้างคาสั่งในการ โหลดไดร์เวอร์ Oracle ขึ้นใช้งาน ซึ่งแตกต่างกันในแต่ละระบบฐานข้อมูล Type2: Partial Java Driver • ลักษณะของการนาไปใช้งาน มีประสิ ทธิภาพในการดีกวาประเภท 1 (Type1) เมื่อ ่ เปรี ยบเทียบกัน คาสั่ งในการติดตอกั ่ ี ่ บเซิรฟเวอร ์ ์ จะเป็ นคาสั่ งทีด ที่สุดสาหรับเซิ ร์ฟเวอร์ น้ นั ๆโดย เฉพาะ ทาการทางานโดยรวมดีกว่า • ข้อด้อยของการนาไปใช้งาน ผู้ใช้โปรแกรมในส่วนไคลแอนทยั ้ ์ งตองการไดร ์ เวอร์ สาหรับเซิ ร์ฟเวอร์โดย เฉพาะเมื่อมีการเปลี่ยนแปลงเซิ ร์ฟเวอร์ เป็ น ผลิตภัณฑ์ตวั อื่น โปรแกรมในส่ วนไคลแอนท์ตอ้ งมีการเปลี่ยนแปลงและ คอมไพล์ใหม่เสมอ Type 3: Pure Java Driver • ในการใช้งานสถาปัตยกรรมแบบ Multi-Tier ที่จาเป็ นต้องมีแอพปลิเคชัน่ เซิร์ฟเวอร์ทางานร่ วมอยูใ่ นระบบ แอพปลิเคชัน่ เซิร์ฟเวอร์จะมาลดข้อ ยุง่ ยากในการติดตั้งหรื อดูแลระบบในส่ วนเทียร์ไคลแอนท์ ดังนั้นลักษณะ ของ JDBC ในประเภทที่ 3 คือการนาเอา JDBC ไดร์เวอร์ไปวางไว้ที่ตวั แอพปลิเคชัน่ เซิร์ฟเวอร์ เพื่อเป็ นตัวเชื่อมโยงการสื่ อสารไปหาเซิร์ฟเวอร์ Type 3: Pure Java Driver • ลักษณะของการนาไปใช้งาน เป็ นระบบที่มีประสิ ทธิ ภาพในการทางานที่ดีกว่าประเภทที่ 1 และ 2 เมื่อ เปรี ยบเทียบกัน เหมาะสาหรับองค์กรที่มีเซิ ร์ฟเวอร์ทางด้านฐานข้อมูลที่หลากหลายรู ปแบบ การทางานของไคลแอนท์ไม่จาเป็ นต้องติดตั้ง JDBC ไดร์เวอร์ไว้ในทุกตัว การติดตั้งและการดูแลระบบไคลแอนท์ทาได้ง่าย และสะดวก • ข้อด้อยของการนาไปใช้งาน ยังต้องการไดร์ เวอร์ สาหรับแต่ละผลิตภัณฑ์ เพื่อติดตั้งไว้ที่แอพปลิเคชัน่ เซิ ร์ฟเวอร์ Type 4: Direct-to-DB/Native Protocol • ลักษณะการทางานของ JDBC ในประเภทที่ 4 มีการทางานโดยการส่ ง คาสัง่ SQL จากไคลแอนท์ไปที่เซิร์ฟเวอร์ฐานข้อมูลโดยตรงผ่านระบบ เครื อข่าย โดยที่รูปแบบคาสัง่ SQL จะต้องเป็ นไปตามข้อกาหนดของระบบ ฐานข้อมูลแต่ละตัวที่เลือกใช้อยู่ ดังนั้นจะเห็นว่าการโต้ตอบของเซิร์ฟเวอร์ กับคาสัง่ SQL สามารถทางานได้รวดเร็ ว ทาให้ JDBC ประเภทนี้มีรูปแบบ การทางานที่รวดเร็ ว แต่กจ็ าเป็ นต้องสร้างไคลแอนท์สาหรับฐานข้อมูลแต่ ละระบบซึ่งในบางครั้งไคลแอนท์สาหรับฐานข้อมูลตัวหนึ่งจึงไม่สามารถ นาไปใช้กบั ระบบฐานข้อมูลตัวอื่นๆได้ Type 4: Direct-to-DB/Native Protocol • ลักษณะของการนาไปใช้งาน มีประสิ ทธิ ภาพในการทางานดีที่สุด เมื่อเทียบกับทุกประเภทที่กล่าวมา • ข้อด้อยของการนาไปใช้งาน มีความยุง่ ยากในการพัฒนาโปรแกรมเพื่อทางานในฝั่งไคลแอนท์ เพราะผูพ้ ฒั นา ต้องเรี ยนรู ้การทางานของเซิ ร์ฟเวอร์ แต่ละตัวก่อน Conceptual View server client JDBC Driver Manager JDBC-ODBC Bridge Partial Java Driver ODBC Driver DB Client Pure Java Direct-to-DB Driver DB Server DBMS DBMS DBMS DBMS Common Terms การใช้งาน JDBC Driver Manager Loads the driver, and manages connections. Driver Translates Java API calls into specific database operations. Connection Session between an application and a database. Statement An SQL statement or query. ResultSet Logical table returned by executing a statement. Metadata Information about returned data, the database and the driver. การใช้งาน JDBC การติดต่ อกับฐานข้ อมูล 1.1 ขั้นตอนการโหลดไดรเวอร์เพื่อใช้งาน รู ปแบบ Class.forName ("Driver_Name") ตัวอย่ าง try { Class.forName ("sun.jdbc.odbc.JdbcOdbcDriver"); } catch (ClassNotFoundException e) { System.err.print (e.getMessage ()); } การใช้งาน JDBC 1.2 การติดต่อไปยังระบบฐานข้อมูล รู ปแบบ Connection Instance_Name = DriverManager.getConnection(URL, Login, Password) รู ปแบบ URL jdbc:<subprotocol>:<subname> <subprotocol> คือโพรโตคอลการสื่ อสารข้อมูล เพื่อเจอจงไปยังเครื่ องหรื อระบบ ปลายทาง ซึ่ งมีขอ้ มูลแตกต่างกันไปตามรู ปแบบการสื่ อสาร เช่น odbc สาหรับการสื่ อสาร ผ่านระบบ ODBC <subname> คือฐานข้อมูลภายในระบบที่อา้ งผ่าน subprotocol หรื อแหล่งข้อมูล การใช้งาน JDBC ตัวอย่ าง try { String URL = "jdbc:odbc:myDSN"; Connection con = DriverManager.getConnection (URL,"myLogin","myPassword"); }catch (SQLException s) { System.err.print (s.getMessage ()); } การใช้งาน JDBC การสร้ าง Statement / PreparedStatement • Statement ใช้สาหรับสร้างคาสัง่ SQL ที่เป็ นข้อมูลคงที่ ไปยัง ฐานข้อมูลและคืนผลลัพธ์กลับมา (ข้อมูลในคาสัง่ SQL ไม่ เปลี่ยนแปลง) • PreparedStatement ใช้สาหรับสร้างคาสัง่ SQL ที่สามารถเปลี่ยนแปลง ข้อมูลบางส่ วนภายในตามพารามิเตอร์ที่ตอ้ งการใช้งาน ตัวอย่ าง Code Fragment 1: String updateString = "UPDATE COFFEES SET SALES = 75 " + "WHERE COF_NAME LIKE 'Colombian' "; stmt.executeUpdate(updateString); Code Fragment 2: PreparedStatement updateSales = con.prepareStatement( "UPDATE COFFEES SET SALES = ? WHERE COF_NAME LIKE ? "); updateSales.setInt(1, 75); updateSales.setString(2, "Colombian"); updateSales.executeUpdate() การใช้งาน JDBC การส่ งคาสั่ ง SQL ให้ กบั ฐานข้ อมูล • เมธรอดที่ถูกกาหนดไว้สาหรับส่ งคาสัง่ SQL ไปให้กบั ฐานข้อมูล ถูกแบ่งตามรู ปแบบคาสัง่ SQL ได้ 2 แบบ โดยผูใ้ ช้ตอ้ งเลือกเมธ รอดที่เหมาะสมกับคาสัง่ SQL ที่ใช้งานคือ – SQL เป็ นประเภทดาเนินการ ซึ่งสร้ างด้ วยคีย์เวิร์ดจาพวก CREATE, ALTER, DROP, INSERT, UPDATE, DELETE ต้ องใช้ งานผ่ าน เมธรอด ExecuteUpdate – SQL เป็ นประเภทสื บค้ นข้ อมูล ผลลัพธ์ ทตี่ ้ องการกลับมา ในรู ปของกลุ่ม ข้ อมูลเรคอร์ ด (Record Set) ต้ องเรียกใช้ งานผ่านเมธรอด ExecuteQuery และต้ องมีคลาสมารับผลลัพธ์ ทไี่ ด้ รับกลับมาในรู ปแบบของกลุ่มเรคอร์ ด คือคลาส ResultSet การใช้งาน JDBC การส่ งคาสั่ ง SQL ให้ กบั ฐานข้ อมูล (ต่ อ...) • เมธรอดทั้งสองรู ปแบบดังกล่าว สามารถเรี ยกใช้งานได้จากคลาส Statement และคลาส PreparedStatement อย่างใดอย่างหนึ่ง แต่ท้ งั สองคลาสดังกล่าวใช้สาหรับการสร้างคาสัง่ SQL ตัวอย่ าง Connection con = DriverManager.getConnection ( url, "myLogin", "myPassword"); Statement stmt = con.createStatement(); stmt.executeUpdate("CREATE TABLE COFFEES " + "(COF_NAME VARCHAR(32), SUP_ID INTEGER, PRICE FLOAT, " + "SALES INTEGER, TOTAL INTEGER)"); Statement stmt = con.createStatement(); String query = "SELECT COF_NAME, PRICE FROM COFFEES"; ResultSet rs = stmt.executeQuery(query); การใช้งาน JDBC การแสดงผลลัพธ์ • ผลลัพธ์ในชุด ResultSet มีโครงสร้างคล้ายกับข้อมูลใน TABLE คือ แบบออกเป็ นแนวแถวเรี ยกว่า Row (หรื อเรคอร์ด) และแนวคอลัมน์ เรี ยกว่า Column (หรื อฟิ ลด์) ดังนั้นหลักการดึงข้อมูลคือต้องระบุ row ให้ชดั เจนก่อนแล้วจึงค่อยระบุ column ที่ตอ้ งการ ตัวอย่ าง Statement stmt = con.createStatement(); String query = "SELECT COF_NAME, PRICE FROM COFFEES"; ResultSet rs = stmt.executeQuery(query); while (rs.next()) { String s = rs.getString("COF_NAME"); float n = rs.getFloat("PRICE"); System.out.println(s + " " + n); } Output : Colombian 7.99 French_Roast 8.99 Espresso 9.99 Colombian_Decaf 8.99 French_Roast_Decaf 9.99 การใช้งาน JDBC การปิ ดการติดต่ อกับฐานข้ อมูล • คือการปิ ดการใช้งาน Instance ที่ใช้สร้าง ResultSet ,Statement และ Connection • ใช้งานผ่านเมธรอด close() ตัวอย่าง rs.close(); stmt.close(); con.close(); สรุ ปการใช้งาน JDBC import java.sql.* load the driver create a Connection object create a Statement/PreparedStatement object execute a query get data from the ResultSet object close the objects