iBATIS (বর্তমানে MyBatis নামে পরিচিত) হল একটি powerful persistence framework যা SQL-এ dynamic queries তৈরির জন্য অনেক সুবিধা প্রদান করে। MyBatis-এ dynamic SQL তৈরি করার জন্য , , , এবং ট্যাগ ব্যবহার করা হয়। এগুলোর মাধ্যমে SQL কুয়েরি কোডকে আরও ফ্লেক্সিবল এবং ডাইনামিক করা যায়, যাতে কন্ডিশনাল কোয়েরি তৈরির কাজ সহজ হয়।
এখানে MyBatis তে dynamic SQL ব্যবহারের জন্য কিছু গুরুত্বপূর্ণ ট্যাগ এবং তাদের ব্যবহার দেখানো হবে, যেমন IF, WHERE, CHOOSE, এবং FOREACH।
1. IF Tag
<if> ট্যাগটি একটি কন্ডিশনাল স্টেটমেন্ট হিসেবে কাজ করে। এটি যদি কোনো প্যারামিটার সেট করা থাকে, তখন শুধুমাত্র সেই অংশের SQL কোড কার্যকর হবে।
Example: Using <if> for Conditional SQL
<select id="getEmployeeByConditions" resultType="Employee">
SELECT * FROM employees
<where>
<if test="name != null">
AND name = #{name}
</if>
<if test="email != null">
AND email = #{email}
</if>
</where>
</select>
Explanation:
<if test="name != null">: যদিnameপ্যারামিটারটিnullনা হয়, তবেname = #{name}শর্তটি SQL কুয়েরিতে যুক্ত হবে।<where>:whereব্লকটি এমনভাবে কাজ করে যে এটি শুধুমাত্র প্রয়োজনীয় শর্তগুলির জন্যANDযোগ করে, যাতে ভুলANDকন্ডিশন না আসে।
Usage:
Map<String, Object> params = new HashMap<>();
params.put("name", "John");
params.put("email", "john.doe@example.com");
List<Employee> employees = sqlSession.selectList("getEmployeeByConditions", params);
2. WHERE Tag
<where> ট্যাগটি SQL কুয়েরির WHERE ক্লজে শর্ত যোগ করতে ব্যবহৃত হয়। এটি স্বয়ংক্রিয়ভাবে AND বা OR যুক্ত করে, যাতে কন্ডিশনাল SQL কোড আরও সঠিকভাবে লেখা যায়।
Example: Using <where> for SQL Conditions
<select id="getEmployeeByWhere" resultType="Employee">
SELECT * FROM employees
<where>
<if test="id != null">AND id = #{id}</if>
<if test="name != null">AND name = #{name}</if>
</where>
</select>
Explanation:
<where>: এটি SQL কুয়েরির শুরুতে যোগ হয় এবং ভিতরের শর্তগুলিকেANDদিয়ে যোগ করা হয়। যদি কোন শর্ত না থাকে, তবেWHEREক্লজটি ব্যতিক্রমীভাবে যুক্ত হবে না।
Usage:
Map<String, Object> params = new HashMap<>();
params.put("id", 1);
params.put("name", "John");
List<Employee> employees = sqlSession.selectList("getEmployeeByWhere", params);
3. CHOOSE Tag
<choose> ট্যাগটি একটি if-else কন্ডিশনের মতো কাজ করে। এটি একাধিক শর্তগুলোর মধ্যে প্রথম সত্য শর্তটি নির্বাচিত করে।
Example: Using <choose> for Conditional SQL
<select id="getEmployeeByType" resultType="Employee">
SELECT * FROM employees
<where>
<choose>
<when test="type == 'full-time'">
AND type = 'full-time'
</when>
<when test="type == 'part-time'">
AND type = 'part-time'
</when>
<otherwise>
AND type IS NULL
</otherwise>
</choose>
</where>
</select>
Explanation:
<choose>: এটি একাধিক শর্তের মধ্যে প্রথম সত্য শর্তটি নির্বাচন করবে। প্রথম<when>শর্তটি যদিtrueহয়, তাহলে পরবর্তী শর্তগুলি পরীক্ষা করা হবে না।<otherwise>: এটি একটি ডিফল্ট শর্ত, যা সব শর্ত ফেইল হলে কার্যকর হবে।
Usage:
Map<String, String> params = new HashMap<>();
params.put("type", "full-time");
List<Employee> employees = sqlSession.selectList("getEmployeeByType", params);
4. FOREACH Tag
<foreach> ট্যাগটি একটি লিস্ট বা অ্যারে থেকে ডেটা নিয়ে SQL কুয়েরিতে ডাইনামিক ভাবে ইনপুট হিসেবে ব্যবহৃত হয়, যেমন IN কন্ডিশন।
Example: Using <foreach> for Dynamic SQL in IN Clause
<select id="getEmployeesByIds" resultType="Employee">
SELECT * FROM employees
WHERE id IN
<foreach item="id" collection="ids" open="(" close=")" separator=",">
#{id}
</foreach>
</select>
Explanation:
<foreach>: এটি একটি লুপের মত কাজ করে এবংidsলিস্টের প্রতিটি উপাদানকেINকন্ডিশনে যোগ করে।open="("এবংclose=")": এটি SQL কুয়েরিরINক্লজে()যোগ করে।separator=",": এটি লিস্টের মধ্যে কমা যোগ করে।
Usage:
List<Integer> ids = Arrays.asList(1, 2, 3, 4);
Map<String, Object> params = new HashMap<>();
params.put("ids", ids);
List<Employee> employees = sqlSession.selectList("getEmployeesByIds", params);
5. Combining All Dynamic SQL Tags
আপনি বিভিন্ন ডাইনামিক SQL ট্যাগ যেমন <if>, <choose>, <where>, এবং <foreach> একসাথে ব্যবহার করতে পারেন, যাতে আরও জটিল কুয়েরি তৈরি করা যায়।
Example: Combining All Dynamic SQL Tags
<select id="getEmployeesByConditions" resultType="Employee">
SELECT * FROM employees
<where>
<if test="name != null">AND name = #{name}</if>
<if test="age != null">AND age = #{age}</if>
<choose>
<when test="status == 'active'">
AND status = 'active'
</when>
<when test="status == 'inactive'">
AND status = 'inactive'
</when>
<otherwise>
AND status IS NULL
</otherwise>
</choose>
<if test="ids != null and ids.size() > 0">
AND id IN
<foreach item="id" collection="ids" open="(" close=")" separator=",">
#{id}
</foreach>
</if>
</where>
</select>
Explanation:
<where>: এই অংশটি সমস্ত শর্তের জন্য একটিWHEREক্লজ তৈরি করে এবং অপ্রয়োজনীয়ANDগুলো বাদ দেয়।<if>: নির্দিষ্ট কন্ডিশনের উপর ভিত্তি করে শর্ত যোগ করা হয়।<choose>:statusএর জন্য শর্ত নির্বাচন করা হয়।<foreach>: একটি লিস্ট বা অ্যারের আইডি দিয়েINকন্ডিশন তৈরি করা হয়।
MyBatis (আগে iBATIS) ডাইনামিক SQL তৈরি করার জন্য অনেক শক্তিশালী ট্যাগ প্রদান করে। এগুলি:
<if>: SQL কুয়েরি শর্ত যোগ করতে ব্যবহার করা হয়।<where>: স্বয়ংক্রিয়ভাবেWHEREক্লজ যোগ করা হয় এবং অপ্রয়োজনীয়ANDবাORবাদ দেওয়া হয়।<choose>: একাধিক কন্ডিশনের মধ্যে একটি সিলেক্ট করতে ব্যবহার করা হয় (যেমনif-elseকাজ করে)।<foreach>: লিস্ট বা অ্যারে থেকে ডেটা নিয়েINকন্ডিশনে যুক্ত করা হয়।
এই ডাইনামিক SQL ট্যাগগুলি ব্যবহার করে আপনি খুব সহজে কাস্টম SQL কুয়েরি তৈরি করতে পারবেন যা ডেটাবেস অপারেশনের জন্য আরও বেশি ফ্লেক্সিবল এবং পারফরম্যান্সে কার্যকরী।
Read more