iBATIS (বর্তমানে MyBatis নামে পরিচিত) একটি SQL Mapping Framework যা Java objects এবং SQL স্টেটমেন্টগুলির মধ্যে সম্পর্ক তৈরি করে। এটি ডেটাবেসের সাথে Java অ্যাপ্লিকেশনগুলিকে সংযোগ স্থাপন করার জন্য SQL ভিত্তিক একটি টুল। MyBatis আপনাকে dynamic SQL, advanced mapping techniques, এবং complex queries পরিচালনা করতে সহায়তা করে, যা বড় এবং জটিল অ্যাপ্লিকেশনগুলিতে প্রয়োজনীয়।
এখানে আলোচনা করা হবে iBATIS/MyBatis এর কিছু Advanced SQL Mapping Techniques যা ডেটাবেস অপারেশনগুলিকে আরও কার্যকরী, নমনীয় এবং পারফরম্যান্স-বান্ধব করে তোলে।
1. Dynamic SQL
Dynamic SQL হল একটি পদ্ধতি যা SQL কুয়েরি গুলি রানটাইমে তৈরি বা কাস্টমাইজ করতে সক্ষম করে, যেমন যখন আপনি ডেটাবেসের শর্তাবলীর উপর ভিত্তি করে কুয়েরি তৈরি করতে চান। MyBatis এ ডাইনামিক SQL তৈরি করতে XML Mapper ফাইলের মধ্যে <if>, <choose>, <foreach>, <where> ট্যাগ ব্যবহার করা হয়।
Dynamic SQL Example (XML Mapper)
<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>
Explanation:
<where>: এটি WHERE ক্লজের জন্য ডাইনামিক শর্ত যোগ করতে ব্যবহৃত হয়। এটি প্রথম শর্তের জন্য WHERE যুক্ত করবে এবং পরবর্তী শর্তগুলির জন্যANDযোগ করবে।<if>: একটি শর্ত ব্যবহার করে SQL অংশ যোগ করা হয় যদি নির্দিষ্ট প্যারামিটার দেওয়া থাকে।<choose>: একাধিক শর্তের মধ্যে যেটি প্রথম সঠিক হবে তা SQL কুয়েরিতে যোগ হবে।<foreach>: ব্যবহারকারী ইনপুটের একটি কালেকশন (যেমন একটি লিস্ট) ব্যবহার করে IN ক্লজ তৈরি করতে।
2. Result Mapping with Complex Types
MyBatis আপনাকে complex types বা nested objects ম্যানেজ করার জন্য একটি শক্তিশালী মেকানিজম প্রদান করে। একাধিক resultMap এর মাধ্যমে আপনি সম্পর্কিত Java objects এর মধ্যে ডেটা মেলাতে পারেন। resultMap ব্যবহার করে, আপনি SQL query এর ফলাফলগুলোকে Java ক্লাসের পলিমর্ফিক বা nested properties এর সাথে যুক্ত করতে পারেন।
Result Map Example for Complex Type Mapping
<resultMap id="employeeResultMap" type="com.example.model.Employee">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="department" column="department_id"/>
<association property="department" column="department_id" javaType="com.example.model.Department"/>
</resultMap>
<select id="getEmployeeWithDepartment" resultMap="employeeResultMap">
SELECT e.id, e.name, e.department_id, d.name AS department_name
FROM Employee e
JOIN Department d ON e.department_id = d.id
</select>
Explanation:
<association>: এটি ব্যবহার করা হয় যখন একটি টেবিলের কলাম থেকে সম্পর্কিত একটি অবজেক্টের nested mapping করা হয়।resultMap: MyBatis-এ একাধিক সম্পর্কিত বা complex objects মেলাতে resultMap ব্যবহৃত হয়।- SQL Join: দুটি টেবিলের মধ্যে সম্পর্ক তৈরি করতে SQL JOIN ব্যবহার করা হয়েছে।
3. Using @Param for Multiple Parameters
MyBatis ইন্টারফেস মেথডে একাধিক প্যারামিটার পাস করার জন্য @Param অ্যানোটেশন ব্যবহার করা হয়। এটি SQL কুয়েরিতে সঠিকভাবে প্যারামিটার মেলাতে সাহায্য করে এবং dynamic SQL লেখার ক্ষেত্রে সহায়তা করে।
@Param Example
public interface EmployeeMapper {
@Select("SELECT * FROM Employee WHERE name = #{name} AND salary > #{salary}")
Employee findEmployeeByNameAndSalary(@Param("name") String name, @Param("salary") double salary);
}
Explanation:
- @Param("name") এবং @Param("salary"): ইন্টারফেস মেথডের প্যারামিটারগুলিকে SQL কুয়েরিতে সঠিকভাবে পাস করতে এই অ্যানোটেশন ব্যবহার করা হয়।
4. Using foreach for IN Clause
MyBatis এ <foreach> ট্যাগ ব্যবহার করে আপনি একটি collection (যেমন লিস্ট বা অ্যারে) এর জন্য IN কুয়েরি তৈরি করতে পারেন। এটি বিশেষ করে সহায়ক যখন আপনি একাধিক মানের জন্য ডেটা খুঁজে বের করতে চান।
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>
Explanation:
<foreach>: এটি একটি লুপ যা IN কুয়েরির মধ্যে প্যারামিটারগুলি যোগ করতে ব্যবহার করা হয়। collection প্যারামিটারটি একটি লিস্ট বা অ্যারে হতে পারে।open="(" close=")" separator=",":openএবংcloseব্যবহার করে আপনি IN ক্লজের মধ্যে প্যারামিটারগুলি আবদ্ধ করতে পারেন, এবং separator দ্বারা কুয়েরির মধ্যে কমা যোগ করতে পারেন।
5. Handling Nested Queries with Subselects
MyBatis তে nested queries বা subselects ব্যবহার করে আপনি একটি কুয়েরির মধ্যে অন্য একটি কুয়েরি কল করতে পারেন। এটি complex reporting এবং aggregations এর জন্য উপকারী।
Subselect Example
<select id="getEmployeeWithSalary" resultType="com.example.model.Employee">
SELECT id, name, (SELECT AVG(salary) FROM Salary WHERE employee_id = e.id) AS avg_salary
FROM Employee e
</select>
Explanation:
- Subselect: এটি একটি কুয়েরির মধ্যে অন্য একটি কুয়েরি চালানোর উদাহরণ, যেখানে Employee টেবিলের প্রতিটি রেকর্ডের জন্য সম্পর্কিত Salary টেবিলের গড় বেতন বের করা হচ্ছে।
6. Use of choose, when, otherwise for Conditional Logic
MyBatis তে <choose>, <when>, এবং <otherwise> ট্যাগ ব্যবহার করে আপনি কন্ডিশনাল SQL তৈরি করতে পারেন। এটি বিশেষভাবে উপকারী যখন আপনি একাধিক শর্তের মধ্যে যেকোনো একটি শর্ত পূর্ণ হলে SQL স্টেটমেন্ট তৈরি করতে চান।
choose, when, otherwise 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>
Explanation:
<choose>: এটি একাধিক শর্তের মধ্যে যেটি প্রথম সত্য হবে তা অনুসারে SQL কোড তৈরি করবে।<when>: একটি শর্ত যা SQL স্টেটমেন্টে যোগ করা হবে যদি প্যারামিটারটি সত্য হয়।<otherwise>: যদি অন্য কোনো শর্ত পূর্ণ না হয়, তবে এটি একটি ডিফল্ট শর্ত হিসেবে ব্যবহার হবে।
7. Caching with MyBatis
MyBatis ক্যাশিং ব্যবস্থাপনা সমর্থন করে, যা আপনাকে ডেটাবেস অপারেশনগুলি cache করতে সাহায্য করে এবং পারফরম্যান্স উন্নত করতে সহায়তা করে। First-level cache (session scope) এবং Second-level cache (application scope) এর মধ্যে পার্থক্য রয়েছে।
Second-level Cache Example
<cache eviction="LRU" flushInterval="60000" size="512" readOnly="true"/>
Explanation:
- eviction: ক্যাশের উপাদান সরানোর কৌশল (যেমন LRU - Least Recently Used)।
- flushInterval: কত সময় পর পর ক্যাশ ফ্লাশ হবে।
- size: ক্যাশের সর্বোচ্চ আকার।
iBATIS (MyBatis) তে Advanced SQL Mapping Techniques আপনাকে জটিল ডেটাবেস অপারেশন এবং কুয়েরি লেখার ক্ষমতা প্রদান করে। এর মাধ্যমে আপনি dynamic SQL, complex types, conditional logic, nested queries, এবং caching এর মতো শক্তিশালী ফিচারগুলি ব্যবহার করতে পারবেন। MyBatis এর এ ধরনের ফিচারগুলি আপনাকে অধিক কার্যকরী এবং পারফরম্যান্স-বান্ধব অ্যাপ্লিকেশন তৈরি করতে সাহায্য করবে।
- Dynamic SQL এর মাধ্যমে কুয়েরি গুলিকে কাস্টমাইজ করা।
- Result Mapping এর মাধ্যমে complex objects এর সাথে ডেটা মেলানো।
foreachএবং subselects এর মাধ্যমে ডেটা প্রসেসিংকে আরও নমনীয় করা।
Read more