iBATIS (বর্তমানে MyBatis নামে পরিচিত) হল একটি SQL Mapping Framework যা SQL স্টেটমেন্টগুলি Java objects এর সাথে সম্পর্কিত করে। MyBatis ডেটাবেসের সাথে কাজ করার জন্য SQL Mapping ব্যবহারের মাধ্যমে ডেটা অ্যাক্সেস করতে সাহায্য করে। MyBatis এর একটি শক্তিশালী বৈশিষ্ট্য হল Dynamic SQL।
Dynamic SQL হল এমন একটি পদ্ধতি যেখানে SQL স্টেটমেন্টগুলি রানটাইমে পরিবর্তিত হয়, অর্থাৎ SQL কোড তৈরি বা কাস্টমাইজ করা যায়, যাতে শর্তাবলী বা বিভিন্ন ফিল্টার ব্যবহারকারী বা ডেটার ওপর নির্ভর করে তৈরি হয়। এটি অনেক সময় WHERE, ORDER BY, INSERT, UPDATE বা DELETE এর মতো কুয়েরি অংশগুলিকে ডায়নামিকভাবে নির্মাণ করতে ব্যবহৃত হয়।
Dynamic SQL এর গুরুত্ব
- Flexible Queries:
- ডাইনামিক SQL স্টেটমেন্ট দিয়ে একাধিক শর্ত বা কন্ডিশনের ভিত্তিতে SQL কুয়েরি তৈরি করা যায়। এটি ব্যবহারকারীর ইনপুট বা অ্যাপ্লিকেশন স্টেটের উপর ভিত্তি করে SQL স্টেটমেন্ট কাস্টমাইজ করতে সাহায্য করে।
- Reduced Boilerplate Code:
- আপনি কুয়েরি স্টেটমেন্টের পুনরাবৃত্তি বা নির্দিষ্ট শর্তাবলী যুক্ত করা থেকে মুক্তি পান। একক স্টেটমেন্টে একাধিক প্যারামিটার বা শর্ত যোগ করতে পারেন।
- Improved Maintainability:
- SQL কোডের পুনঃব্যবহারযোগ্যতা এবং রক্ষণাবেক্ষণ সহজ হয়, কারণ ডাইনামিক SQL কোডটি কমপ্লেক্স শর্তাবলী অথবা ফিল্টারগুলি ইনক্লুড করার জন্য তৈরি করা যেতে পারে।
- Performance Optimization:
- ডাইনামিক SQL এর মাধ্যমে আপনি কেবলমাত্র প্রয়োজনীয় ডেটা লোড করতে পারেন, এবং অপ্রয়োজনীয় অংশ বাদ দিতে পারেন, যা পারফরম্যান্স অপটিমাইজ করতে সাহায্য করে।
MyBatis (iBATIS) এ Dynamic SQL
MyBatis (iBATIS) ডাইনামিক SQL তৈরি করতে XML Mapper এবং , , , ইত্যাদি XML ট্যাগ ব্যবহার করে। এই ট্যাগগুলো SQL স্টেটমেন্টের মধ্যে ডাইনামিক কন্ডিশন এবং অংশ যুক্ত করতে সাহায্য করে।
MyBatis Dynamic SQL এর Tag গুলি:
<if>: একটি শর্ত পরীক্ষা করে এবং যদি শর্তটি সত্য হয়, তাহলে SQL কোডে সেই অংশটি যোগ করা হয়।<choose>: একাধিক শর্তের মধ্যে প্রথম সত্য শর্ত অনুযায়ী SQL কোড তৈরি করা হয়।<where>: WHERE ক্লজের জন্য ডাইনামিক শর্ত যোগ করতে ব্যবহৃত হয়। এটি প্রথম শর্তটি যোগ করার জন্য WHERE শব্দটি স্বয়ংক্রিয়ভাবে যুক্ত করে।<foreach>: একাধিক মান বা আইটেমের জন্য একটি লুপ চালানোর জন্য ব্যবহৃত হয়, যেমন একটি IN কুয়েরি তৈরি করতে।
Dynamic SQL Example in MyBatis
Step 1: Mapper XML with Dynamic SQL
ধরা যাক, আমাদের একটি Employee ক্লাস এবং EmployeeMapper.xml ফাইল তৈরি করতে হবে, যেখানে ডাইনামিক SQL কুয়েরি তৈরি করা হবে।
EmployeeMapper.xml - Dynamic SQL
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.EmployeeMapper">
<!-- Dynamic SQL Example -->
<select id="findEmployees" resultType="com.example.model.Employee">
SELECT * FROM Employee
<where>
<if test="name != null">
AND name = #{name}
</if>
<if test="department != null">
AND department = #{department}
</if>
<if test="salary != null">
AND salary > #{salary}
</if>
</where>
</select>
<!-- Dynamic SQL with Choose Example -->
<select id="findEmployeeByIdOrName" resultType="com.example.model.Employee">
SELECT * FROM Employee
<where>
<choose>
<when test="id != null">
AND id = #{id}
</when>
<when test="name != null">
AND name = #{name}
</when>
<otherwise>
AND department = 'Unknown'
</otherwise>
</choose>
</where>
</select>
<!-- Dynamic SQL with foreach Example (for IN clause) -->
<select id="findEmployeesByIds" resultType="com.example.model.Employee">
SELECT * FROM Employee
WHERE id IN
<foreach collection="ids" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</select>
</mapper>
Explanation of Tags Used:
<if>: যদি কোনো প্যারামিটার (যেমনname,department,salary) প্রদান করা হয়, তাহলে সেই শর্ত SQL কুয়েরিতে যোগ হবে।<if test="name != null"> AND name = #{name} </if><choose>:<choose>ব্লক ব্যবহার করে, আপনি একাধিক শর্ত পরীক্ষা করতে পারেন এবং যেকোনো শর্ত পূর্ণ হলে সেই শর্ত অনুসারে SQL কোড তৈরি হবে।<when>এবং<otherwise>ব্যবহৃত হয়।<choose> <when test="id != null"> AND id = #{id} </when> <otherwise> AND department = 'Unknown' </otherwise> </choose><foreach>: এটি ব্যবহার করা হয় একাধিক মান বা আইটেমের জন্য, যেমন IN clause-এর জন্য।<foreach collection="ids" item="id" open="(" close=")" separator=","> #{id} </foreach>
Step 2: Mapper Interface (EmployeeMapper.java)
EmployeeMapper Interface:
package com.example.mapper;
import com.example.model.Employee;
import java.util.List;
public interface EmployeeMapper {
// Find employees based on dynamic criteria
List<Employee> findEmployees(String name, String department, Double salary);
// Find employee by ID or Name (dynamic choice)
Employee findEmployeeByIdOrName(Integer id, String name);
// Find employees by a list of IDs (dynamic IN clause)
List<Employee> findEmployeesByIds(List<Integer> ids);
}
Explanation:
findEmployeesmethod: এটি Dynamic SQL ব্যবহার করে name, department, এবং salary এর ভিত্তিতে ফিল্টারিং করবে।findEmployeeByIdOrNamemethod: এটি choose ব্লক ব্যবহার করে প্রথমে id এবং পরে name অনুসারে ডেটা ফিল্টার করবে। যদি কোন শর্ত পূর্ণ না হয়, তবে Unknown ডিপার্টমেন্ট প্রদান করবে।findEmployeesByIdsmethod: এটি foreach ব্লক ব্যবহার করে, IN clause দিয়ে একাধিক id দিয়ে সার্চ করবে।
Step 3: MyBatis Session Setup and Testing
Main Application Code (Main.java):
package com.example;
import com.example.mapper.EmployeeMapper;
import com.example.model.Employee;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) {
// MyBatis configuration and session factory setup
String resource = "mybatis-config.xml";
InputStream inputStream = Main.class.getClassLoader().getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// Open session
try (SqlSession session = sqlSessionFactory.openSession()) {
EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);
// Test Dynamic SQL for finding employees
List<Employee> employees = employeeMapper.findEmployees("John", null, 50000.0);
for (Employee employee : employees) {
System.out.println(employee);
}
// Test Dynamic SQL with Choose (id or name)
Employee employee = employeeMapper.findEmployeeByIdOrName(null, "John");
System.out.println(employee);
// Test Dynamic SQL with IN clause (foreach)
List<Employee> employeesByIds = employeeMapper.findEmployeesByIds(Arrays.asList(1, 2, 3));
for (Employee e : employeesByIds) {
System.out.println(e);
}
}
}
}
Explanation:
- findEmployees: এটি ডাইনামিক SQL ব্যবহার করে name এবং salary ফিল্টার করবে।
- findEmployeeByIdOrName: এটি choose ব্যবহার করে id বা name অনুসারে ডেটা খোঁজে।
- **findEmployees
ByIds**: এটি একাধিক id এর ভিত্তিতে ডেটা খুঁজে বের করবে, IN clause ব্যবহার করে।
Dynamic SQL MyBatis (iBATIS) এ একটি শক্তিশালী বৈশিষ্ট্য যা SQL কুয়েরি গুলিকে রানটাইমে কাস্টমাইজ করতে সাহায্য করে। , , এবং এর মতো MyBatis এর XML ট্যাগ গুলি ব্যবহার করে ডাইনামিক কুয়েরি তৈরি করা যায়। এটি আপনাকে SQL কোডের মধ্যে শর্তাবলী এবং কাস্টম প্যারামিটার অন্তর্ভুক্ত করতে দেয়, যা আপনার অ্যাপ্লিকেশনকে আরও নমনীয় এবং পারফরম্যান্স-বান্ধব করে তোলে।
Read more