ประเภทของข้อความ

เราได้เห็นอินเท อร์เฟซคำสั่งที่ง่ายที่สุดแล้ว และแม้ว่าจะค่อนข้างเหมาะกับงาน แต่ก็ไม่เหมาะสำหรับคำถามที่ซับซ้อน ในบางแหล่งมีการแสดงความคิดเห็นว่าไม่จำเป็นต้องใช้Statementเลย - อินเทอร์เฟซที่ซับซ้อนและใช้งานได้หลากหลายนั้นเหมาะสมแทน

  • งบที่เตรียมไว้
  • CallableStatement

คำถามที่สมเหตุสมผลเกิดขึ้น - เหตุใดจึงต้องใช้อินเทอร์เฟซเหล่านี้ ลองคิดดูสิ

อันดับแรก เราจะดูที่ อินเทอร์เฟ ซ PreparedStatementและคุณลักษณะอื่นๆ ของ JDBC เราจะหันไปใช้ อินเทอร์เฟซ CallableStatementในภายหลัง - การใช้งานอย่างแรกนั้นไม่ธรรมดาและประการที่สองหลังจากพิจารณาทุกอย่างแล้วการสนทนาก็สั้นลงแล้ว

นอกจากนี้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ซึ่งเป็นเครื่องมือที่มีประสิทธิภาพมาก

แต่เพิ่มเติมในภายหลัง