setFetchSize(int) กำหนดจำนวนแถวที่จะอ่านจากฐานข้อมูลเมื่อ ResultSet ต้องการแถวเพิ่ม ส่งผลต่อวิธีที่ database ส่งข้อมูล ResultSet setMaxRows(int) กำหนดจำนวนแถวสูงสุดที่ ResultSet จะเก็บได้ในครั้งเดียว ส่งผลต่อ client-side JDBC object
setFetchSize(int) กำหนดจำนวนแถวที่จะอ่านจากฐานข้อมูลเมื่อ ResultSet ต้องการแถวเพิ่ม ส่งผลต่อวิธีที่ database ส่งข้อมูล ResultSet setMaxRows(int) กำหนดจำนวนแถวสูงสุดที่ ResultSet จะเก็บได้ในครั้งเดียว ส่งผลต่อ client-side JDBC object
JDBC รองรับเกือบทุกชนิดข้อมูล SQL เมื่อ JDBC driver รับคำสั่งจาก Java application จะแปลงชนิดข้อมูล Java เป็น SQL ตาม default mapping ตารางเปรียบเทียบ: SQLJDBC/Java VARCHARjava.lang.String CHARjava.lang.String LONGVARCHARjava.lang.String BITboolean NUMERICjava.math.BigDecimal TINYINTbyte SMALLIN
ResultSetMetaData ให้ข้อมูลเกี่ยวกับ ResultSet object ที่ได้ เช่น จำนวนคอลัมน์, ชื่อคอลัมน์, ชนิดข้อมูล, ชื่อตาราง ฯลฯ เมธอดสำคัญของ ResultSetMetaData: เมธอดคำอธิบาย getColumnCount()ดึงจำนวนคอลัมน์ใน ResultSet ปัจจุบัน getColumnLabel()ดึงชื่อคอลัมน์ที่แนะนำสำหรับใช้แสดง getColumnName()ดึงชื่อคอ
สามารถ lock แถว, ชุดแถว, ตาราง, tablespace ได้ ข้อมูลที่ lock ไม่สามารถเปลี่ยนแปลงได้ ประเภท locking ใน JDBC: Row and Key Locks: lock แถวเฉพาะ ใช้เพื่อ concurrency Page Locks: lock หน้า (page) เมื่อแถวเปลี่ยน จะ lock หน้าทั้งหมดที่เก็บแถวนั้น ใช้ตอนอัปเดตแถวจำนวนมาก Table Locks: lock ตารางทั้งหมด
การ commit บันทึกการเปลี่ยนแปลงทั้งหมดจนถึงจุดนั้น ใช้เมธอด commit() และย้อนกลับได้ด้วย rollback() บางฐานข้อมูล auto-commit โดยอัตโนมัติ แต่จัดการ transaction เองต้องปิด auto-commit เมธอด setAutoCommit() ของ Connection interface รับค่า boolean: true = เปิด auto-commit false = ปิด auto-commit (จัดก
มี 2 ประเภท คือ Forward only และ Bidirectional Forward only ResultSet: cursor เคลื่อนที่ได้เพียงทิศทางเดียว เป็นค่าเริ่มต้นของ JDBC ใช้ next() วนลูป while(rs.next()) { } ตัวอย่าง Forward Only ตาราง dataset: +--------------+-----------+ | mobile_brand | unit_sale | +--------------+-----------+ | Iph
SQLException เกิดได้ทั้งใน driver และ database เมื่อเกิด exception จะส่ง object SQLException ไปที่ catch clause มีเมธอดดังนี้: เมธอดคำอธิบาย getErrorCode()ดึงรหัสข้อผิดพลาดที่เกี่ยวข้อง getMessage()ดึงข้อความ error จาก JDBC driver หรือ Oracle error number/message getSQLState()ดึง XOPEN SQLstate
เมธอด next() ของ ResultSet interface เคลื่อน pointer ไปแถวถัดไป คืนค่า boolean ใช้ใน while loop วนลูป: while(rs.next()) { } ดึงค่าคอลัมน์แต่ละแถว ResultSet มีเมธอด getter (getXXX()) 2 รูปแบบ: getXXX(int columnIndex): รับ index คอลัมน์ คืนค่า getXXX(String columnLabel): รับชื่อคอลัมน์ คืนค่า เลือก
ความแตกต่างระหว่าง RowSet และ ResultSet: ResultSetRowSet เชื่อมต่อฐานข้อมูลตลอดเวลาเชื่อมต่อ/ตัดการเชื่อมต่อได้ serialize ไม่ได้serialize ได้ ส่งผ่าน network ไม่ได้ส่งผ่าน network ได้ ไม่ใช่ JavaBean objectสร้างด้วย executeQuery()เป็น JavaBean objectสร้างด้วย RowSetProvider.newFactory().createJ
ข้อดีของ Stored Procedures: คอมไพล์และเก็บไว้แล้ว เรียกใช้ตอบสนองเร็ว รวมคำสั่ง SQL ที่ต้องการใน procedure เดียว รันครั้งเดียวจบ รันบน database server ที่เร็วกว่า client เหมาะกับคำสั่งซับซ้อน ลดซ้ำโค้ด ใช้ฟังก์ชัน SQL เพิ่มเติมได้ เช่น เรียก stored functions คอมไพล์ครั้งเดียว ใช้ในหลายแอปพลิเคชัน
RowSet เป็น wrapper ของ ResultSet object สามารถเชื่อมต่อ, ตัดการเชื่อมต่อจากฐานข้อมูล และ serialize ได้ รักษาสถานะ JavaBean component ส่งผ่าน network ได้ โดยค่าเริ่มต้น scrollable และ updatable ใช้ทำให้ ResultSet ธรรมดา scrollable และ updatable ได้ สร้าง RowSet ด้วย: RowSetProvider.newFactory().cre
เพื่ออัปเดตข้อมูลใน ResultSet ต้องสร้าง Statement ด้วย result set type updatable: // Creating a Statement object Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); ResultSet interface มีเมธอด updateXXX() คล้าย getXXX()/setXXX() รับ index หรือ column
เรียก SQL stored procedures ด้วยอินเทอร์เฟซ CallableStatement ซึ่งรองรับ input parameters, output parameters หรือทั้งคู่ สร้าง CallableStatement object ด้วยเมธอด prepareCall() ของ Connection interface รับสตริงคำสั่งเรียก procedure คืน CallableStatement object สมมติมี procedure ชื่อ myProcedure: //
ในตอนท้ายของโปรแกรม JDBC ควรปิดการเชื่อมต่อฐานข้อมูลอย่างชัดเจนด้วยเมธอด close() เพื่อจบ session แม้ Java garbage collector จะปิดให้อัตโนมัติเมื่อทำความสะอาด object ที่ไม่ได้ใช้ แต่การพึ่งพา garbage collection ในการเขียนโปรแกรมฐานข้อมูลเป็น bad practice ควรปิด connection เองเสมอ ใช้ finally block เ
เมื่อใช้ Statement object รันคำสั่ง INSERT ซ้ำๆ ทุกครั้งจะคอมไพล์และรันคำสั่งทั้งหมดใหม่ แม้โครงสร้างคำสั่งเหมือนกัน แค่ค่าที่เปลี่ยน Prepared statement เป็น precompiled statement คอมไพล์คำสั่งไว้ในฐานข้อมูล ใช้ placeholder (?) แทนค่า ส่งค่าเข้ามาในภายหลัง ดังนั้นหลีกเลี่ยงการคอมไพล์และรันคำสั่งซ้ำ
ข้อดีของ PreparedStatement: หลีกเลี่ยงการคอมไพล์และรันคำสั่งซ้ำ ทำให้ PreparedStatement ทำงานเร็วกว่า รองรับการ insert ข้อมูลชนิดขั้นสูง เช่น BLOB, CLOB, OBJECT ได้ง่ายด้วย setter methods ป้องกัน SQL Injection ได้ เนื่องจากใช้ setter methods ตั้งค่า ไม่ต้องต่อสตริงคำสั่ง ข้อจำกัดของ PreparedState
Stored procedures คือโปรแกรมย่อย (sub routines) หรือชุดคำสั่ง SQL ที่เก็บไว้ใน SQL catalog แอปพลิเคชันที่เข้าถึงฐานข้อมูลเชิงสัมพันธ์ (Java, Python, PHP ฯลฯ) เรียกใช้ได้ Stored procedures มีพารามิเตอร์ IN และ OUT หรือทั้งคู่ อาจคืน result sets (ถ้าใช้ SELECT) และอาจคืนหลาย result-sets ตัวอย่าง ตารา
เหมือน Stored Procedures สามารถสร้าง Function ในฐานข้อมูลและเก็บไว้ได้ รูปแบบสร้าง Function (MySQL) CREATE FUNCTION Function_Name(input_arguments) RETURNS output_parameter BEGIN declare variables; statements ... return data_type; END ตัวอย่าง สมมติตาราง Emp มีข้อมูล: +--------+---------
ความแตกต่างหลักระหว่าง Functions และ Procedures: FunctionsProcedures มี return type และคืนค่าไม่มี return type แต่คืนค่าผ่าน OUT parameters ใช้ไม่ได้กับคำสั่ง DML (INSERT, UPDATE, DELETE) ใช้ได้แค่ SELECTใช้คำสั่ง DML ได้ เช่น INSERT, UPDATE, SELECT ฯลฯ ไม่รองรับ output parametersรองรับทั้ง inp
อินเทอร์เฟซ ResultSet ใน JDBC แสดงข้อมูลตารางจากคำสั่ง SQL มี cursor ชี้แถวปัจจุบัน เริ่มต้นอยู่ก่อนแถวแรก การเคลื่อน pointer ใน ResultSet เมธอด next() ของ ResultSet interface เคลื่อน pointer ไปแถวถัดไป คืนค่า boolean: true ถ้ามีแถวถัดไป, false ถ้าไม่มี ใช้ใน while loop เพื่อวนลูป: while(rs.next()