PreparedStatement হলো Statement-এর সাব-ইন্টারফেস, যা প্রিকম্পাইল্ড (precompiled) প্যারামিটারাইজড SQL কোয়েরি রিপ্রেজেন্ট করে। একই কোয়েরি বারবার এক্সিকিউট করতে পারেন ভিন্ন ভিন্ন প্যারামিটার দিয়ে।
সুবিধা
- পারফরম্যান্স: কোয়েরি একবার কম্পাইল হয়, বারবার এক্সিকিউট হয়।
- SQL ইনজেকশন প্রотеাকশন: প্যারামিটার আলাদা পাঠানো হয়, স্ট্রিং কনক্যাটেনেশন লাগে না।
- রিডেবিলিটি: কোড পরিষ্কার।
PreparedStatement তৈরি
Connection.prepareStatement() মেথড:
String query = "INSERT INTO Employee(Name, Salary, Location) VALUES (?, ?, ?)"; PreparedStatement pstmt = con.prepareStatement(query);
এখানে ? প্লেসহোল্ডার। ডেটাবেস কোয়েরি কম্পাইল করে রেখে দেয়।
প্যারামিটার সেট করা
সেটার মেথড: setInt(), setString(), setDate(), setDouble() ইত্যাদি। আর্গুমেন্ট: প্লেসহোল্ডার ইন্ডেক্স (১-ভিত্তিক) এবং মান।
pstmt.setString(1, "Amit"); pstmt.setInt(2, 30000); pstmt.setString(3, "Hyderabad"); pstmt.setString(1, "Kalyan"); pstmt.setInt(2, 40000); pstmt.setString(3, "Vishakhapatnam"); pstmt.setString(1, "Renuka"); pstmt.setInt(2, 50000); pstmt.setString(3, "Delhi"); pstmt.setString(1, "Archana"); pstmt.setInt(2, 15000); pstmt.setString(3, "Mumbai");
এক্সিকিউশন মেথড
execute()- যেকোনো SQL, রিটার্নbooleanexecuteQuery()- SELECT, রিটার্নResultSetexecuteUpdate()- INSERT/UPDATE/DELETE, রিটার্নint(row count)
সম্পূর্ণ উদাহরণ
String query = "INSERT INTO Employees(Name, Salary, Location) VALUES (?, ?, ?)";
PreparedStatement pstmt = con.prepareStatement(query);
pstmt.setString(1, "Amit"); pstmt.setInt(2, 30000); pstmt.setString(3, "Hyderabad");
pstmt.setString(1, "Kalyan"); pstmt.setInt(2, 40000); pstmt.setString(3, "Vishakhapatnam");
pstmt.setString(1, "Renuka"); pstmt.setInt(2, 50000); pstmt.setString(3, "Delhi");
pstmt.setString(1, "Archana"); pstmt.setInt(2, 15000); pstmt.setString(3, "Mumbai");
int num = pstmt.executeUpdate();
System.out.println("Rows inserted: " + num);
Connection established...... Number of rows inserted: 1
নোট: উপরের উদাহরণে প্রতিবার এক্সিকিউট করা হয়নি, শুধু শেষ সেটের মানই ইনসার্ট হয়েছে (১ রো)। সঠিকভাবে করতে হলে প্রতিটি সেটের পর addBatch() কল করে শেষে executeBatch() করুন। ব্লক বা ব্যাচ এক্সিকিউশন খুব দ্রুত।
ব্যাচ প্রসেসিং উদাহরণ
pstmt.setString(1, "Amit"); pstmt.setInt(2, 30000); pstmt.setString(3, "Hyderabad"); pstmt.addBatch(); pstmt.setString(1, "Kalyan"); pstmt.setInt(2, 40000); pstmt.setString(3, "Vishakhapatnam"); pstmt.addBatch(); // ... more int[] counts = pstmt.executeBatch(); // সবই একসাথে এক্সিকিউট