iBATIS (বর্তমানে MyBatis নামে পরিচিত) ডাইনামিক SQL তৈরির জন্য একটি শক্তিশালী ফিচার সরবরাহ করে, যা বিভিন্ন ধরনের কন্ডিশন বা ফিল্টারগুলির ওপর ভিত্তি করে SQL স্টেটমেন্টগুলি পরিবর্তন করতে পারে। এটি XML Mapper ফাইলের মাধ্যমে SQL কুয়েরি তৈরি এবং ডাইনামিকভাবে তৈরি করা সম্ভব। MyBatis-এ Dynamic SQL তৈরির জন্য <if>, <choose>, <when>, <otherwise>, <foreach> ইত্যাদি ট্যাগ ব্যবহার করা হয়।
ডাইনামিক SQL আপনার কুয়েরির মধ্যে শর্ত, লুপ, এবং বিকল্প যুক্ত করতে সাহায্য করে, যা ডেটা ফিল্টারিং এবং কন্ডিশনাল ডেটাবেস অপারেশন আরও নমনীয় করে তোলে।
Dynamic SQL তৈরি করতে iBATIS / MyBatis-এ ব্যবহৃত সাধারণ ট্যাগসমূহ:
<if>: একটি শর্ত যোগ করতে ব্যবহার করা হয়।<choose>,<when>,<otherwise>: একাধিক শর্তের মধ্যে কোনটি ব্যবহার হবে তা নির্ধারণ করতে।<foreach>: একটি লুপের মাধ্যমে অনেক মান পাস করার জন্য ব্যবহৃত হয়।<trim>: অপ্রয়োজনীয় স্পেস বা কমা মুছে ফেলার জন্য ব্যবহৃত হয়।
Dynamic SQL Example:
এখানে, আমরা দেখব কিভাবে iBATIS (MyBatis) XML Mapper ফাইলে Dynamic SQL তৈরি করা যায়। উদাহরণ হিসেবে একটি Employee টেবিল এবং তার জন্য ডাইনামিক SELECT, INSERT, UPDATE কুয়েরি তৈরি করা হবে।
1. SELECT Query with Dynamic SQL
ধরা যাক, আমাদের একটি Employee টেবিল আছে এবং আমরা বিভিন্ন শর্তের ভিত্তিতে কর্মচারী খুঁজে বের করতে চাই।
EmployeeMapper.xml - Dynamic SELECT Example:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//iBATIS//DTD Mapper 3.0//EN" "http://ibatis.apache.org/dtd/sql-map-3.dtd">
<mapper namespace="com.example.mapper.EmployeeMapper">
<!-- Dynamic SELECT Query to find employees based on conditions -->
<select id="findEmployees" resultType="com.example.model.Employee">
SELECT id, name, department, salary
FROM employee
WHERE 1 = 1
<if test="name != null">
AND name = #{name}
</if>
<if test="department != null">
AND department = #{department}
</if>
<if test="salary != null">
AND salary = #{salary}
</if>
</select>
</mapper>
ব্যাখ্যা:
<if>ট্যাগ: এখানে তিনটি শর্ত (name,department, এবংsalary) সহ SQL কুয়েরি তৈরি করা হয়েছে। যদি কোন শর্তের মান null না হয়, তবে তা SQL কুয়েরিতে যোগ হবে।WHERE 1 = 1: এটি SQL কুয়েরির জন্য একটি বেস শর্ত দেয়, যাতে পরবর্তী শর্তগুলোকে যোগ করা সহজ হয়।
Java Code to Call the Dynamic SQL:
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.example.model.Employee;
import java.util.List;
public class EmployeeApp {
public static void main(String[] args) {
// Step 1: Build SqlSessionFactory from the configuration file
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder()
.build(EmployeeApp.class.getResourceAsStream("/sql-map-config.xml"));
// Step 2: Open a session
try (SqlSession session = sessionFactory.openSession()) {
// Step 3: Execute dynamic SQL query using the Mapper
EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
// Call the dynamic query with some parameters
List<Employee> employees = mapper.findEmployees("John Doe", "HR", null);
for (Employee employee : employees) {
System.out.println("Employee: " + employee.getName() + ", " + employee.getDepartment());
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
এখানে:
findEmployeesমেথডটিname,department, এবংsalaryপ্যারামিটার দিয়ে ডাইনামিক SQL কুয়েরি চালায়।- যদি কোন প্যারামিটার
nullনা হয়, তাহলে সেই শর্ত SQL কুয়েরিতে যোগ করা হয়।
2. Dynamic INSERT Query Example
ধরা যাক, আমরা একটি নতুন Employee ইনসার্ট করতে চাই, এবং কেবলমাত্র নির্দিষ্ট ফিল্ডগুলো ইনপুট হিসেবে প্রদান করব। Dynamic INSERT কুয়েরি ব্যবহার করলে আমরা ফিল্ডগুলি শর্ত অনুসারে যুক্ত করতে পারি।
Dynamic INSERT Query:
<insert id="insertEmployee" parameterType="com.example.model.Employee">
INSERT INTO employee (name, department, salary)
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="name != null">name,</if>
<if test="department != null">department,</if>
<if test="salary != null">salary,</if>
</trim>
<trim prefix="VALUES (" suffix=")" suffixOverrides=",">
<if test="name != null">#{name},</if>
<if test="department != null">#{department},</if>
<if test="salary != null">#{salary},</if>
</trim>
</insert>
ব্যাখ্যা:
<trim>: এখানেprefix,suffix, এবংsuffixOverridesব্যবহার করে SQL কুয়েরির অতিরিক্ত কমা সরিয়ে ফেলা হচ্ছে।<if>: ফিল্ডের মান null না থাকলে তা কুয়েরিতে যোগ হবে।
Java Code to Insert Employee:
Employee newEmployee = new Employee();
newEmployee.setName("Jane Doe");
newEmployee.setDepartment("IT");
newEmployee.setSalary(75000);
mapper.insertEmployee(newEmployee);
session.commit(); // Commit transaction
এখানে, insertEmployee মেথডটি ডাইনামিক SQL কুয়েরি চালায় এবং ইনপুট ফিল্ডগুলো যদি null না হয়, তবে সেগুলো SQL কুয়েরিতে যোগ হয়।
3. Dynamic UPDATE Query Example
আমরা যদি ডাইনামিকভাবে কোনো Employee এর তথ্য আপডেট করতে চাই, তবে আমরা <set> ট্যাগ ব্যবহার করে আপডেট স্টেটমেন্টটি তৈরি করতে পারি।
Dynamic UPDATE Query:
<update id="updateEmployee" parameterType="com.example.model.Employee">
UPDATE employee
<set>
<if test="name != null">name = #{name},</if>
<if test="department != null">department = #{department},</if>
<if test="salary != null">salary = #{salary},</if>
</set>
WHERE id = #{id}
</update>
ব্যাখ্যা:
<set>: এটি একটি UPDATE কুয়েরির জন্য ব্যবহার করা হয়, যাতে কেবলমাত্র পরিবর্তিত ফিল্ডগুলো আপডেট হয়।<if>: কেবলমাত্র যদি মান null না হয়, তাহলে সেই ফিল্ডটি আপডেট করা হবে।
Java Code to Update Employee:
Employee employeeToUpdate = new Employee();
employeeToUpdate.setId(1);
employeeToUpdate.setName("Updated Name");
employeeToUpdate.setDepartment("Sales");
mapper.updateEmployee(employeeToUpdate);
session.commit(); // Commit transaction
4. Dynamic DELETE Query Example
যখন আমরা একটি Employee রেকর্ড ডিলিট করতে চাই, তবে আমরা সেই রেকর্ডের ID অথবা অন্যান্য শর্তের ভিত্তিতে ডিলিট কুয়েরি তৈরি করতে পারি।
Dynamic DELETE Query:
<delete id="deleteEmployee" parameterType="int">
DELETE FROM employee
WHERE id = #{id}
</delete>
Java Code to Delete Employee:
mapper.deleteEmployee(1); // Delete employee with ID 1
session.commit(); // Commit transaction
iBATIS (MyBatis) তে Dynamic SQL ব্যবহার করা অনেক সহজ এবং এটি আপনাকে বিভিন্ন শর্তের ভিত্তিতে SQL কুয়েরি পরিবর্তন করতে সক্ষম করে। এখানে উল্লেখিত কিছু গুরুত্বপূর্ণ Dynamic SQL ট্যাগ:
<if>: শর্ত ভিত্তিক SQL অংশ যোগ করার জন্য।<choose>,<when>,<otherwise>: একাধিক শর্তের মধ্যে একটি নির্বাচন করতে।<foreach>: লুপের মাধ্যমে মান পাস করার জন্য।<trim>: অপ্রয়োজনীয় স্পেস বা কমা সরিয়ে ফেলার জন্য।
এই কৌশলগুলি আপনার ডেটাবেস অপারেশনগুলোকে আরও নমনীয়, কার্যকরী এবং স্কেলেবল করতে সহায়ক হবে।
Read more