Spring JDBC-তে RowMapper এবং BeanPropertyRowMapper হল দুটি গুরুত্বপূর্ণ ইন্টারফেস/ক্লাস, যেগুলি ডাটাবেস থেকে প্রাপ্ত ResultSet-কে জাভার অবজেক্টে ম্যাপ করতে ব্যবহৃত হয়। এগুলি ডেটাবেস থেকে ডেটা পড়া এবং সেটিকে সহজেই প্রাসঙ্গিক জাভা অবজেক্টে রূপান্তর করতে সাহায্য করে।
RowMapper:
RowMapper একটি ইন্টারফেস যা ResultSet-এর প্রতিটি রো (row) প্রসেস করতে ব্যবহৃত হয়। এটি ডেভেলপারদের কাস্টম অবজেক্ট ম্যাপিংয়ের ক্ষমতা দেয়।
RowMapper ইন্টারফেসের সিগনেচার:
public interface RowMapper<T> {
T mapRow(ResultSet rs, int rowNum) throws SQLException;
}
RowMapper উদাহরণ:
ধরা যাক আমাদের একটি টেবিল users আছে যার কলাম: id, name, email। আমরা চাই এগুলো একটি User ক্লাসে ম্যাপ করতে।
User ক্লাস:
public class User {
private int id;
private String name;
private String email;
// 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;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
RowMapper ইমপ্লিমেন্টেশন:
import org.springframework.jdbc.core.RowMapper;
import java.sql.ResultSet;
import java.sql.SQLException;
public class UserRowMapper implements RowMapper<User> {
@Override
public User mapRow(ResultSet rs, int rowNum) throws SQLException {
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
user.setEmail(rs.getString("email"));
return user;
}
}
JdbcTemplate দিয়ে ব্যবহার:
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import java.util.List;
public class RowMapperExample {
public static void main(String[] args) {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/your_database");
dataSource.setUsername("your_username");
dataSource.setPassword("your_password");
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
String query = "SELECT * FROM users";
List<User> users = jdbcTemplate.query(query, new UserRowMapper());
for (User user : users) {
System.out.println("User ID: " + user.getId());
System.out.println("User Name: " + user.getName());
System.out.println("User Email: " + user.getEmail());
}
}
}
BeanPropertyRowMapper:
BeanPropertyRowMapper হল একটি প্রস্তুত তৈরি ক্লাস, যা ResultSet-এর রো সরাসরি জাভা অবজেক্টে রূপান্তর করতে ব্যবহৃত হয়। এটি RowMapper-এর একটি ইমপ্লিমেন্টেশন, এবং এর সুবিধা হল এটি স্বয়ংক্রিয়ভাবে ResultSet-এর কলামের নাম এবং জাভা অবজেক্টের প্রপার্টির মধ্যে নাম মিলিয়ে ডেটা ম্যাপ করে।
BeanPropertyRowMapper উদাহরণ:
BeanPropertyRowMapper দিয়ে সরল উদাহরণ:
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import java.util.List;
public class BeanPropertyRowMapperExample {
public static void main(String[] args) {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/your_database");
dataSource.setUsername("your_username");
dataSource.setPassword("your_password");
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
String query = "SELECT * FROM users";
List<User> users = jdbcTemplate.query(query, new BeanPropertyRowMapper<>(User.class));
for (User user : users) {
System.out.println("User ID: " + user.getId());
System.out.println("User Name: " + user.getName());
System.out.println("User Email: " + user.getEmail());
}
}
}
RowMapper vs BeanPropertyRowMapper:
| বৈশিষ্ট্য | RowMapper | BeanPropertyRowMapper |
|---|---|---|
| কাস্টম ম্যাপিং | কাস্টমাইজ করা যায় (ম্যাপিং নিয়ন্ত্রণ করা যায়) | স্বয়ংক্রিয়ভাবে ম্যাপিং করা হয়। |
| অতিরিক্ত কোড প্রয়োজন | কাস্টম RowMapper ইমপ্লিমেন্ট করতে হয়। | সরাসরি ব্যবহারযোগ্য। |
| নাম মিলানো (Name Matching) | প্রোগ্রামার নিয়ন্ত্রণ করতে পারে। | কলামের নাম এবং ফিল্ডের নাম একই হতে হবে। |
| সহজতা | বড় এবং জটিল ম্যাপিংয়ের জন্য ভালো। | সহজ এবং সরল ডেটা ম্যাপিংয়ের জন্য উপযুক্ত। |
কোনটি ব্যবহার করবেন?
- BeanPropertyRowMapper ব্যবহার করুন যদি:
- আপনার টেবিলের কলামের নাম এবং জাভা অবজেক্টের প্রপার্টির নাম একদম মিলে যায়।
- সরল এবং দ্রুত ডেটা ম্যাপিং দরকার হয়।
- RowMapper ব্যবহার করুন যদি:
- কাস্টম ম্যাপিং দরকার হয়।
- কলামের নাম এবং অবজেক্ট প্রপার্টির নাম আলাদা হয়।
- বিশেষ লজিক প্রয়োগ করতে হয়।
উপরের উদাহরণগুলো Spring JDBC-এর RowMapper এবং BeanPropertyRowMapper সম্পর্কে পরিষ্কার ধারণা দেবে।
RowMapper হল Spring Framework এর একটি ইন্টারফেস যা ডেটাবেস টেবিলের একটি রো (row) কে জাভা অবজেক্টে রূপান্তর করতে ব্যবহৃত হয়। এটি org.springframework.jdbc.core.RowMapper প্যাকেজের অন্তর্ভুক্ত।
RowMapper ইন্টারফেসটি একটি একক মেথড প্রদান করে:
T mapRow(ResultSet rs, int rowNum) throws SQLException;
ResultSet: ডেটাবেস থেকে প্রাপ্ত রো এর ডেটা ধারণ করে।rowNum: রো এর ইনডেক্স।T: রিটার্ন টাইপ যা ডেভেলপার নির্ধারণ করে।
RowMapper কেন প্রয়োজন?
- ডেটা রূপান্তর সহজ করে:
- ডেটাবেস টেবিলের রো থেকে ডেটা রিড করে তা সরাসরি জাভা অবজেক্টে রূপান্তর করে।
- ম্যানুয়াল
ResultSetপ্রসেসিং এড়িয়ে যায়।
- কোড রিডেবিলিটি বাড়ায়:
- পৃথক
ResultSetহ্যান্ডলিং কোড লেখার প্রয়োজন হয় না, যা কোডকে ছোট এবং পরিষ্কার রাখে।
- পৃথক
- পুনরায় ব্যবহারযোগ্যতা:
- RowMapper একবার লিখে বিভিন্ন স্থানে ব্যবহার করা যায়।
- কমপ্লেক্সিটি কমায়:
- জটিল SQL রেজাল্ট হ্যান্ডলিং প্রক্রিয়া সরলীকৃত করে।
RowMapper এর উদাহরণ
১. সহজ RowMapper উদাহরণ
ডেটাবেস থেকে User অবজেক্ট তৈরি করার জন্য একটি RowMapper ইমপ্লিমেন্টেশন:
import org.springframework.jdbc.core.RowMapper;
import java.sql.ResultSet;
import java.sql.SQLException;
public class UserRowMapper implements RowMapper<User> {
@Override
public User mapRow(ResultSet rs, int rowNum) throws SQLException {
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
user.setEmail(rs.getString("email"));
return user;
}
}
২. JdbcTemplate এ RowMapper ব্যবহার
import org.springframework.jdbc.core.JdbcTemplate;
import java.util.List;
public class UserDao {
private JdbcTemplate jdbcTemplate;
public UserDao(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public List<User> getAllUsers() {
String sql = "SELECT id, name, email FROM users";
return jdbcTemplate.query(sql, new UserRowMapper());
}
}
৩. ল্যাম্বডা এক্সপ্রেশনের মাধ্যমে RowMapper
RowMapper ইন্টারফেস সরাসরি ল্যাম্বডা এক্সপ্রেশন বা অ্যানোনিমাস ক্লাস ব্যবহার করেও ইমপ্লিমেন্ট করা যায়:
public List<User> getAllUsers() {
String sql = "SELECT id, name, email FROM users";
return jdbcTemplate.query(sql, (rs, rowNum) -> {
User user = new User();
user.setId(rs.getInt("id"));
user.setName(rs.getString("name"));
user.setEmail(rs.getString("email"));
return user;
});
}
RowMapper এর সুবিধা
- কোড পুনরাবৃত্তি এড়ায়:
ResultSetহ্যান্ডলিং এর জন্য বারবার কোড লেখার প্রয়োজন হয় না।
- উচ্চমানের কোড রিডেবিলিটি:
RowMapperব্যবহার করে ডেটাবেস অপারেশন আরও সুসংগঠিত হয়।
- পুনঃব্যবহারযোগ্যতা:
- একই RowMapper ক্লাস বিভিন্ন স্থানে ব্যবহার করা যায়।
- লাইটওয়েট সমাধান:
- ORM (যেমন Hibernate) এর তুলনায় এটি সহজ এবং দ্রুত কাজ করে।
RowMapper এর সীমাবদ্ধতা
- জটিল ডেটা স্ট্রাকচারের জন্য উপযুক্ত নয়:
- জটিল নেস্টেড অবজেক্ট বা একাধিক টেবিল থেকে ডেটা ম্যাপ করার ক্ষেত্রে এটি সীমাবদ্ধ।
- ম্যাপিং ম্যানুয়াল:
- প্রতিটি ফিল্ডের জন্য ম্যানুয়াল সেটার কল করতে হয়।
উপসংহার
Spring JDBC এর RowMapper একটি শক্তিশালী টুল যা ডেটাবেস রো-কে জাভা অবজেক্টে রূপান্তর করার কাজকে সহজ, দ্রুত এবং কার্যকরী করে তোলে। এটি ডেটাবেস অপারেশনকে আরও রিডেবল এবং পুনঃব্যবহারযোগ্য করে তোলে, যা ডেভেলপারদের ডেটাবেস ইন্টিগ্রেশন সহজ করতে সাহায্য করে।
RowMapper ইন্টারফেসটি স্প্রিং JDBC-তে একটি শক্তিশালী টুল যা ডাটাবেস থেকে প্রাপ্ত ResultSet-এর প্রতিটি রো (row) ম্যাপ করে জাভা অবজেক্টে রূপান্তরিত করতে ব্যবহৃত হয়। আপনি যখন ডেটাবেস থেকে কাস্টম অবজেক্ট তৈরি করতে চান, তখন RowMapper-এর সাহায্যে একটি কাস্টম ম্যাপিং লজিক তৈরি করা হয়।
Custom RowMapper কেন প্রয়োজন?
- কাস্টম অবজেক্ট তৈরি করা:
- আপনি যখন ডাটাবেস থেকে জাভা ক্লাসে ডেটা ম্যাপ করতে চান।
- কাস্টম লজিক প্রয়োগ করা:
- যখন রো-এর ডেটা প্রসেস করার জন্য বিশেষ কোনো লজিক প্রয়োজন।
- বহু কলাম ম্যাপিং সহজ করা:
- একটি জটিল SQL রেজাল্টকে সরাসরি আপনার জাভা অবজেক্টের সাথে যুক্ত করতে সাহায্য করে।
Custom RowMapper তৈরির ধাপ
- RowMapper ইন্টারফেস ইমপ্লিমেন্ট করা:
mapRowমেথড ওভাররাইড করে ম্যাপিং লজিক লিখতে হবে।
- প্রত্যেক রেকর্ড প্রসেস করা:
ResultSetথেকে ডেটা নিয়ে জাভা অবজেক্ট তৈরি করতে হবে।
Custom RowMapper উদাহরণ
1. ডাটাবেস টেবিল উদাহরণ
ধরা যাক, আমাদের একটি employees নামের টেবিল আছে।
টেবিলের স্ট্রাকচার:
CREATE TABLE employees (
id INT PRIMARY KEY,
name VARCHAR(100),
department VARCHAR(50),
salary DECIMAL(10, 2)
);
2. Employee ক্লাস
public class Employee {
private int id;
private String name;
private String department;
private double salary;
// 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;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
3. Custom RowMapper তৈরি করা
import org.springframework.jdbc.core.RowMapper;
import java.sql.ResultSet;
import java.sql.SQLException;
public class EmployeeRowMapper implements RowMapper<Employee> {
@Override
public Employee mapRow(ResultSet rs, int rowNum) throws SQLException {
Employee employee = new Employee();
employee.setId(rs.getInt("id"));
employee.setName(rs.getString("name"));
employee.setDepartment(rs.getString("department"));
employee.setSalary(rs.getDouble("salary"));
return employee;
}
}
4. JdbcTemplate দিয়ে Custom RowMapper ব্যবহার
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;
import java.util.List;
@Repository
public class EmployeeDAO {
@Autowired
private JdbcTemplate jdbcTemplate;
public List<Employee> getAllEmployees() {
String sql = "SELECT * FROM employees";
return jdbcTemplate.query(sql, new EmployeeRowMapper());
}
}
5. কাস্টম কোয়েরি দিয়ে ব্যবহার
আপনি চাইলে ফিল্টার করা ডেটা আনতে পারেন:
public Employee getEmployeeById(int id) {
String sql = "SELECT * FROM employees WHERE id = ?";
return jdbcTemplate.queryForObject(sql, new Object[]{id}, new EmployeeRowMapper());
}
Custom RowMapper-এর সুবিধা
- Reusable Logic:
- একবার তৈরি করলে বিভিন্ন DAO বা সার্ভিস ক্লাসে এটি পুনরায় ব্যবহার করা যায়।
- কোড ক্লিন রাখা:
- জটিল
ResultSetপ্রসেসিং লজিক সহজ করে এবং কোডের পড়তে সহজ হয়।
- জটিল
- Custom Mapping:
- ডেটাবেস এবং জাভা অবজেক্টের মধ্যে পার্থক্য সহজে পরিচালনা করা যায়।
উপসংহার
RowMapper স্প্রিং JDBC-তে একটি গুরুত্বপূর্ণ টুল যা ডেটা ম্যাপিংকে সহজ এবং কার্যকর করে তোলে। কাস্টম RowMapper ব্যবহার করে আপনি আপনার ডেটাবেস টেবিল এবং জাভা অবজেক্টের মধ্যে সম্পর্ক সুন্দরভাবে পরিচালনা করতে পারবেন। এটি কোড ক্লিন রাখার পাশাপাশি আপনার অ্যাপ্লিকেশনকে আরও মডুলার এবং পুনঃব্যবহারযোগ্য করে তোলে।
BeanPropertyRowMapper হলো স্প্রিং জেডিবিসি এর একটি সুবিধাজনক ক্লাস, যা SQL ResultSet-এর কলামগুলোকে জাভা অবজেক্টের প্রপার্টি বা ফিল্ডের সাথে অটোম্যাটিক্যালি ম্যাপ করে। এটি RowMapper ইন্টারফেসের একটি ইমপ্লিমেন্টেশন এবং POJO (Plain Old Java Object) ক্লাসের সাথে ডেটা ম্যাপিং সহজ করে তোলে।
BeanPropertyRowMapper কীভাবে কাজ করে?
- কলামের নাম এবং অবজেক্ট প্রপার্টি:
- SQL টেবিলের কলাম নাম এবং POJO এর ফিল্ড নাম একই হলে
BeanPropertyRowMapperএগুলো অটোম্যাটিক্যালি ম্যাপ করে। - যদি কলামের নাম এবং প্রপার্টি নাম ভিন্ন হয়, তবে আপনি SQL query-তে alias ব্যবহার করতে পারেন।
- SQL টেবিলের কলাম নাম এবং POJO এর ফিল্ড নাম একই হলে
- রিফ্লেকশন (Reflection):
- এটি রিফ্লেকশন ব্যবহার করে ResultSet থেকে ডেটা পড়ে এবং POJO ক্লাসের ফিল্ডে সেট করে।
কেন BeanPropertyRowMapper ব্যবহার করবেন?
- ম্যাপিং কোড কমানোর জন্য।
- দ্রুত এবং সহজ ডেটা ম্যাপিং।
- স্ট্যাটিক বা হার্ডকোডেড ম্যাপিং কোড লেখার প্রয়োজন হয় না।
উদাহরণ
১. টেবিল স্ট্রাকচার
ধরা যাক, আপনার একটি employee টেবিল রয়েছে:
| id | name | department | salary |
|---|---|---|---|
| 1 | Alice | HR | 50000 |
| 2 | Bob | IT | 60000 |
২. Employee ক্লাস (POJO)
public class Employee {
private int id;
private String name;
private String department;
private double salary;
// 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;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
৩. JdbcTemplate এবং BeanPropertyRowMapper ব্যবহার
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import java.util.List;
public class EmployeeDAO {
private JdbcTemplate jdbcTemplate;
// Constructor Injection
public EmployeeDAO(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
// Fetch all employees
public List<Employee> getAllEmployees() {
String sql = "SELECT * FROM employee";
return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Employee.class));
}
// Fetch employee by ID
public Employee getEmployeeById(int id) {
String sql = "SELECT * FROM employee WHERE id = ?";
return jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<>(Employee.class), id);
}
}
কোড বিশ্লেষণ
queryমেথড:jdbcTemplate.query()মেথড মাল্টিপল রেকর্ড রিটার্ন করার জন্য ব্যবহৃত হয়।BeanPropertyRowMapper<>(Employee.class)POJO ক্লাসে ডেটা ম্যাপ করার জন্য ব্যবহৃত হয়।
queryForObjectমেথড:- একক রেকর্ড ফেচ করার জন্য ব্যবহৃত হয়।
- POJO ক্লাসের সাথে একক রেকর্ড ম্যাপ করে।
Alias ব্যবহার করা
যদি টেবিলের কলাম নাম এবং POJO প্রপার্টি নাম ভিন্ন হয়, তবে SQL query-তে AS alias ব্যবহার করতে হবে।
String sql = "SELECT id AS employeeId, name AS employeeName, department AS dept, salary FROM employee";
return jdbcTemplate.query(sql, new BeanPropertyRowMapper<>(Employee.class));
এক্ষেত্রে, আপনার POJO ক্লাসের প্রপার্টি নাম employeeId, employeeName, এবং dept হতে হবে।
BeanPropertyRowMapper এর সুবিধা
- সহজ এবং স্বয়ংক্রিয় ম্যাপিং:
- কম কোড দিয়ে ম্যাপিং সম্পন্ন করা যায়।
- ডেটা প্রসেসিং সহজ:
- অনেক বড় এবং জটিল SQL রেজাল্টসেট সহজেই প্রাসঙ্গিক জাভা অবজেক্টে রূপান্তর করা যায়।
- পুনঃব্যবহারযোগ্যতা:
- একবার POJO এবং SQL কনফিগার করলে বারবার ব্যবহার করা যায়।
সীমাবদ্ধতা
- নাম মিলানো বাধ্যতামূলক:
- টেবিলের কলাম নাম এবং POJO প্রপার্টি নাম অবশ্যই মিলে যেতে হবে, নতুবা alias ব্যবহার করতে হবে।
- কমপ্লেক্স ম্যাপিং:
- জটিল ম্যাপিংয়ের ক্ষেত্রে (যেমন নেস্টেড অবজেক্ট) এটি সীমিত।
উপসংহার
BeanPropertyRowMapper স্প্রিং জেডিবিসি-তে সহজ এবং দ্রুত ডেটা ম্যাপিং এর জন্য একটি কার্যকর উপায়। এটি বয়লারপ্লেট কোড কমিয়ে ডেভেলপমেন্টের সময় এবং জটিলতা উভয়ই হ্রাস করে।
RowMapper স্প্রিং জেডিবিসি (Spring JDBC)-তে ব্যবহৃত একটি ইন্টারফেস, যা ডাটাবেস থেকে প্রাপ্ত রেকর্ডকে কাস্টম অবজেক্টে ম্যাপ করার জন্য ব্যবহৃত হয়। এটি ডেটাবেসের একটি রো-কে জাভা অবজেক্টে রূপান্তর করার জন্য খুবই কার্যকর।
RowMapper ব্যবহার করার উপায়
Syntax:
@FunctionalInterface
public interface RowMapper<T> {
T mapRow(ResultSet rs, int rowNum) throws SQLException;
}
RowMapper ইন্টারফেসের একটি mapRow() মেথড আছে, যা ডাটাবেস থেকে প্রতিটি রেকর্ডকে প্রসেস করে এবং জাভা অবজেক্ট তৈরি করে।
উদাহরণ সহ ব্যাখ্যা
উদাহরণ: RowMapper ব্যবহার করে একটি টেবিল থেকে ডেটা পড়া
1. ডাটাবেস টেবিল:
ধরুন, আমাদের একটি users নামক টেবিল আছে:
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255),
email VARCHAR(255)
);
2. User ক্লাস তৈরি করুন:
public class User {
private int id;
private String name;
private String email;
// Constructor
public User(int id, String name, String email) {
this.id = id;
this.name = name;
this.email = email;
}
// 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;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", email='" + email + '\'' +
'}';
}
}
3. RowMapper ব্যবহার করে ডেটা ফেচ করা:
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
@Service
public class UserService {
private final JdbcTemplate jdbcTemplate;
public UserService(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
}
public List<User> getAllUsers() {
String sql = "SELECT * FROM users";
// Using RowMapper
return jdbcTemplate.query(sql, new RowMapper<User>() {
@Override
public User mapRow(ResultSet rs, int rowNum) throws SQLException {
return new User(
rs.getInt("id"),
rs.getString("name"),
rs.getString("email")
);
}
});
}
}
4. Lambda দিয়ে সহজ পদ্ধতিতে RowMapper:
RowMapper-এর lambda এক্সপ্রেশন ব্যবহার করা যেতে পারে:
public List<User> getAllUsers() {
String sql = "SELECT * FROM users";
return jdbcTemplate.query(sql, (rs, rowNum) -> new User(
rs.getInt("id"),
rs.getString("name"),
rs.getString("email")
));
}
একটি নির্দিষ্ট রেকর্ড পড়ার জন্য RowMapper:
ধরুন, আমরা একটি নির্দিষ্ট id এর ভিত্তিতে User পড়তে চাই:
public User getUserById(int id) {
String sql = "SELECT * FROM users WHERE id = ?";
return jdbcTemplate.queryForObject(sql, new Object[]{id}, (rs, rowNum) -> new User(
rs.getInt("id"),
rs.getString("name"),
rs.getString("email")
));
}
কাস্টম RowMapper তৈরি করা (Reusable):
আপনার যদি একই টেবিলের জন্য বারবার RowMapper ব্যবহার করতে হয়, তাহলে কাস্টম RowMapper তৈরি করুন:
CustomUserRowMapper:
import org.springframework.jdbc.core.RowMapper;
import java.sql.ResultSet;
import java.sql.SQLException;
public class CustomUserRowMapper implements RowMapper<User> {
@Override
public User mapRow(ResultSet rs, int rowNum) throws SQLException {
return new User(
rs.getInt("id"),
rs.getString("name"),
rs.getString("email")
);
}
}
ব্যবহার:
public List<User> getAllUsers() {
String sql = "SELECT * FROM users";
return jdbcTemplate.query(sql, new CustomUserRowMapper());
}
সম্পূর্ণ উদাহরণ:
Main Application:
@SpringBootApplication
public class SpringJdbcExampleApplication {
public static void main(String[] args) {
ApplicationContext context = SpringApplication.run(SpringJdbcExampleApplication.class, args);
UserService userService = context.getBean(UserService.class);
// Add some users
userService.addUser("Alice", "alice@example.com");
userService.addUser("Bob", "bob@example.com");
// Get all users
List<User> users = userService.getAllUsers();
users.forEach(System.out::println);
// Get user by ID
User user = userService.getUserById(1);
System.out.println(user);
}
}
উপসংহার:
RowMapper-এর মাধ্যমে জাভা অবজেক্ট এবং ডাটাবেস টেবিলের রো-র মধ্যে ম্যাপিং সহজ হয়।- এটি কাস্টম ম্যাপিং করার সুবিধা দেয়।
- Reusable
RowMapperতৈরি করে কোড আরও ক্লিন এবং মেইনটেইনেবল করা যায়।
Read more