Java-তে Statement, PreparedStatement, এবং CallableStatement হল JDBC (Java Database Connectivity) এর অংশ, যা Java অ্যাপ্লিকেশনকে ডাটাবেসের সাথে সংযোগ করতে এবং SQL কুয়েরি চালাতে সহায়তা করে। যদিও এই তিনটি ক্লাস একই উদ্দেশ্যে ব্যবহৃত হয়, তবে তাদের মধ্যে কিছু পার্থক্য রয়েছে, যা তাদের ব্যবহারের ক্ষেত্রে গুরুত্বপূর্ণ।
1. Statement
Statement ক্লাসটি JDBC API তে ডিফাইন করা একটি সাধারণ ক্লাস, যা SQL কুয়েরি সরাসরি ডাটাবেসে এক্সিকিউট করার জন্য ব্যবহৃত হয়। এটি সাধারণত এক্সিকিউট করার সময় SQL কুয়েরি প্যারামিটার (parameters) অ্যাসাইন করতে পারবে না এবং এটি ডাইনামিক SQL কোড এক্সিকিউট করার জন্য ব্যবহৃত হয়।
বৈশিষ্ট্য:
- Non-precompiled: SQL কুয়েরি এক্সিকিউট হওয়ার আগে compilation হয় না, এটি রানটাইমে এক্সিকিউট করা হয়।
- SQL Injection: SQL ইনজেকশন প্রতিরোধে এটি নিরাপদ নয় কারণ কুয়েরি স্ট্রিংয়ের মধ্যে ডেটা সরাসরি ইনপুট করা হয়।
- Performance: পুনরায় একাধিক কুয়েরি এক্সিকিউট করতে এটি কম পারফর্ম্যান্সের হতে পারে, কারণ প্রতিটি কুয়েরি রানটাইমে কম্পাইল হয়।
উদাহরণ:
Statement stmt = connection.createStatement();
String sql = "SELECT * FROM users WHERE id = 10";
ResultSet rs = stmt.executeQuery(sql);
2. PreparedStatement
PreparedStatement হল Statement এর একটি সাবক্লাস, যা প্রি-কাম্পাইলড SQL কুয়েরি এবং প্যারামিটারাইজড কুয়েরি সমর্থন করে। এটি SQL injection প্রতিরোধে সাহায্য করে এবং একাধিকবার একই কুয়েরি রান করলেও এটি পারফর্ম্যান্স উন্নত করে।
বৈশিষ্ট্য:
- Precompiled: SQL কুয়েরিটি কম্পাইলড হয়ে যায় এবং এটি ডাটাবেসে একবার প্রক্রিয়া করা হয়, ফলে একাধিকবার কুয়েরি এক্সিকিউট করার সময় কম সময় নেয়।
- SQL Injection Safe: প্যারামিটারাইজড কুয়েরি ব্যবহারের মাধ্যমে SQL ইনজেকশন প্রতিরোধ করা হয়।
- Performance: একাধিকবার একই কুয়েরি এক্সিকিউট করার জন্য উচ্চতর পারফর্ম্যান্স প্রদান করে, কারণ কুয়েরি কম্পাইলড থাকে এবং পুনরায় কম্পাইল করার প্রয়োজন হয় না।
উদাহরণ:
String query = "SELECT * FROM users WHERE id = ?";
PreparedStatement stmt = connection.prepareStatement(query);
stmt.setInt(1, 10); // set the parameter value
ResultSet rs = stmt.executeQuery();
3. CallableStatement
CallableStatement হল PreparedStatement এর একটি সাবক্লাস, যা stored procedure বা stored function এক্সিকিউট করার জন্য ব্যবহৃত হয়। এটি ডাটাবেসে সংরক্ষিত পদ্ধতিকে কল করতে সক্ষম এবং এটি আর্গুমেন্ট পাস করতে পারে, পাশাপাশি আউটপুট রিটার্নও করতে পারে।
বৈশিষ্ট্য:
- Stored Procedures: এটি stored procedures এবং functions কল করার জন্য ব্যবহৃত হয়, যেগুলি ডাটাবেসে আগে থেকেই সংরক্ষিত থাকে।
- Input and Output Parameters: ইনপুট এবং আউটপুট প্যারামিটারসহ SQL কুয়েরি এক্সিকিউট করতে সক্ষম।
- Performance: এটি পুনরায় সংরক্ষিত SQL কোড এক্সিকিউট করার সময় ভালো পারফর্ম্যান্স প্রদান করে, কারণ কোডটি ডাটাবেস সার্ভারে সংরক্ষিত থাকে।
উদাহরণ:
CallableStatement stmt = connection.prepareCall("{call getUserDetails(?, ?)}");
stmt.setInt(1, 10); // set input parameter
stmt.registerOutParameter(2, Types.VARCHAR); // register output parameter
stmt.execute();
String userDetails = stmt.getString(2); // get output parameter
Statement, PreparedStatement, এবং CallableStatement এর মধ্যে পার্থক্য:
| বিষয় | Statement | PreparedStatement | CallableStatement |
|---|---|---|---|
| প্রকার | সাধারণ SQL কুয়েরি এক্সিকিউট করার জন্য ব্যবহৃত। | প্যারামিটারাইজড SQL কুয়েরি এক্সিকিউট করতে ব্যবহৃত। | Stored procedure অথবা function কল করার জন্য ব্যবহৃত। |
| Precompiled | না, রানটাইমে কুয়েরি কম্পাইল হয়। | হ্যাঁ, কুয়েরি আগে থেকেই কম্পাইল করা থাকে। | হ্যাঁ, stored procedure কম্পাইল এবং এক্সিকিউট করা হয়। |
| SQL Injection | SQL ইনজেকশন প্রতিরোধে নিরাপদ নয়। | SQL ইনজেকশন প্রতিরোধে নিরাপদ। | SQL ইনজেকশন প্রতিরোধে নিরাপদ। |
| Performance | একাধিক কুয়েরি এক্সিকিউট করার সময় পারফর্ম্যান্স কম। | একাধিক কুয়েরি এক্সিকিউট করার জন্য দ্রুত, কারণ এটি কম্পাইলড থাকে। | stored procedures এক্সিকিউট করতে ভালো পারফর্ম্যান্স প্রদান করে। |
| Use Case | সাধারণ কুয়েরি যেমন SELECT, INSERT, UPDATE, DELETE | প্যারামিটার সহ কুয়েরি এক্সিকিউট করা, যেমন SELECT কুয়েরি। | Stored procedure, function এবং complex database operations। |
| Input Parameters | পার্স করা যায় না। | হ্যাঁ, প্যারামিটারাইজড কুয়েরি হিসেবে ইনপুট প্যারামিটার নিতে পারে। | ইনপুট ও আউটপুট প্যারামিটার নেয়। |
| Output Parameters | পার্স করা যায় না। | পার্স করা যায় না। | আউটপুট প্যারামিটার নিতে পারে। |
- Statement ব্যবহার করা হয় যখন ডাইনামিক SQL কুয়েরি রান করতে হয় এবং SQL ইনজেকশন সমস্যা নেই।
- PreparedStatement ব্যবহৃত হয় যখন প্যারামিটারাইজড SQL কুয়েরি এক্সিকিউট করতে হয়, যা SQL ইনজেকশন থেকে সুরক্ষা দেয় এবং একাধিক কুয়েরি এক্সিকিউট করতে পারফর্ম্যান্স বাড়ায়।
- CallableStatement ব্যবহার করা হয় যখন stored procedure অথবা stored function এক্সিকিউট করতে হয়, যেখানে ইনপুট এবং আউটপুট প্যারামিটার ব্যবহৃত হয়।
Java তে এই তিনটি ক্লাসের মধ্যে পার্থক্য বোঝা এবং সঠিক প্যাটার্নে তাদের ব্যবহার করার মাধ্যমে একটি নিরাপদ এবং উচ্চ কার্যক্ষম ডেটাবেস অ্যাপ্লিকেশন তৈরি করা সম্ভব।
Read more