iBATIS (বর্তমানে MyBatis নামে পরিচিত) হল একটি persistence framework যা SQL Mapping এর মাধ্যমে Java objects এবং relational databases এর মধ্যে ম্যাপিং তৈরি করতে সহায়ক। iBATIS-এর একটি শক্তিশালী বৈশিষ্ট্য হল complex object mapping এবং collection handling। এই বৈশিষ্ট্যগুলি Java ক্লাসের মধ্যে সম্পর্কিত ডেটাকে সহজভাবে ডেটাবেসের সাথে সংযুক্ত করতে সহায়ক।
1. Complex Object Mapping in iBATIS
iBATIS complex object mapping করার জন্য resultMap ব্যবহার করে। এটি আপনাকে একটি বা একাধিক টেবিলের ডেটাকে একটি Java object-এ ম্যাপ করতে দেয়। যেমন, একটি one-to-many সম্পর্ক, many-to-one সম্পর্ক বা many-to-many সম্পর্কের ক্ষেত্রেও iBATIS সহজে complex object mapping করতে সহায়ক।
Complex Object Mapping উদাহরণ:
ধরা যাক আমাদের দুটি ক্লাস আছে, Employee এবং Department। একজন কর্মচারী (Employee) একটি বিভাগের (Department) সাথে সম্পর্কিত, অর্থাৎ Many-to-One সম্পর্ক।
Step 1: SQL Mapping File (XML)
<mapper namespace="com.example.mapper.EmployeeMapper">
<!-- ResultMap for Employee -->
<resultMap id="employeeResultMap" type="com.example.model.Employee">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
<result property="department" column="department_id" javaType="com.example.model.Department" />
</resultMap>
<!-- Select Employee with Department -->
<select id="getEmployeeById" resultMap="employeeResultMap">
SELECT e.id, e.name, e.age, e.department_id, d.name AS department_name
FROM employee e
JOIN department d ON e.department_id = d.id
WHERE e.id = #{id}
</select>
</mapper>
Step 2: Java Code
import org.apache.ibatis.session.SqlSession;
public class EmployeeService {
private SqlSession session;
public EmployeeService(SqlSession session) {
this.session = session;
}
public Employee getEmployeeById(int id) {
return session.selectOne("com.example.mapper.EmployeeMapper.getEmployeeById", id);
}
}
এখানে:
resultMapব্যবহার করেEmployeeঅবজেক্টের জন্য complex object mapping তৈরি করা হয়েছে, যেখানে Department ক্লাসের অবজেক্টও Employee অবজেক্টের মধ্যে ম্যাপ করা হয়েছে।department_idএর মাধ্যমে Department অবজেক্টের সাথে Employee সম্পর্কিত করা হয়েছে।
2. Collection Handling in iBATIS
iBATIS-এ collection handling এমন একটি বৈশিষ্ট্য যা আপনাকে একাধিক সম্পর্কিত অবজেক্ট (যেমন, one-to-many বা many-to-many) একটি একক Java collection (যেমন List বা Set) এ ম্যাপ করতে সহায়ক।
One-to-Many Collection Mapping (Employee - Projects Example)
ধরা যাক, এক একটি Employee এর অনেকগুলি Project থাকতে পারে (one-to-many সম্পর্ক)।
Step 1: SQL Mapping File (XML)
<mapper namespace="com.example.mapper.EmployeeMapper">
<!-- ResultMap for Employee with Projects -->
<resultMap id="employeeWithProjectsResultMap" type="com.example.model.Employee">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
<collection property="projects" ofType="com.example.model.Project">
<result property="id" column="project_id"/>
<result property="name" column="project_name"/>
</collection>
</resultMap>
<!-- Select Employee with Projects -->
<select id="getEmployeeWithProjects" resultMap="employeeWithProjectsResultMap">
SELECT e.id, e.name, e.age, p.id AS project_id, p.name AS project_name
FROM employee e
LEFT JOIN project p ON e.id = p.employee_id
WHERE e.id = #{id}
</select>
</mapper>
Step 2: Java Code
import org.apache.ibatis.session.SqlSession;
public class EmployeeService {
private SqlSession session;
public EmployeeService(SqlSession session) {
this.session = session;
}
public Employee getEmployeeWithProjects(int id) {
return session.selectOne("com.example.mapper.EmployeeMapper.getEmployeeWithProjects", id);
}
}
এখানে:
<collection>ট্যাগ ব্যবহার করে Employee এর projects সংগ্রহকে List হিসাবে ম্যাপ করা হয়েছে।LEFT JOINএর মাধ্যমে Employee এবং Project টেবিলের সম্পর্ক স্থাপন করা হয়েছে, এবংprojectsক্লাসের মধ্যেproject_idওproject_nameযোগ করা হয়েছে।
Many-to-Many Collection Mapping Example (Student - Course)
ধরা যাক, একটি Student একাধিক Course এ ভর্তি হতে পারে এবং একটি Course একাধিক Student থাকতে পারে। এটি many-to-many সম্পর্ক।
Step 1: SQL Mapping File (XML)
<mapper namespace="com.example.mapper.StudentMapper">
<!-- ResultMap for Student with Courses -->
<resultMap id="studentWithCoursesResultMap" type="com.example.model.Student">
<id property="id" column="id"/>
<result property="name" column="name"/>
<result property="age" column="age"/>
<collection property="courses" ofType="com.example.model.Course">
<result property="id" column="course_id"/>
<result property="name" column="course_name"/>
</collection>
</resultMap>
<!-- Select Student with Courses -->
<select id="getStudentWithCourses" resultMap="studentWithCoursesResultMap">
SELECT s.id, s.name, s.age, c.id AS course_id, c.name AS course_name
FROM student s
JOIN student_course sc ON s.id = sc.student_id
JOIN course c ON sc.course_id = c.id
WHERE s.id = #{id}
</select>
</mapper>
Step 2: Java Code
import org.apache.ibatis.session.SqlSession;
public class StudentService {
private SqlSession session;
public StudentService(SqlSession session) {
this.session = session;
}
public Student getStudentWithCourses(int id) {
return session.selectOne("com.example.mapper.StudentMapper.getStudentWithCourses", id);
}
}
এখানে:
<collection>ট্যাগ ব্যবহার করে Student এর courses সংগ্রহকে List হিসাবে ম্যাপ করা হয়েছে।- JOIN এর মাধ্যমে Student এবং Course টেবিলের সম্পর্ক স্থাপন করা হয়েছে।
3. Handling Collections in Results
iBATIS-এ একাধিক অবজেক্ট বা collections হ্যান্ডল করার জন্য, আমরা <resultMap> এবং <collection> ব্যবহার করি। এটি one-to-many বা many-to-many সম্পর্কের জন্য খুবই উপকারী। আমরা নিম্নলিখিত কাজগুলো করতে পারি:
- One-to-many সম্পর্কের ক্ষেত্রে
<collection>ট্যাগ ব্যবহার করা হয়, যেখানে একাধিক সম্পর্কিত অবজেক্ট ম্যাপ করা হয়। - Many-to-many সম্পর্কের ক্ষেত্রে একইভাবে
<collection>ট্যাগ ব্যবহার করা হয়, তবে এখানে সম্পর্কিত অবজেক্টগুলির লিস্ট বা সেট ব্যবহৃত হয়।
Best Practices for Collection Handling in iBATIS/MyBatis:
- Use Result Maps for Complex Relationships: ResultMap ব্যবহার করে জটিল সম্পর্কের ক্ষেত্রে ম্যাপিং করা উচিত, যেমন one-to-many বা many-to-many সম্পর্ক।
- Optimize Queries for Collection Data: Collection লোড করার সময়, JOIN কুয়েরি ব্যবহার করে ডেটার সংখ্যা কমানোর চেষ্টা করুন। Lazy Loading বা Eager Loading কৌশল প্রয়োগ করুন যেখানে প্রয়োজনীয় হয়।
- Use
@OneToManywithfetch = FetchType.LAZY: Collection লোড করার সময় Lazy Loading ব্যবহার করুন যাতে শুধুমাত্র প্রয়োজনীয় সময়ে ডেটা লোড হয়। - Avoid N+1 Query Problem: Collection সম্পর্কিত ডেটা লোড করার সময় N+1 Query Problem থেকে बचতে JOIN FETCH ব্যবহার করুন।
iBATIS/MyBatis-এর complex object mapping এবং collection handling আপনাকে one-to-many এবং many-to-many সম্পর্কের ডেটাকে সহজে Java collections-এ ম্যাপ করতে সহায়ক। <resultMap>, <collection>, এবং <select> ট্যাগগুলি ব্যবহার করে আপনি ডেটাবেসের সাথে সম্পর্কিত অবজেক্টগুলোকে সঠিকভাবে একত্রিত এবং ম্যাপ করতে পারেন। এই বৈশিষ্ট্যগুলি আপনার অ্যাপ্লিকেশনের ডেটা এক্সেস স্তরকে আরও শক্তিশালী এবং কার্যকরী করে তোলে।
Read more