iBATIS (MyBatis) হল একটি SQL Mapping Framework যা Java objects এবং SQL queries এর মধ্যে সম্পর্ক স্থাপন করতে সাহায্য করে। যখন আপনার ডেটাবেসে অনেক ডেটা থাকে এবং আপনি pagination করতে চান, অর্থাৎ কিছু সংখ্যক রেকর্ড একবারে লোড করতে চান, তখন RowBounds ব্যবহার করা হয়।
RowBounds একটি MyBatis ক্লাস যা ডেটার pagination বা batch fetching এর জন্য ব্যবহৃত হয়। এটি একটি খুব সহজ উপায় যাতে limit এবং offset এর মাধ্যমে নির্দিষ্ট সংখ্যা ডেটা বের করা যায়।
1. What is RowBounds?
RowBounds একটি MyBatis ক্লাস যা SQL queries এর জন্য pagination সমর্থন করে। এটি limit এবং offset ভিত্তিক pagination অফার করে, যা ডেটাবেস থেকে ছোট ছোট অংশে ডেটা রিট্রিভ করার জন্য ব্যবহৃত হয়।
- Offset: এটি জানায় যে SQL query তে কতগুলি রেকর্ড এড়িয়ে যেতে হবে। সাধারণত এটি ব্যবহার করা হয় সেই পেজটি খোঁজার জন্য যা বর্তমানে দেখানো হচ্ছে।
- Limit: এটি জানায় যে কতটি রেকর্ড প্রতি query তে ফেচ করা হবে। এটি ব্যবহৃত হয় একটি নির্দিষ্ট সংখ্যক রেকর্ড প্রতিটি পেজে দেখানোর জন্য।
2. How to Use RowBounds for Pagination
Basic Example Using RowBounds:
ধরা যাক, আমাদের একটি Employee টেবিল আছে, এবং আমরা প্রতিটি পেজে 10টি employee রেকর্ড লোড করতে চাই।
Employee Java Class:
public class Employee {
private int id;
private String name;
private String department;
// Getters and Setters
}
Mapper XML for Select Query:
<select id="getAllEmployees" resultType="Employee">
SELECT id, name, department FROM employee
</select>
Using RowBounds for Pagination in Java:
import org.apache.ibatis.session.RowBounds;
import org.apache.ibatis.session.SqlSession;
import java.util.List;
public class EmployeePaginationExample {
public static void main(String[] args) {
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
// Define pagination parameters
int offset = 0; // start from the first record (for page 1)
int limit = 10; // number of records per page
// Create RowBounds object for pagination
RowBounds rowBounds = new RowBounds(offset, limit);
// Fetch paginated data
List<Employee> employees = sqlSession.selectList("getAllEmployees", null, rowBounds);
// Display fetched employees
for (Employee employee : employees) {
System.out.println(employee.getName() + " - " + employee.getDepartment());
}
} finally {
sqlSession.close();
}
}
}
Explanation:
- RowBounds: এটি pagination সেটআপ করার জন্য ব্যবহৃত হয়েছে। এখানে,
offsetহল পেজের শুরুর রেকর্ড এবংlimitহল প্রতিটি পেজে প্রদর্শিত রেকর্ডের সংখ্যা। selectList():selectList()মেথডে, প্রথম প্যারামিটারটি SQL mapper query এর ID, দ্বিতীয় প্যারামিটারটি হলোnull(যেহেতু আমরা প্যারামিটার পাঠাচ্ছি না) এবং তৃতীয় প্যারামিটারটি হলোRowBounds।
RowBounds ডেটা লোড করার জন্য SQL query তে LIMIT এবং OFFSET যোগ করবে, এবং এই query এর ফলাফলটি আপনার নির্দিষ্ট page size অনুসারে ফেচ করবে।
Pagination Example:
ধরা যাক, আপনি পেজ 2 দেখতে চান, যেখানে প্রতি পেজে 10টি রেকর্ড আছে। এই জন্য আপনি offset পরিবর্তন করে RowBounds সঠিকভাবে সেট করতে পারেন:
int pageNumber = 2; // Page number
int pageSize = 10; // Records per page
int offset = (pageNumber - 1) * pageSize; // Offset calculation for page
int limit = pageSize; // Limit for records per page
RowBounds rowBounds = new RowBounds(offset, limit);
এখানে, পেজ 2 তে রেকর্ড 11 থেকে 20 পর্যন্ত লোড হবে কারণ প্রথম পেজে 10টি রেকর্ড আছে।
3. Advantages of Using RowBounds for Pagination
- Memory Efficiency: RowBounds শুধুমাত্র প্রয়োজনীয় subset of data (page-wise) ফেচ করে, যা memory সাশ্রয়ী। আপনি একবারে পুরো ডেটাবেস লোড না করে একাধিক পেজে ডেটা দেখতে পারেন।
- Flexible Pagination: এটি limit এবং offset ব্যবহার করে পেজিং পরিচালনা করতে পারে, যা সহজ এবং flexible pagination সুবিধা দেয়।
- No Need for SQL Modification: আপনার SQL query তে কোনো পরিবর্তন করতে হয় না, RowBounds সরাসরি offset এবং limit মান ব্যবহার করে pagination কার্যকরী করে।
4. Pagination Using RowBounds with Dynamic SQL
ধরা যাক, আমাদের ডেটাবেসে employees তথ্যের পাশাপাশি কিছু filtering criteria (যেমন departmentId, minSalary ইত্যাদি) রয়েছে, এবং আমরা RowBounds ব্যবহার করে dynamic pagination করতে চাই।
Dynamic SQL Mapper XML:
<select id="getEmployeesByCriteria" resultType="Employee">
SELECT id, name, department, salary
FROM employee
<where>
<if test="departmentId != null">
AND department_id = #{departmentId}
</if>
<if test="minSalary != null">
AND salary > #{minSalary}
</if>
</where>
</select>
Dynamic Pagination Example in Java:
import org.apache.ibatis.session.RowBounds;
import org.apache.ibatis.session.SqlSession;
import java.util.List;
import java.util.Map;
public class DynamicPaginationExample {
public static void main(String[] args) {
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
// Define filtering criteria
Map<String, Object> params = new HashMap<>();
params.put("departmentId", 2); // Filter by department ID
params.put("minSalary", 50000); // Filter by minimum salary
// Define pagination parameters
int offset = 0; // Page 1
int limit = 10; // 10 records per page
RowBounds rowBounds = new RowBounds(offset, limit);
// Fetch paginated data with dynamic filters
List<Employee> employees = sqlSession.selectList("getEmployeesByCriteria", params, rowBounds);
// Display employees
for (Employee employee : employees) {
System.out.println(employee.getName() + " - " + employee.getDepartment());
}
} finally {
sqlSession.close();
}
}
}
Explanation:
- Dynamic Parameters:
departmentIdএবংminSalaryপ্যারামিটারগুলির মাধ্যমে filtering criteria সেট করা হয়েছে। - RowBounds: pagination পরিচালনার জন্য offset এবং limit ব্যবহৃত হয়েছে।
এই উদাহরণে, filtering criteria এবং pagination একত্রে ব্যবহার করা হয়েছে।
- RowBounds MyBatis-এ pagination পরিচালনার জন্য একটি শক্তিশালী টুল। এটি offset এবং limit ব্যবহার করে SQL queries এর মধ্যে ডেটা পেজিং করতে সাহায্য করে।
- Dynamic SQL সহ RowBounds ব্যবহার করে আপনি ডেটার উপর বিভিন্ন শর্ত যুক্ত করতে পারেন এবং flexible pagination অর্জন করতে পারেন।
- First-level cache এবং second-level cache সহ RowBounds ডেটার কার্যকারিতা আরও বৃদ্ধি করতে সাহায্য করতে পারে, বিশেষ করে যখন ডেটাবেসে বিশাল পরিমাণ ডেটা থাকে এবং শুধুমাত্র একটি ছোট অংশ প্রদর্শিত হয়।
Read more