Prepared Statements হলো JDBC (Java Database Connectivity)-তে SQL ক্যোয়ারি এক্সিকিউট করার একটি নিরাপদ এবং কার্যকর পদ্ধতি। এটি SQL ক্যোয়ারি এবং তার ইনপুট প্যারামিটারগুলো আলাদা করে কাজ করে, যা সিকিউরিটি ও পারফরমেন্সে উপকারিতা নিয়ে আসে। সাধারণভাবে, Prepared Statements ব্যবহার করা হয় SQL ইনজেকশন প্রতিরোধ করতে এবং একাধিকবার একই ক্যোয়ারি এক্সিকিউট করার সুবিধা প্রদান করতে।
1. Prepared Statements কী?
Prepared Statement হলো একটি বিশেষ ধরনের SQL স্টেটমেন্ট যা তৈরি করা হয় এবং পরে একাধিক বার এক্সিকিউট করা যায়। এটি ডেটাবেসে SQL ক্যোয়ারি পাঠানোর আগে সেই ক্যোয়ারি প্যারামিটারাইজড হয়। এই পদ্ধতির মাধ্যমে ক্যোয়ারিতে প্লেসহোল্ডার (?) ব্যবহার করা হয়, যেখানে পরে ডায়নামিকভাবে ইনপুট ভ্যালু সেট করা হয়।
উদাহরণস্বরূপ:
SELECT * FROM Employees WHERE Age > ? AND Name = ?
এখানে ? দুটি প্লেসহোল্ডার যা পরে Java কোডে প্যারামিটার দিয়ে পূর্ণ করা হবে। এই পদ্ধতিতে SQL ক্যোয়ারি স্ট্রিং সরাসরি যুক্ত না হয়ে একটি স্টেটমেন্ট অবজেক্টের মাধ্যমে SQL ইনপুট দেওয়া হয়।
2. Prepared Statements ব্যবহার করার উপকারিতা
SQL ইনজেকশন থেকে রক্ষা
Prepared Statements SQL ইনজেকশন প্রতিরোধ করতে সহায়ক। যখন আপনি SQL ক্যোয়ারি তৈরি করেন, তখন আপনি ? প্লেসহোল্ডার ব্যবহার করেন, যার মাধ্যমে ইউজার ইনপুট সরাসরি SQL ক্যোয়ারিতে সংযুক্ত করা হয় না। এতে করে আক্রমণকারী কোনো অবাঞ্ছিত কোড ইনজেক্ট করার সুযোগ পায় না।
উদাহরণ:
// ভুল (SQL ইনজেকশন হতে পারে)
String query = "SELECT * FROM Users WHERE username = '" + username + "' AND password = '" + password + "'";
// সঠিক (PreparedStatement ব্যবহার করে SQL ইনজেকশন প্রতিরোধ)
String query = "SELECT * FROM Users WHERE username = ? AND password = ?";
PreparedStatement stmt = conn.prepareStatement(query);
stmt.setString(1, username);
stmt.setString(2, password);
এখানে, username এবং password ব্যবহারকারীর ইনপুট, যা প্লেসহোল্ডারে স্থাপন করা হয়। কোনো বিশেষ অক্ষর বা কোডের মাধ্যমে আক্রমণকারী SQL ইনজেকশন করতে পারবে না।
পারফরমেন্স বৃদ্ধি
Prepared Statements একবার কম্পাইল করা হয় এবং তার পরবর্তী একাধিকবার একই ক্যোয়ারি এক্সিকিউট করার সময়, ডেটাবেসে পুনরায় কম্পাইল হতে হয় না। এটি বিশেষভাবে গুরুত্বপূর্ণ যখন একই ক্যোয়ারি একাধিকবার চলতে থাকে, যেমন: Batch Processing-এ। এতে করে কার্যক্ষমতা বৃদ্ধি পায়।
কোডের রিডেবিলিটি এবং রক্ষণাবেক্ষণ সহজ
Prepared Statement কোডের মধ্যে SQL স্ট্রিংকে আলাদা রাখে, যা কোডকে আরও পরিষ্কার ও সহজ করে তোলে। এর ফলে কোড লেখা এবং রক্ষণাবেক্ষণ সহজ হয়।
3. Prepared Statements এর সাথে কাজ করা
Prepared Statement ব্যবহার করার জন্য, প্রথমে আপনি Connection অবজেক্ট থেকে prepareStatement() মেথড ব্যবহার করে একটি PreparedStatement অবজেক্ট তৈরি করেন। এরপর, সেই স্টেটমেন্টে প্লেসহোল্ডারে মান সেট করে ক্যোয়ারি এক্সিকিউট করা হয়।
উদাহরণ:
import java.sql.*;
public class PreparedStatementExample {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
// ড্রাইভার লোড করা
Class.forName("com.mysql.cj.jdbc.Driver");
// ডেটাবেস সংযোগ স্থাপন
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/TestDB", "root", "password");
// PreparedStatement তৈরি
String sql = "SELECT * FROM Employees WHERE Age > ? AND Name = ?";
pstmt = conn.prepareStatement(sql);
// প্লেসহোল্ডারে মান সেট করা
pstmt.setInt(1, 30); // প্রথম প্লেসহোল্ডারে ৩০ সেট করা
pstmt.setString(2, "John"); // দ্বিতীয় প্লেসহোল্ডারে "John" সেট করা
// ক্যোয়ারি এক্সিকিউট করা
rs = pstmt.executeQuery();
// রেজাল্ট প্রসেস করা
while (rs.next()) {
int id = rs.getInt("ID");
String name = rs.getString("Name");
int age = rs.getInt("Age");
System.out.println("ID: " + id + ", Name: " + name + ", Age: " + age);
}
} catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
} finally {
try {
// সংযোগ বন্ধ করা
if (rs != null) rs.close();
if (pstmt != null) pstmt.close();
if (conn != null) conn.close();
} catch (SQLException se) {
se.printStackTrace();
}
}
}
}
এই উদাহরণে:
?প্লেসহোল্ডার দিয়ে SQL ক্যোয়ারি তৈরি করা হয়েছে।setInt()এবংsetString()মেথড ব্যবহার করে প্লেসহোল্ডারে মান দেওয়া হয়েছে।executeQuery()মেথড দিয়ে ক্যোয়ারি এক্সিকিউট করা হয়েছে এবং রেজাল্ট প্রসেস করা হয়েছে।
4. Prepared Statements এর বিভিন্ন বৈশিষ্ট্য
প্যারামিটার টাইপ নির্ধারণ
PreparedStatement এর মাধ্যমে আপনি শুধু মানই প্রদান করেন না, বরং মানের টাইপও নির্ধারণ করেন। যেমন, setInt(), setString(), setDate() ইত্যাদি ব্যবহার করে আপনি মানের ডেটা টাইপ নির্ধারণ করতে পারেন।
Multiple Query Execution (Batch Processing)
PreparedStatement ব্যবহার করে আপনি একাধিক ক্যোয়ারি একযোগে রান করাতে পারেন, যা পারফরম্যান্স উন্নত করতে সাহায্য করে।
String sql = "INSERT INTO Employees (Name, Age, Address) VALUES (?, ?, ?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
// একাধিক ইনসার্ট
pstmt.setString(1, "Bruce Wayne");
pstmt.setInt(2, 35);
pstmt.setString(3, "Wayne Manor");
pstmt.addBatch();
pstmt.setString(1, "Clark Kent");
pstmt.setInt(2, 33);
pstmt.setString(3, "Metropolis");
pstmt.addBatch();
// ব্যাচ এক্সিকিউট করা
pstmt.executeBatch();
এই কোডে:
- একাধিক
INSERTক্যোয়ারি একযোগে এক্সিকিউট করার জন্যaddBatch()এবংexecuteBatch()ব্যবহার করা হয়েছে।
সারাংশ
Prepared Statements হলো নিরাপদ, কার্যকর এবং পারফরম্যান্স-বান্ধব উপায় যেটি SQL ক্যোয়ারি তৈরি এবং এক্সিকিউট করতে সাহায্য করে। এর মাধ্যমে SQL ইনজেকশন প্রতিরোধ করা সম্ভব, কোড রিডেবিলিটি এবং রক্ষণাবেক্ষণ সহজ হয়, এবং একাধিক ক্যোয়ারি একসাথে কার্যকর করার সুবিধা পাওয়া যায়। তাই Java MySQL অ্যাপ্লিকেশন ডেভেলপমেন্টে Prepared Statements ব্যবহার করা উচিত।
Read more