iBATIS (বর্তমানে MyBatis) একটি জনপ্রিয় ORM ফ্রেমওয়ার্ক যা Lazy Loading-এর সমর্থন প্রদান করে, অর্থাৎ একমাত্র তখনই সম্পর্কিত ডেটা লোড হয় যখন তার প্রয়োজন হয়। Lazy Loading কার্যকরভাবে আপনার অ্যাপ্লিকেশনের পারফরম্যান্স উন্নত করতে সাহায্য করে, কারণ শুধুমাত্র প্রয়োজনীয় ডেটা লোড করা হয় এবং অপ্রয়োজনীয় ডেটা লোড করা এড়ানো হয়।
MyBatis-এ Lazy Loading কনফিগার করার জন্য কিছু গুরুত্বপূর্ণ পদক্ষেপ রয়েছে, যা নীচে বিস্তারিতভাবে আলোচনা করা হয়েছে।
Lazy Loading কী?
Lazy Loading এমন একটি কৌশল, যেখানে একাধিক সম্পর্কিত অবজেক্টগুলোকে একযোগে লোড করার পরিবর্তে, শুধুমাত্র তখনই লোড করা হয় যখন সেই সম্পর্কিত অবজেক্টটি অ্যাক্সেস করা হয়। উদাহরণস্বরূপ, যদি আপনার Order এবং Customer নামক দুটি সম্পর্কিত অবজেক্ট থাকে, তবে Order অবজেক্টটি লোড করার সময় Customer অবজেক্টটি লোড করা হবে না যতক্ষণ না আপনি Customer অবজেক্টটি অ্যাক্সেস না করেন।
Lazy Loading কনফিগারেশন MyBatis-এ
MyBatis-এ Lazy Loading কার্যকর করার জন্য lazyLoadingEnabled কনফিগারেশন ব্যবহার করা হয়।
Step 1: mybatis-config.xml ফাইল কনফিগার করা
MyBatis-এ Lazy Loading কনফিগার করার জন্য, প্রথমে mybatis-config.xml ফাইলে কিছু সেটিংস করতে হবে।
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- Enable Lazy Loading -->
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="lazyLoadTriggerMethods" value="get|is"/>
</settings>
<!-- DataSource Configuration -->
<dataSource type="POOLED">
<property name="driver" value="org.h2.Driver"/>
<property name="url" value="jdbc:h2:mem:test;DB_CLOSE_DELAY=-1"/>
<property name="username" value="sa"/>
<property name="password" value=""/>
</dataSource>
<!-- Transaction Manager -->
<transactionManager type="JDBC"/>
<!-- SQL Map Files -->
<sqlMap resource="com/example/mapper/EmployeeMapper.xml"/>
<sqlMap resource="com/example/mapper/DepartmentMapper.xml"/>
</configuration>
Explanation:
lazyLoadingEnabled: এটিtrueসেট করলে Lazy Loading চালু হয়, অর্থাৎ সম্পর্কিত অবজেক্টগুলির জন্য ডেটা তখনই লোড হবে যখন তার প্রয়োজন হবে।lazyLoadTriggerMethods: এই সেটিংটি নির্ধারণ করে কোন মেথডের মাধ্যমে Lazy Loading ট্রিগার হবে। এখানেgetএবংisমেথডগুলো দিয়ে Lazy Loading ট্রিগার হবে।
Step 2: MyBatis Mapper XML Configuration
Lazy Loading ব্যবহার করতে, আপনাকে Mapper XML ফাইলের মধ্যে সম্পর্কিত অবজেক্টগুলো কনফিগার করতে হবে।
EmployeeMapper.xml Example (Lazy Loading):
<?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">
<!-- Employee Select Query -->
<select id="getEmployeeById" resultType="com.example.model.Employee">
SELECT id, name, department_id
FROM employee
WHERE id = #{id}
</select>
<!-- Lazy Loading for Department -->
<select id="getDepartment" resultType="com.example.model.Department">
SELECT id, name
FROM department
WHERE id = #{id}
</select>
</mapper>
Explanation:
- Lazy Loading নিশ্চিত করার জন্য,
getDepartmentমেথডটিEmployeeঅবজেক্টের মধ্যেDepartmentঅবজেক্টের লোডিং এর জন্য ব্যবহৃত হবে। - এখানে
Employeeঅবজেক্টের মধ্যেdepartment_idকেবল একটি ফিল্ড হিসেবে থাকবে এবংDepartmentঅবজেক্টটি Lazy Loaded হবে।
Step 3: Employee এবং Department Model Classes
এখন, আমাদের Java Model Classes তৈরি করতে হবে, যেখানে Employee ক্লাসের মধ্যে Department সম্পর্কিত ডেটা থাকবে এবং Lazy Loading বাস্তবায়ন হবে।
Employee.java:
public class Employee {
private int id;
private String name;
private Department department; // Lazy-loaded relationship
// Getters and Setters
public Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Department.java:
public class Department {
private int id;
private String name;
// Getters and Setters
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Step 4: Java Code to Test Lazy Loading
এখন, Java কোড ব্যবহার করে Lazy Loading পরীক্ষা করতে হবে।
Lazy Loading Test - EmployeeApp.java:
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class EmployeeApp {
public static void main(String[] args) {
// Step 1: Build SqlSessionFactory from configuration file
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder()
.build(EmployeeApp.class.getResourceAsStream("/sql-map-config.xml"));
// Step 2: Open SqlSession
try (SqlSession session = sessionFactory.openSession()) {
// Step 3: Get Employee by ID, this will lazily load the department
Employee employee = session.selectOne("com.example.mapper.EmployeeMapper.getEmployeeById", 1);
// Step 4: Lazy load the department when accessed
System.out.println("Employee Name: " + employee.getName());
System.out.println("Department Name: " + employee.getDepartment().getName());
} catch (Exception e) {
e.printStackTrace();
}
}
}
Explanation:
- Lazy Loading: যখন আপনি
employee.getDepartment()কল করবেন, তখনইDepartmentঅবজেক্টটি লোড হবে। getDepartment()মেথডটি Lazy Loading ট্রিগার করে, কারণ MyBatis-এর কনফিগারেশনে আমরা Lazy Loading এনাবল করেছি।
Step 5: Gradle বা Maven দিয়ে প্রোজেক্ট বিল্ড এবং রান করা
Gradle বা Maven দিয়ে আপনার প্রোজেক্টটি বিল্ড এবং রান করতে পারেন।
For Gradle:
# Build the project
gradle build
# Run the project
gradle run
For Maven:
# Build the project
mvn clean install
# Run the project
mvn exec:java
MyBatis (iBATIS) এ Lazy Loading ব্যবহার করার জন্য lazyLoadingEnabled কনফিগারেশন এবং সম্পর্কিত অবজেক্টগুলির জন্য সঠিক কনফিগারেশন প্রয়োজন। Lazy Loading ব্যবহার করলে, আপনি শুধু তখনই সম্পর্কিত অবজেক্টগুলো লোড করবেন যখন সেগুলো অ্যাক্সেস করা হবে, যা অ্যাপ্লিকেশনটির পারফরম্যান্স এবং মেমরি ব্যবস্থাপনা উন্নত করতে সাহায্য করে।
lazyLoadingEnabledসেটিংটি কনফিগার করার মাধ্যমে Lazy Loading চালু করা যায়।- Mapper XML এবং Java Models এর মাধ্যমে সম্পর্কিত অবজেক্টের Lazy Loading বাস্তবায়ন করা যায়।
Read more