ประเภทของข้อความ
เราได้เห็นอินเท อร์เฟซคำสั่งที่ง่ายที่สุดแล้ว และแม้ว่าจะค่อนข้างเหมาะกับงาน แต่ก็ไม่เหมาะสำหรับคำถามที่ซับซ้อน ในบางแหล่งมีการแสดงความคิดเห็นว่าไม่จำเป็นต้องใช้Statementเลย - อินเทอร์เฟซที่ซับซ้อนและใช้งานได้หลากหลายนั้นเหมาะสมแทน
- งบที่เตรียมไว้
- CallableStatement
คำถามที่สมเหตุสมผลเกิดขึ้น - เหตุใดจึงต้องใช้อินเทอร์เฟซเหล่านี้ ลองคิดดูสิ
อันดับแรก เราจะดูที่ อินเทอร์เฟ ซ PreparedStatementและคุณลักษณะอื่นๆ ของ JDBC เราจะหันไปใช้ อินเทอร์เฟซ CallableStatementในภายหลัง - การใช้งานอย่างแรกนั้นไม่ธรรมดาและประการที่สองหลังจากพิจารณาทุกอย่างแล้วการสนทนาก็สั้นลงแล้ว
![](https://cdn.codegym.cc/images/article/e8812bce-d724-4019-a6c0-3901cfca155c/512.jpeg)
นอกจากนี้PreparedStatementยังเป็นความช่วยเหลือที่ดีเยี่ยมจากแนวทางยอดนิยมในการแฮ็กฐานข้อมูลที่เรียกว่า SQL Injection
แต่เพิ่มเติมในภายหลัง
งบที่เตรียมไว้
หากคุณพยายามแปลชื่อPreparedStatementคุณจะได้บางอย่างเช่น "prepared statement" คำที่สำคัญที่สุดในที่นี้คือ "เตรียมพร้อม" “การเตรียมพร้อม” คืออะไร?
ก่อนที่เราจะพิจารณาปัญหานี้ ฉันขอเสนอให้ดูประเด็นที่ค่อนข้างสำคัญจากมุมมองของความสะดวกสบาย ซึ่งเกิดขึ้นบ่อยมาก ดังนั้น ในบางแอปพลิเคชัน เราจำเป็นต้องแทรกข้อมูลผู้ติดต่อลงในตารางผู้ติดต่อ ในการทำเช่นนี้ เราต้องเตรียมแบบสอบถามดังนี้:
INSERT INTO JC_CONTACT (FIRST_NAME, LAST_NAME, PHONE, EMAIL) VALUES (‘Harry’,'Potter','+79112345678','harry@example.com);
เมื่อมองแวบแรกดูเหมือนว่าทุกอย่างจะไม่ยากและน่ากลัว เราจำเป็นต้องเขียนรหัสที่จะรวบรวมสตริงที่เราต้องการจากพารามิเตอร์: ชื่อ, นามสกุล, ที่อยู่และหมายเลขโทรศัพท์ คุณเพียงแค่ต้องจำไว้ว่าข้อมูลสตริงทั้งหมดต้องล้อมรอบด้วยอักขระเครื่องหมายคำพูดตัวเดียว
หากเราทำสิ่งนี้ในฟังก์ชันแยกต่างหาก เราจะได้สิ่งนี้:
public String buildInsert(String firstName,, String lastName, String phone, String email) {
String sql = "INSERT INTO JC_CONTACT (FIRST_NAME, LAST_NAME, PHONE, EMAIL) “+
”VALUES ('" + firstName + "','" + lastName + "','" + phone + "','" + email + ")";
return sql;
}
เราส่งชื่อ นามสกุล หมายเลขโทรศัพท์ และที่อยู่ไปยังฟังก์ชันพารามิเตอร์ในแบบฟอร์ม จากนั้นเราสร้างสตริงการสืบค้น SQL คำคมเสียภาพเล็กน้อย แต่จนถึงตอนนี้ก็ไม่น่ากลัว
ตกลงแล้วตัวเลขล่ะ? พวกเขาไม่จำเป็นต้องล้อมรอบด้วยเครื่องหมายคำพูด Opanki ในกรณีหนึ่งคุณต้องการใบเสนอราคา อีกกรณีหนึ่งไม่ต้องการ สถานการณ์เริ่มซับซ้อนขึ้น
ทีนี้มาเพิ่มอีกหนึ่งปัญหา - จะเกิดอะไรขึ้นถ้ามีเครื่องหมายคำพูดธรรมดา (และไม่มีแม้แต่อันเดียว) ในสตริง ก่อนอื่นคุณต้องมองหาใบเสนอราคาดังกล่าวและประมวลผล มาจ้าาาา. อย่างใดเราเริ่มรู้สึกอึดอัด
หากตอนนี้เราเพิ่มการประมวลผลวันที่ งานจะน่าเบื่อโดยสิ้นเชิง - คุณต้องทำงานจำนวนมาก โดยทั่วไปวันที่ไม่เป็นที่พอใจ - เซิร์ฟเวอร์ SQL ที่แตกต่างกันยอมรับรูปแบบที่แตกต่างกันสำหรับวันที่
แล้วเราเห็นอะไร? หากเราจำเป็นต้องใช้พารามิเตอร์ในแบบสอบถาม การสร้างแบบสอบถามด้วยตนเองจะไม่เป็นที่พอใจมากนัก และไม่เป็นที่พอใจเท่านั้น - ฉันจะบอกว่าน่าเบื่อด้วยซ้ำ มีหลายกรณีที่ต้องพิจารณา และนี่เป็นงานที่น่าเบื่อมาก โดยพื้นฐานแล้ว มีไว้สำหรับกรณีดังกล่าวที่ มีการเสนออินเท อ ร์เฟซ PreparedStatement
คำขอนี้อนุญาตให้คุณทำสองสิ่ง:
- เตรียมคำขอล่วงหน้าเพื่อระบุสถานที่ที่จะแทนที่พารามิเตอร์
- ตั้งค่าพารามิเตอร์บางประเภท จากนั้นดำเนินการค้นหาด้วยพารามิเตอร์ที่ตั้งค่าไว้แล้ว
ตัวอย่างประโยคที่เตรียมไว้
โครงสร้างสำหรับPreparatedStatementสำหรับตัวเลือกการตั้งค่าพารามิเตอร์ของเราจะมีลักษณะดังนี้:
// Example variables
String firstName = "Harry";
String lastName = "Potter";
String phone = "+12871112233";
String email = "harry@example.com";
// Request with indication of places for parameters in the form of "?"
String sql = "INSERT INTO JC_CONTACT (FIRST_NAME, LAST_NAME, PHONE, EMAIL) VALUES (?, ?, ?, ?)";
// Create a request. The con variable is an object of type Connection
PreparedStatement stmt = con.prepareStatement(sql);
// Set parameters
stmt.setString(1, firstName);
stmt.setString(2, lastName);
stmt.setString(3, phone);
stmt.setString(4, email);
// Execute the request
stmt.executeUpdate();
อย่างที่คุณเห็นทุกอย่างค่อนข้างง่าย
ประการแรก เมื่อเขียนแบบสอบถาม SQL ตำแหน่งที่ต้องแทนที่พารามิเตอร์จะถูกเขียนด้วยเครื่องหมายคำถาม - "?"
ประการที่สอง คำขอถูกสร้างขึ้นโดยการเรียกcon.prepareStatement( )
ประการที่สาม การตั้งค่าพารามิเตอร์ต้องผ่านการแสดงจำนวนและค่า โปรดทราบว่าจำนวนของพารามิเตอร์เริ่มต้นจาก 1 ไม่ใช่จาก 0 เนื่องจากเราคุ้นเคยเมื่อทำงานกับอาร์เรย์และคอลเลกชัน
อินเทอร์เฟซPreparedStatementมีเมธอดสำหรับการตั้งค่าสตริง — setString ( )สำหรับการตั้งค่าตัวเลข — setInt() , setLong() , setDouble()สำหรับการตั้งค่าวันที่ — setDate() และประเภทที่ซับซ้อนมากขึ้นสามารถดูได้ในเอกสารประกอบ
ประการที่สี่ การเรียกไปยังstmt.executeUpdate()ถูกเรียกใช้งานแล้วโดยไม่ระบุสตริงการสืบค้น
ฉันขอแนะนำให้ทำความรู้จักกับโปรแกรม PreparedStatementซึ่งเป็นเครื่องมือที่มีประสิทธิภาพมาก
แต่เพิ่มเติมในภายหลัง