iBATIS (MyBatis) একটি শক্তিশালী SQL ম্যাপিং ফ্রেমওয়ার্ক যা SQL এবং Java objects-এর মধ্যে সম্পর্ক স্থাপন করে। Dynamic SQL হল একটি শক্তিশালী বৈশিষ্ট্য যা iBATIS/MyBatis এ ব্যবহার করা হয়, যা SQL কুয়েরিগুলিকে চলাকালীন সময়ে তৈরি করার সুযোগ দেয়। এই পদ্ধতিটি conditional, optional, বা parameterized কুয়েরি তৈরির ক্ষেত্রে বিশেষভাবে উপকারী, এবং এটি বিভিন্ন পরিস্থিতিতে complex SQL queries তৈরি করতে সাহায্য করে।
Dynamic SQL এর মাধ্যমে, আপনি SQL কুয়েরি তৈরি করতে পারেন যা কোড রান করার সময় ভিন্ন ভিন্ন শর্তাবলী (conditions) অনুযায়ী পরিবর্তিত হতে পারে।
iBATIS/MyBatis Dynamic SQL
iBATIS বা MyBatis এ Dynamic SQL তৈরির জন্য বিভিন্ন XML tags এবং annotations ব্যবহার করা যায়। এখানে কিছু সাধারণ কৌশল এবং পদ্ধতি দেওয়া হয়েছে।
1. Using <if> and <where> for Dynamic SQL
a) <if> Tag:
<if> ট্যাগের সাহায্যে আপনি SQL কুয়েরির অংশ যোগ বা বাদ করতে পারেন, যা নির্ভর করে কিছু শর্তের উপর। এটি খুবই উপকারী যখন কিছু কন্ডিশনাল লজিক প্রয়োগ করতে হয়, যেমন WHERE ক্লজের মধ্যে কিছু অংশ যোগ করা।
Example: Using <if> Tag in SQL
<select id="selectStudent" resultType="com.example.Student">
SELECT * FROM student
<where>
<if test="id != null">
AND id = #{id}
</if>
<if test="name != null">
AND name = #{name}
</if>
<if test="course != null">
AND course = #{course}
</if>
</where>
</select>
Explanation:
<if test="id != null">: যদিidnull না হয়, তবেAND id = #{id}অংশটি SQL কুয়েরিতে যোগ হবে।<where>: এটিANDবাORএর মতো যুক্তি যোগ করার জন্য ব্যবহৃত হয়। এটি ডাইনামিকভাবে কুয়েরি জেনারেট করতে সাহায্য করে এবং সঠিকভাবে SQL ফর্ম্যাটিং নিশ্চিত করে।
2. Using <choose>, <when>, and <otherwise> for Conditional SQL
<choose>, <when>, and <otherwise> ট্যাগগুলি SQL কুয়েরির মধ্যে switch-case বা if-else শর্তাবলী তৈরি করতে ব্যবহৃত হয়। এটি ব্যবহারকারী থেকে multiple conditions অনুযায়ী সঠিক SQL কুয়েরি নির্বাচন করতে সাহায্য করে।
Example: Using <choose> for Conditional Logic
<select id="selectStudentByCourse" resultType="com.example.Student">
SELECT * FROM student
<where>
<choose>
<when test="course != null">
AND course = #{course}
</when>
<when test="name != null">
AND name = #{name}
</when>
<otherwise>
AND id > 0
</otherwise>
</choose>
</where>
</select>
Explanation:
<choose>: একাধিক শর্তের মধ্যে থেকে একটি শর্ত সঠিক হলে তা কার্যকর হবে, যদি কোন শর্ত পূর্ণ না হয় তবে<otherwise>ব্লকটি কার্যকর হবে।<when>: এটি if-else শর্তের মতো কাজ করে, যেখানে প্রথমtrueশর্তটি কার্যকর হবে।
3. Using <trim> for Removing Unwanted SQL Parts
<trim> ট্যাগটি বিশেষভাবে leading এবং trailing SQL অংশগুলি (যেমন AND বা OR) সরাতে ব্যবহৃত হয়। এটি খুবই উপকারী যখন আপনি একাধিক কন্ডিশনাল অপারেটর তৈরি করেন এবং অবাঞ্ছিত AND বা OR অপারেটরগুলি বাদ দিতে চান।
Example: Using <trim> to Remove Leading and Trailing SQL Parts
<select id="selectStudent" resultType="com.example.Student">
SELECT * FROM student
<trim prefix="WHERE" suffixOverrides="AND">
<if test="id != null">
AND id = #{id}
</if>
<if test="name != null">
AND name = #{name}
</if>
<if test="course != null">
AND course = #{course}
</if>
</trim>
</select>
Explanation:
<trim prefix="WHERE" suffixOverrides="AND">: এটি কুয়েরি শুরুতেWHEREযোগ করবে, এবং শেষেANDবাদ দিবে।suffixOverrides="AND": যদি কুয়েরির শেষেANDথাকে, তাহলে তা সরিয়ে দেওয়া হবে।
4. Using <foreach> for Iterating Collections (Lists or Arrays)
<foreach> ট্যাগটি ব্যবহারকারী ইনপুটের জন্য list বা array ব্যবহার করার জন্য উপকারী। আপনি এটি একটি ইনপুট হিসাবে একটি list of values ব্যবহার করতে পারেন এবং IN SQL কুয়েরি তৈরি করতে পারেন।
Example: Using <foreach> to Handle Collections
<select id="selectStudentsByIds" resultType="com.example.Student">
SELECT * FROM student
WHERE id IN
<foreach item="id" collection="ids" open="(" separator="," close=")">
#{id}
</foreach>
</select>
Explanation:
<foreach>: এটি id গুলোর একটি list বা array নিয়ে SQL কুয়েরির IN ক্লজ তৈরি করে।separator=",": এটি কুয়েরির মধ্যে আইটেমগুলির মধ্যে কমা (,) সেপারেটর হিসেবে ব্যবহার করে।
5. Using @SelectProvider, @InsertProvider, @UpdateProvider, and @DeleteProvider for Dynamic SQL in Annotations (MyBatis)
MyBatis-এ আপনি annotations ব্যবহার করে dynamic SQL তৈরি করতে পারেন, যেখানে SQL কুয়েরি তৈরি করার জন্য প্রোভাইডার ব্যবহার করা হয়।
Example: Using Annotations for Dynamic SQL
import org.apache.ibatis.annotations.SelectProvider;
import org.apache.ibatis.annotations.UpdateProvider;
public interface StudentMapper {
@SelectProvider(type = StudentSqlProvider.class, method = "selectStudent")
Student selectStudent(int id);
@UpdateProvider(type = StudentSqlProvider.class, method = "updateStudent")
void updateStudent(Student student);
}
import org.apache.ibatis.jdbc.SQL;
public class StudentSqlProvider {
public String selectStudent(final int id) {
return new SQL() {{
SELECT("*");
FROM("student");
WHERE("id = #{id}");
}}.toString();
}
public String updateStudent(final Student student) {
return new SQL() {{
UPDATE("student");
SET("name = #{name}, course = #{course}");
WHERE("id = #{id}");
}}.toString();
}
}
Explanation:
@SelectProvider: এটিStudentSqlProviderক্লাসেরselectStudentমেথড থেকে SQL কুয়েরি নিয়ে আসে।@UpdateProvider: এটিStudentSqlProviderক্লাসেরupdateStudentমেথড থেকে SQL আপডেট কুয়েরি তৈরি করে।
6. Combining Dynamic SQL for Complex Queries
এখন আমরা একটি উদাহরণ দেখব যেখানে ডাইনামিক SQL ব্যবহার করে একটি complex SQL query তৈরি করা হবে, যাতে SELECT, WHERE, JOIN এবং ORDER BY কন্ডিশনগুলির মতো অংশ যুক্ত করা হয়।
<select id="selectStudents" resultType="com.example.Student">
SELECT s.id, s.name, s.course
FROM student s
<join>
<if test="enrolled != null">
JOIN enrollment e ON e.student_id = s.id
</if>
</join>
<where>
<if test="name != null">
AND s.name = #{name}
</if>
<if test="course != null">
AND s.course = #{course}
</if>
</where>
<orderBy>
<if test="order != null">
ORDER BY s.name
</if>
</orderBy>
</select>
Explanation:
<join>: এটি ডাইনামিকালি JOIN যোগ করে যদিenrolledপরামিতি থাকে।<where>: কন্ডিশন যোগ করার জন্যWHEREক্লজ ব্যবহার করা হয়।<orderBy>:ORDER BYক্লজ যোগ করা হয় যদিorderপরামিতি দেওয়া থাকে।
Dynamic SQL iBATIS/MyBatis-এ একটি গুরুত্বপূর্ণ বৈশিষ্ট্য যা SQL কোয়েরি তৈরির জন্য অত্যন্ত কার্যকরী। <if>, <choose>, <foreach>, <trim>, এবং <where> ট্যাগগুলির মাধ্যমে আপনি SQL কুয়েরির অংশগুলো ডাইনামিকভাবে যোগ করতে পারেন এবং জটিল কুয়েরি তৈরি করতে সক্ষম হন। এই পদ্ধতিগুলি বিশেষভাবে উপকারী যখন conditional বা parameterized SQL queries তৈরি করতে হয়। MyBatis (iBATIS) ব্যবহার করে আপনি SQL কোয়েরিগুলিকে আরও দক্ষভাবে এবং কাস্টমাইজযোগ্যভাবে তৈরি করতে পারবেন।
Read more