iBATIS (বর্তমানে MyBatis) একটি জনপ্রিয় Object-Relational Mapping (ORM) ফ্রেমওয়ার্ক, যা SQL কুয়েরি লেখার সুবিধা দেয় এবং Java objects এর সাথে ডেটাবেস টেবিল ম্যাপিং সহজ করে। iBATIS SQL কুয়েরি গুলি হালকা এবং কাস্টমাইজড থাকে, যার মাধ্যমে ডেটাবেস ইন্টারঅ্যাকশন ম্যানুয়ালি কন্ট্রোল করা যায়। SQL কুয়েরিগুলি সরাসরি XML ফাইলের মধ্যে সংরক্ষিত থাকে, যা XML Mapping নামে পরিচিত।
iBATIS-এর মূল উদ্দেশ্য হল SQL এবং Java objects এর মধ্যে একটি পরিষ্কার ম্যাপিং প্রদান করা এবং সেই সাথে SQL statements নির্দিষ্টভাবে কাস্টমাইজ করার সুযোগ দেওয়া।
iBATIS SQL Statements এবং XML Mapping
SQL Statements in iBATIS
iBATIS-এ SQL কুয়েরিগুলি Mapper XML files-এ লিখতে হয়, যা Java objects এবং SQL statements এর মধ্যে সম্পর্ক স্থাপন করে। প্রতিটি SQL statement, যেমন SELECT, INSERT, UPDATE, DELETE, JOIN, ইত্যাদি, XML ফাইলের মধ্যে Mapper ট্যাগের মধ্যে ডিফাইন করা হয়।
Basic SQL Statement in iBATIS
iBATIS XML Mapping ফাইলের মধ্যে SQL statement ডিফাইন করতে, আপনি <select>, <insert>, <update>, এবং <delete> ট্যাগ ব্যবহার করবেন।
Step 1: SQL Map XML Configuration
প্রথমে, sql-map-config.xml কনফিগারেশন ফাইল তৈরি করতে হবে, যেখানে ডেটাবেস সংযোগ এবং Mapper ফাইল রেফারেন্স থাকবে।
Example: sql-map-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS//DTD SQL Map Configuration 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<!-- Database connection configuration -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/yourdb"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</dataSource>
<!-- Transaction Manager -->
<transactionManager type="JDBC"/>
<!-- Include the mapper file(s) -->
<sqlMap resource="com/example/mapper/EmployeeMapper.xml"/>
</sqlMapConfig>
- DataSource: ডেটাবেসের জন্য সংযোগের বিবরণ এখানে দেওয়া হয়।
- TransactionManager: ট্রানজ্যাকশন পরিচালনার জন্য ব্যবহৃত।
- Mapper Resource: এখানে EmployeeMapper.xml ফাইলটি রেফারেন্স করা হয়েছে, যা SQL কুয়েরিগুলি সংজ্ঞায়িত করবে।
Step 2: Mapper XML File for SQL Statements
এখন, আমরা Mapper XML ফাইল তৈরি করব, যেখানে SQL কুয়েরিগুলি সংজ্ঞায়িত করা হবে। এই ফাইলটি SQL statements এবং JavaBeans এর মধ্যে ম্যাপিং তৈরি করবে।
Example: EmployeeMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMap PUBLIC "-//iBATIS//DTD SQL Map 2.0//EN" "http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap namespace="com.example.mapper.EmployeeMapper">
<!-- SQL Statement for Selecting an Employee by ID -->
<select id="getEmployeeById" resultClass="com.example.model.Employee">
SELECT id, name, salary FROM employees WHERE id = #id#
</select>
<!-- SQL Statement for Inserting a New Employee -->
<insert id="insertEmployee" parameterClass="com.example.model.Employee">
INSERT INTO employees (name, salary) VALUES (#name#, #salary#)
</insert>
<!-- SQL Statement for Updating an Employee's Salary -->
<update id="updateEmployee" parameterClass="com.example.model.Employee">
UPDATE employees SET salary = #salary# WHERE id = #id#
</update>
<!-- SQL Statement for Deleting an Employee -->
<delete id="deleteEmployee" parameterClass="int">
DELETE FROM employees WHERE id = #id#
</delete>
</sqlMap>
Explanation of SQL Statements:
<select>:getEmployeeByIdএকটিSELECTকুয়েরি, যাidএর ভিত্তিতে কর্মচারী ডেটা রিট্রিভ করে। এটিEmployeeক্লাসে ম্যাপ করা হয়েছে (ডেটাবেস টেবিলের কলামid,name,salaryপ্রপার্টি হিসেবে)।<insert>:insertEmployeeএকটিINSERTকুয়েরি, যাEmployeeঅবজেক্টেরnameএবংsalaryডেটাবেসে সন্নিবেশ করে।<update>:updateEmployeeএকটিUPDATEকুয়েরি, যা কর্মচারীর salary আপডেট করে তার id এর ভিত্তিতে।<delete>:deleteEmployeeএকটিDELETEকুয়েরি, যাidব্যবহার করে কর্মচারীকে ডেটাবেস থেকে মুছে ফেলে।
Parameter Mapping:
- iBATIS XML Mapper ফাইলে,
#parameter#ব্যবহার করে SQL কুয়েরিতে parameter binding করা হয়। উদাহরণস্বরূপ,#id#,#name#, এবং#salary#হল সেগুলি যা Java objects থেকে ম্যাপ করা হয়।
Step 3: Java Model Class for Data Mapping
iBATIS ব্যবহার করে SQL কুয়েরি চালানোর সময় ডেটাবেসের ফলাফল JavaBeans-এ ম্যাপ করা হয়। নিচে Employee ক্লাসের একটি উদাহরণ দেওয়া হয়েছে, যা EmployeeMapper.xml এর সাথে কাজ করবে।
Employee.java
package com.example.model;
public class Employee {
private int id;
private String name;
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 double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
}
Explanation:
- Employee ক্লাসটি ডেটাবেসের employees টেবিলের জন্য একটি JavaBean হিসেবে কাজ করে এবং
id,name,salaryএর মান ধারণ করে।
Step 4: Using iBATIS (MyBatis) in Your Java Application
iBATIS-এর মাধ্যমে SQL কুয়েরি চালানো খুব সহজ। আপনি SqlSessionFactory তৈরি করে SqlSession ব্যবহার করে SQL কুয়েরি এক্সিকিউট করতে পারেন।
Example: Using iBATIS to Perform CRUD Operations
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
public class Application {
public static void main(String[] args) throws Exception {
// Load iBATIS configuration
String resource = "sql-map-config.xml";
InputStream inputStream = Application.class.getClassLoader().getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// Open a session
try (SqlSession session = sqlSessionFactory.openSession()) {
// Retrieve an employee by ID
Employee employee = session.selectOne("com.example.mapper.EmployeeMapper.getEmployeeById", 1);
System.out.println("Employee Name: " + employee.getName());
// Insert a new employee
Employee newEmployee = new Employee();
newEmployee.setName("John Doe");
newEmployee.setSalary(50000);
session.insert("com.example.mapper.EmployeeMapper.insertEmployee", newEmployee);
session.commit(); // Commit the transaction
// Update an existing employee
employee.setSalary(60000);
session.update("com.example.mapper.EmployeeMapper.updateEmployee", employee);
session.commit(); // Commit the transaction
// Delete an employee
session.delete("com.example.mapper.EmployeeMapper.deleteEmployee", 1);
session.commit(); // Commit the transaction
}
}
}
Explanation:
- SqlSessionFactory এবং SqlSession ব্যবহার করে SQL কুয়েরি চালানো হচ্ছে।
- session.selectOne(), session.insert(), session.update(), এবং session.delete() মেথডগুলির মাধ্যমে EmployeeMapper.xml এর SQL কুয়েরি এক্সিকিউট করা হচ্ছে।
iBATIS (MyBatis) একটি শক্তিশালী এবং নমনীয় ফ্রেমওয়ার্ক যা SQL statements এবং Java objects এর মধ্যে সুনির্দিষ্ট ম্যাপিং প্রদান করে। SQL Map Configuration এর মাধ্যমে আপনি SQL statements লেখতে পারেন, যা XML Mapping ফাইলের মধ্যে সংরক্ষিত থাকে এবং JavaBeans-এর সাথে সম্পর্ক স্থাপন করে। iBATIS এর সাহায্যে SQL কুয়েরিগুলি সহজভাবে কাস্টমাইজ করা যায় এবং তা Java objects এর সাথে কার্যকরীভাবে ম্যাপ করা যায়।
iBATIS, বর্তমানে MyBatis নামে পরিচিত, একটি Java ORM (Object-Relational Mapping) ফ্রেমওয়ার্ক যা SQL Mapping এর মাধ্যমে ডেটাবেস অপারেশন পরিচালনা করে। Hibernate এবং JPA এর তুলনায়, iBATIS (MyBatis) SQL কোড ম্যানুয়ালি লেখার মাধ্যমে SQL Mapping এবং Java Object Mapping সংজ্ঞায়িত করে। এতে, ডেটাবেস অপারেশন পরিচালনা করা হয় SQL স্টেটমেন্টের মাধ্যমে, যা XML ফাইলের মাধ্যমে কনফিগার করা হয়।
এখানে আলোচনা করা হবে কিভাবে SQL Statement তৈরি করতে হয় এবং তা XML ফাইলে কনফিগার করা যায়।
Step 1: Maven Dependency for MyBatis (iBATIS)
প্রথমে, pom.xml ফাইলে MyBatis লাইব্রেরি যুক্ত করতে হবে।
<dependencies>
<!-- MyBatis Core Dependency -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version> <!-- Use latest version -->
</dependency>
<!-- JDBC Driver (Example: H2 Database) -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
</dependencies>
এখানে, mybatis হল লাইব্রেরির মূল ডিপেনডেন্সি এবং h2 ডেটাবেস ড্রাইভার উদাহরণস্বরূপ ব্যবহৃত হয়েছে। আপনার প্রজেক্টে নির্দিষ্ট ডেটাবেস অনুযায়ী ড্রাইভার পরিবর্তন করতে হবে।
Step 2: MyBatis Configuration (XML Configuration)
MyBatis কনফিগারেশন সাধারণত একটি XML ফাইলে থাকে, যেখানে ডেটাবেস সংযোগ, SQL স্টেটমেন্ট এবং ম্যাপিং কনফিগার করা হয়।
mybatis-config.xml Example:
<?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>
<!-- JDBC Connection Settings -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<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>
</environment>
</environments>
<!-- MyBatis Mapper Locations -->
<mappers>
<mapper resource="com/example/mapper/EmployeeMapper.xml"/>
</mappers>
</configuration>
Explanation:
- environments:
developmentনামে একটি environment তৈরি করা হয়েছে, যেখানে transactionManager এবং dataSource কনফিগার করা হয়েছে। - dataSource: JDBC ড্রাইভার, ইউআরএল, ইউজারনেম এবং পাসওয়ার্ড এখানে সংজ্ঞায়িত করা হয়েছে।
- mappers: এখানে, MyBatis এর মেপার XML ফাইলের অবস্থান নির্ধারণ করা হয়েছে, যেখানে SQL স্টেটমেন্ট এবং তাদের Java মডেল ক্লাসের মধ্যে সম্পর্ক তৈরি করা হয়।
Step 3: Mapper Interface and XML Mapper
MyBatis এর মাধ্যমে SQL স্টেটমেন্ট এবং Java objects এর সম্পর্ক তৈরি করার জন্য Mapper Interface এবং XML Mapper ফাইল ব্যবহার করতে হয়।
Mapper Interface Example (EmployeeMapper.java)
package com.example.mapper;
import com.example.model.Employee;
import java.util.List;
public interface EmployeeMapper {
// Get all employees
List<Employee> getAllEmployees();
// Get employee by ID
Employee getEmployeeById(int id);
// Insert employee
void insertEmployee(Employee employee);
// Update employee
void updateEmployee(Employee employee);
// Delete employee by ID
void deleteEmployee(int id);
}
এখানে, EmployeeMapper ইন্টারফেসে বিভিন্ন CRUD অপারেশন সংজ্ঞায়িত করা হয়েছে।
Mapper XML Example (EmployeeMapper.xml)
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mapper.EmployeeMapper">
<!-- SQL Query to Get All Employees -->
<select id="getAllEmployees" resultType="com.example.model.Employee">
SELECT * FROM Employee
</select>
<!-- SQL Query to Get Employee by ID -->
<select id="getEmployeeById" parameterType="int" resultType="com.example.model.Employee">
SELECT * FROM Employee WHERE id = #{id}
</select>
<!-- SQL Query to Insert Employee -->
<insert id="insertEmployee" parameterType="com.example.model.Employee">
INSERT INTO Employee (name, position, salary)
VALUES (#{name}, #{position}, #{salary})
</insert>
<!-- SQL Query to Update Employee -->
<update id="updateEmployee" parameterType="com.example.model.Employee">
UPDATE Employee SET name = #{name}, position = #{position}, salary = #{salary}
WHERE id = #{id}
</update>
<!-- SQL Query to Delete Employee -->
<delete id="deleteEmployee" parameterType="int">
DELETE FROM Employee WHERE id = #{id}
</delete>
</mapper>
Explanation:
- Mapper XML ফাইলে SQL Queries লেখা হয়েছে, যেমন
SELECT,INSERT,UPDATE, এবংDELETE। এগুলিEmployeeMapperইন্টারফেসের মেথডের সাথে সম্পর্কিত। - parameterType এবং resultType ব্যবহৃত হয়েছে, যেখানে
parameterTypeহল SQL কুয়েরিতে পাঠানো প্যারামিটার এবংresultTypeহল SQL থেকে ফেরত আসা ফলাফল।
Step 4: MyBatis Session Factory and Main Code
MyBatis সেশন তৈরি করে এবং ম্যাপার ব্যবহার করে SQL স্টেটমেন্টগুলির কার্যকরী করা হয়।
Main Application Code Example (Main.java)
package com.example;
import com.example.mapper.EmployeeMapper;
import com.example.model.Employee;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
import java.util.List;
public class Main {
public static void main(String[] args) {
// MyBatis configuration and session factory setup
String resource = "mybatis-config.xml";
InputStream inputStream = Main.class.getClassLoader().getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
// Open session
try (SqlSession session = sqlSessionFactory.openSession()) {
EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);
// Get all employees
List<Employee> employees = employeeMapper.getAllEmployees();
for (Employee employee : employees) {
System.out.println(employee);
}
// Insert a new employee
Employee newEmployee = new Employee("John Doe", "Developer", 80000);
employeeMapper.insertEmployee(newEmployee);
session.commit(); // Commit the transaction
}
}
}
Explanation:
- SqlSessionFactory: MyBatis কনফিগারেশন ফাইল
mybatis-config.xmlথেকে সেশন ফ্যাক্টরি তৈরি করা হয়েছে। - Mapper Interface:
EmployeeMapperব্যবহার করে SQL কুয়েরি রিটার্ন করা হচ্ছে এবং Employee অবজেক্ট ইনসার্ট করা হচ্ছে। - session.commit(): SQL অপারেশন সম্পন্ন করার পর commit কল করা হয়েছে, যাতে ডেটাবেসে পরিবর্তন সংরক্ষণ হয়।
- SQL Map Configuration MyBatis (iBATIS) এর একটি গুরুত্বপূর্ণ অংশ, যা ডেটাবেসের সাথে যোগাযোগ এবং SQL স্টেটমেন্টগুলি Java objects এর সাথে ম্যাপ করার কাজ করে।
- Mapper Interface এবং XML Mapper ফাইল ব্যবহার করে আপনি SQL স্টেটমেন্টগুলোকে Java মেথডের সাথে সংযুক্ত করতে পারেন, এবং সেই অনুযায়ী ডেটাবেস অপারেশন পরিচালনা করতে পারেন।
- MyBatis XML কনফিগারেশন ফাইলটি MyBatis এর বিভিন্ন সেটিংস যেমন DataSource, Transaction Management, এবং SQL Statements সেটআপ করতে সহায়তা করে।
iBATIS (বর্তমানে MyBatis নামে পরিচিত) একটি জনপ্রিয় ORM (Object-Relational Mapping) ফ্রেমওয়ার্ক যা SQL কুয়েরির মাধ্যমে ডেটাবেসের সাথে কাজ করে। iBATIS ডেটাবেসের টেবিলগুলির সাথে Java Objects মেপ করতে সহায়তা করে। এতে Select, Insert, Update, এবং Delete স্টেটমেন্টের জন্য Mapping করার কাজটি সহজ হয়।
এই গাইডে আমরা Select, Insert, Update, এবং Delete কুয়েরি কিভাবে iBATIS (MyBatis) দিয়ে Java কোডে মেপিং করতে হয়, তা দেখব।
1. MyBatis Mapping Overview
MyBatis এ, SQL কুয়েরি এবং তাদের সম্পর্কিত জাভা অবজেক্টগুলির মধ্যে Mapping এর জন্য XML মেপিং ফাইল ব্যবহার করা হয়। iBATIS-এ সাধারণত Mapper XML Files ব্যবহার করে SQL কুয়েরি এবং তাদের ফলাফল মেপ করা হয়।
Example: Employee Entity Class
প্রথমে, আমাদের একটি Employee ক্লাস দরকার, যা ডেটাবেসের employee টেবিলের সাথে মেপ করা হবে।
public class Employee {
private int id;
private String name;
private String department;
// 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;
}
}
2. MyBatis Mapper XML Example
এখন, আমরা Employee ক্লাসের জন্য Mapper XML ফাইল তৈরি করব, যেখানে Select, Insert, Update, এবং Delete কুয়েরি এবং তাদের মেপিং কনফিগার করা হবে।
EmployeeMapper.xml Example:
<?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">
<!-- Select Query: Get Employee by ID -->
<select id="getEmployeeById" resultType="com.example.model.Employee">
SELECT id, name, department
FROM employee
WHERE id = #{id}
</select>
<!-- Insert Query: Insert a new Employee -->
<insert id="insertEmployee" parameterType="com.example.model.Employee">
INSERT INTO employee (name, department)
VALUES (#{name}, #{department})
</insert>
<!-- Update Query: Update Employee details -->
<update id="updateEmployee" parameterType="com.example.model.Employee">
UPDATE employee
SET name = #{name}, department = #{department}
WHERE id = #{id}
</update>
<!-- Delete Query: Delete an Employee by ID -->
<delete id="deleteEmployee" parameterType="int">
DELETE FROM employee
WHERE id = #{id}
</delete>
</mapper>
বিভিন্ন Query এর ব্যাখ্যা:
<select>:id="getEmployeeById": এই কুয়েরিEmployeeঅবজেক্টেরidদিয়ে ডেটাবেস থেকেEmployeeতথ্য রিটার্ন করবে।resultType="com.example.model.Employee": কুয়েরি রিটার্নের ফলাফল একটিEmployeeঅবজেক্টে ম্যাপ করা হবে।
<insert>:id="insertEmployee": নতুনEmployeeইনসার্ট করার জন্য SQL কুয়েরি।parameterType="com.example.model.Employee":Employeeঅবজেক্টের মধ্যে থাকা ডেটাnameএবংdepartmentহিসাবে SQL কুয়েরিতে ম্যাপ হবে।
<update>:id="updateEmployee": একটিEmployeeএর তথ্য আপডেট করতে ব্যবহৃত কুয়েরি।parameterType="com.example.model.Employee":Employeeঅবজেক্টের ডেটা SQL কুয়েরিতে আপডেট হবে।
<delete>:id="deleteEmployee": একটিEmployeeরেকর্ড ডিলিট করার জন্য SQL কুয়েরি।parameterType="int": ডিলিট অপারেশনটিidএর মাধ্যমে হবে।
3. Java Code to Use MyBatis Mapping
এখন, Java কোডে MyBatis ব্যবহারের মাধ্যমে এই কুয়েরি চালাতে হবে। আমরা SqlSession এবং Mapper ব্যবহার করে ডেটাবেস অপারেশনগুলি চালাবো।
EmployeeApp.java Example:
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.example.model.Employee;
public class EmployeeApp {
public static void main(String[] args) {
// Step 1: Build SqlSessionFactory from the configuration file
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder()
.build(EmployeeApp.class.getResourceAsStream("/sql-map-config.xml"));
// Step 2: Open a session
try (SqlSession session = sessionFactory.openSession()) {
// Step 3: Execute SQL query using the Mapper
EmployeeMapper mapper = session.getMapper(EmployeeMapper.class);
// Select Query: Get Employee by ID
Employee employee = mapper.getEmployeeById(1);
System.out.println("Employee: " + employee.getName() + ", " + employee.getDepartment());
// Insert Query: Insert a new employee
Employee newEmployee = new Employee();
newEmployee.setName("John Doe");
newEmployee.setDepartment("Finance");
mapper.insertEmployee(newEmployee);
session.commit(); // Commit transaction
// Update Query: Update an employee
employee.setName("Updated Name");
mapper.updateEmployee(employee);
session.commit(); // Commit transaction
// Delete Query: Delete an employee
mapper.deleteEmployee(1);
session.commit(); // Commit transaction
} catch (Exception e) {
e.printStackTrace();
}
}
}
4. Explanation of Java Code:
SqlSessionFactory:sql-map-config.xmlকনফিগারেশন ফাইল থেকেSqlSessionFactoryতৈরি করা হচ্ছে।SqlSession:SqlSessionঅবজেক্ট ব্যবহার করে SQL কুয়েরি চালানো হয়।mapper.getEmployeeById(1):EmployeeMapperএর মাধ্যমেgetEmployeeByIdকুয়েরি চালানো হয়।mapper.insertEmployee(newEmployee):insertEmployeeকুয়েরি ব্যবহার করে নতুন কর্মচারী ইনসার্ট করা হয়।mapper.updateEmployee(employee):updateEmployeeকুয়েরি ব্যবহার করে কর্মচারী আপডেট করা হয়।mapper.deleteEmployee(1):deleteEmployeeকুয়েরি ব্যবহার করে কর্মচারী ডিলিট করা হয়।session.commit(): ডেটাবেসে পরিবর্তন নিশ্চিত করার জন্য কমিট করা হয়।
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
এই গাইডে আমরা দেখলাম কিভাবে iBATIS (MyBatis) এর মাধ্যমে Select, Insert, Update, এবং Delete স্টেটমেন্টগুলোকে XML Mapper ফাইলের মাধ্যমে মেপ করা যায়। এই পদ্ধতিতে আপনি:
- MyBatis Mapper XML ব্যবহার করে SQL কুয়েরি তৈরি এবং তাদের Java অবজেক্টের সাথে মেপ করতে পারেন।
- SqlSession এবং Mapper এর মাধ্যমে ডেটাবেস অপারেশনগুলি পরিচালনা করতে পারেন।
- Gradle বা Maven ব্যবহার করে প্রোজেক্ট বিল্ড এবং রান করতে পারেন।
MyBatis (iBATIS) ব্যবহার করলে SQL কুয়েরি এবং ডেটাবেস অপারেশনগুলির সাথে কাজ করা খুবই সহজ এবং কার্যকরী হয়।
iBATIS (বর্তমানে MyBatis নামে পরিচিত) হল একটি powerful persistence framework যা SQL-এ dynamic queries তৈরির জন্য অনেক সুবিধা প্রদান করে। MyBatis-এ dynamic SQL তৈরি করার জন্য , , , এবং ট্যাগ ব্যবহার করা হয়। এগুলোর মাধ্যমে SQL কুয়েরি কোডকে আরও ফ্লেক্সিবল এবং ডাইনামিক করা যায়, যাতে কন্ডিশনাল কোয়েরি তৈরির কাজ সহজ হয়।
এখানে MyBatis তে dynamic SQL ব্যবহারের জন্য কিছু গুরুত্বপূর্ণ ট্যাগ এবং তাদের ব্যবহার দেখানো হবে, যেমন IF, WHERE, CHOOSE, এবং FOREACH।
1. IF Tag
<if> ট্যাগটি একটি কন্ডিশনাল স্টেটমেন্ট হিসেবে কাজ করে। এটি যদি কোনো প্যারামিটার সেট করা থাকে, তখন শুধুমাত্র সেই অংশের SQL কোড কার্যকর হবে।
Example: Using <if> for Conditional SQL
<select id="getEmployeeByConditions" resultType="Employee">
SELECT * FROM employees
<where>
<if test="name != null">
AND name = #{name}
</if>
<if test="email != null">
AND email = #{email}
</if>
</where>
</select>
Explanation:
<if test="name != null">: যদিnameপ্যারামিটারটিnullনা হয়, তবেname = #{name}শর্তটি SQL কুয়েরিতে যুক্ত হবে।<where>:whereব্লকটি এমনভাবে কাজ করে যে এটি শুধুমাত্র প্রয়োজনীয় শর্তগুলির জন্যANDযোগ করে, যাতে ভুলANDকন্ডিশন না আসে।
Usage:
Map<String, Object> params = new HashMap<>();
params.put("name", "John");
params.put("email", "john.doe@example.com");
List<Employee> employees = sqlSession.selectList("getEmployeeByConditions", params);
2. WHERE Tag
<where> ট্যাগটি SQL কুয়েরির WHERE ক্লজে শর্ত যোগ করতে ব্যবহৃত হয়। এটি স্বয়ংক্রিয়ভাবে AND বা OR যুক্ত করে, যাতে কন্ডিশনাল SQL কোড আরও সঠিকভাবে লেখা যায়।
Example: Using <where> for SQL Conditions
<select id="getEmployeeByWhere" resultType="Employee">
SELECT * FROM employees
<where>
<if test="id != null">AND id = #{id}</if>
<if test="name != null">AND name = #{name}</if>
</where>
</select>
Explanation:
<where>: এটি SQL কুয়েরির শুরুতে যোগ হয় এবং ভিতরের শর্তগুলিকেANDদিয়ে যোগ করা হয়। যদি কোন শর্ত না থাকে, তবেWHEREক্লজটি ব্যতিক্রমীভাবে যুক্ত হবে না।
Usage:
Map<String, Object> params = new HashMap<>();
params.put("id", 1);
params.put("name", "John");
List<Employee> employees = sqlSession.selectList("getEmployeeByWhere", params);
3. CHOOSE Tag
<choose> ট্যাগটি একটি if-else কন্ডিশনের মতো কাজ করে। এটি একাধিক শর্তগুলোর মধ্যে প্রথম সত্য শর্তটি নির্বাচিত করে।
Example: Using <choose> for Conditional SQL
<select id="getEmployeeByType" resultType="Employee">
SELECT * FROM employees
<where>
<choose>
<when test="type == 'full-time'">
AND type = 'full-time'
</when>
<when test="type == 'part-time'">
AND type = 'part-time'
</when>
<otherwise>
AND type IS NULL
</otherwise>
</choose>
</where>
</select>
Explanation:
<choose>: এটি একাধিক শর্তের মধ্যে প্রথম সত্য শর্তটি নির্বাচন করবে। প্রথম<when>শর্তটি যদিtrueহয়, তাহলে পরবর্তী শর্তগুলি পরীক্ষা করা হবে না।<otherwise>: এটি একটি ডিফল্ট শর্ত, যা সব শর্ত ফেইল হলে কার্যকর হবে।
Usage:
Map<String, String> params = new HashMap<>();
params.put("type", "full-time");
List<Employee> employees = sqlSession.selectList("getEmployeeByType", params);
4. FOREACH Tag
<foreach> ট্যাগটি একটি লিস্ট বা অ্যারে থেকে ডেটা নিয়ে SQL কুয়েরিতে ডাইনামিক ভাবে ইনপুট হিসেবে ব্যবহৃত হয়, যেমন IN কন্ডিশন।
Example: Using <foreach> for Dynamic SQL in IN Clause
<select id="getEmployeesByIds" resultType="Employee">
SELECT * FROM employees
WHERE id IN
<foreach item="id" collection="ids" open="(" close=")" separator=",">
#{id}
</foreach>
</select>
Explanation:
<foreach>: এটি একটি লুপের মত কাজ করে এবংidsলিস্টের প্রতিটি উপাদানকেINকন্ডিশনে যোগ করে।open="("এবংclose=")": এটি SQL কুয়েরিরINক্লজে()যোগ করে।separator=",": এটি লিস্টের মধ্যে কমা যোগ করে।
Usage:
List<Integer> ids = Arrays.asList(1, 2, 3, 4);
Map<String, Object> params = new HashMap<>();
params.put("ids", ids);
List<Employee> employees = sqlSession.selectList("getEmployeesByIds", params);
5. Combining All Dynamic SQL Tags
আপনি বিভিন্ন ডাইনামিক SQL ট্যাগ যেমন <if>, <choose>, <where>, এবং <foreach> একসাথে ব্যবহার করতে পারেন, যাতে আরও জটিল কুয়েরি তৈরি করা যায়।
Example: Combining All Dynamic SQL Tags
<select id="getEmployeesByConditions" resultType="Employee">
SELECT * FROM employees
<where>
<if test="name != null">AND name = #{name}</if>
<if test="age != null">AND age = #{age}</if>
<choose>
<when test="status == 'active'">
AND status = 'active'
</when>
<when test="status == 'inactive'">
AND status = 'inactive'
</when>
<otherwise>
AND status IS NULL
</otherwise>
</choose>
<if test="ids != null and ids.size() > 0">
AND id IN
<foreach item="id" collection="ids" open="(" close=")" separator=",">
#{id}
</foreach>
</if>
</where>
</select>
Explanation:
<where>: এই অংশটি সমস্ত শর্তের জন্য একটিWHEREক্লজ তৈরি করে এবং অপ্রয়োজনীয়ANDগুলো বাদ দেয়।<if>: নির্দিষ্ট কন্ডিশনের উপর ভিত্তি করে শর্ত যোগ করা হয়।<choose>:statusএর জন্য শর্ত নির্বাচন করা হয়।<foreach>: একটি লিস্ট বা অ্যারের আইডি দিয়েINকন্ডিশন তৈরি করা হয়।
MyBatis (আগে iBATIS) ডাইনামিক SQL তৈরি করার জন্য অনেক শক্তিশালী ট্যাগ প্রদান করে। এগুলি:
<if>: SQL কুয়েরি শর্ত যোগ করতে ব্যবহার করা হয়।<where>: স্বয়ংক্রিয়ভাবেWHEREক্লজ যোগ করা হয় এবং অপ্রয়োজনীয়ANDবাORবাদ দেওয়া হয়।<choose>: একাধিক কন্ডিশনের মধ্যে একটি সিলেক্ট করতে ব্যবহার করা হয় (যেমনif-elseকাজ করে)।<foreach>: লিস্ট বা অ্যারে থেকে ডেটা নিয়েINকন্ডিশনে যুক্ত করা হয়।
এই ডাইনামিক SQL ট্যাগগুলি ব্যবহার করে আপনি খুব সহজে কাস্টম SQL কুয়েরি তৈরি করতে পারবেন যা ডেটাবেস অপারেশনের জন্য আরও বেশি ফ্লেক্সিবল এবং পারফরম্যান্সে কার্যকরী।
iBATIS (বর্তমানে MyBatis নামে পরিচিত) হল একটি ORM (Object-Relational Mapping) ফ্রেমওয়ার্ক যা SQL এবং Java Objects এর মধ্যে ম্যাপিং (mapping) সহজে করে। এটি Hibernate-এর মতো সম্পূর্ণ ORM ফ্রেমওয়ার্ক না হলেও, এটি SQL কুয়েরি পরিচালনার জন্য একটি সরল এবং কার্যকরী পদ্ধতি প্রদান করে। iBATIS-এ, আপনি SQL কোয়েরি ব্যবহার করেন এবং Java objects এর সাথে তাদের ম্যাপিং করতে পারেন, যার ফলে ডেটাবেস থেকে আসা ফলাফলগুলোকে Java objects-এ রূপান্তরিত করা সহজ হয়।
iBATIS/ MyBatis এ SQL এবং Java Objects এর মধ্যে ম্যাপিং করার জন্য একটি নির্দিষ্ট পদ্ধতি রয়েছে, যার মাধ্যমে আপনি ResultSet কে Java objects-এ কনভার্ট করতে পারবেন। এটি XML-based SQL mapping files এবং annotations ব্যবহার করে করা হয়।
এখানে iBATIS-এ SQL এবং Java Objects এর মধ্যে ম্যাপিং করার বিস্তারিত উদাহরণ দেওয়া হয়েছে।
1. MyBatis/iBATIS Configuration
iBATIS (MyBatis) ব্যবহার করার জন্য প্রথমে কনফিগারেশন করতে হয়, যেমন mybatis-config.xml এবং SQL Mapper XML। এই কনফিগারেশনগুলো ডেটাবেস সংযোগ এবং SQL কুয়েরি অপারেশনগুলো কাস্টমাইজ করে।
a) Create 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>
<!-- Environments Configuration -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/your_database_name"/>
<property name="username" value="your_database_username"/>
<property name="password" value="your_database_password"/>
</dataSource>
</environment>
</environments>
<!-- Mapper files -->
<mappers>
<mapper resource="com/example/mappers/StudentMapper.xml"/>
</mappers>
</configuration>
Explanation:
<dataSource>: ডেটাবেসের সংযোগ কনফিগারেশন (JDBC URL, ড্রাইভার, ইউজারনেম, পাসওয়ার্ড)।<mappers>: এখানে StudentMapper.xml ফাইলটির রেফারেন্স দেওয়া হয়েছে, যেখানে SQL কুয়েরি এবং Java objects এর মধ্যে ম্যাপিং করা হয়েছে।
2. SQL and Java Object Mapping with MyBatis
MyBatis (iBATIS) ব্যবহার করে SQL কুয়েরি এবং Java objects এর মধ্যে ম্যাপিং করার জন্য Mapper XML ফাইল এবং Java Mapper Interface তৈরি করতে হবে।
a) Create StudentMapper.xml for SQL Mapping:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.mappers.StudentMapper">
<!-- Select Query to retrieve student details by ID -->
<select id="selectStudent" resultType="com.example.Student">
SELECT id, name, course FROM student WHERE id = #{id}
</select>
<!-- Insert Query to add a new student -->
<insert id="insertStudent" parameterType="com.example.Student">
INSERT INTO student (name, course) VALUES (#{name}, #{course})
</insert>
<!-- Update Query to update student details -->
<update id="updateStudent" parameterType="com.example.Student">
UPDATE student SET name = #{name}, course = #{course} WHERE id = #{id}
</update>
<!-- Delete Query to remove a student -->
<delete id="deleteStudent" parameterType="int">
DELETE FROM student WHERE id = #{id}
</delete>
</mapper>
Explanation:
<select>: এটি একটি SQL SELECT কুয়েরি যাidএর মাধ্যমে Student অবজেক্টকে রিট্রিভ করে এবংresultTypeএcom.example.Studentক্লাস নির্ধারণ করে, যা SQL ফলাফলকে Student অবজেক্টে ম্যাপ করবে।<insert>,<update>,<delete>: এই কুয়েরিগুলি যথাক্রমে নতুন ছাত্র সেভ, ছাত্রের তথ্য আপডেট, এবং ছাত্র মুছে ফেলতে ব্যবহৃত হয়।
3. Mapper Interface in Java
MyBatis বা iBATIS-এ Mapper Interface ব্যবহার করা হয়, যা XML ফাইলের কুয়েরি স্টেটমেন্টগুলোর সাথে Java কোডের মধ্যে সংযোগ স্থাপন করে।
Example: StudentMapper Interface
package com.example.mappers;
import com.example.Student;
public interface StudentMapper {
// Select student by id
Student selectStudent(int id);
// Insert a new student
void insertStudent(Student student);
// Update student information
void updateStudent(Student student);
// Delete a student by id
void deleteStudent(int id);
}
Explanation:
selectStudent(int id): এটি selectStudent SQL কুয়েরিকে কল করে, যাidদিয়ে Student অবজেক্ট রিট্রিভ করবে।insertStudent(Student student): এটি insertStudent SQL কুয়েরিকে কল করে, যা Student অবজেক্ট ইনসার্ট করবে।updateStudent(Student student): এটি updateStudent SQL কুয়েরিকে কল করে, যা Student অবজেক্ট আপডেট করবে।deleteStudent(int id): এটি deleteStudent SQL কুয়েরিকে কল করে, যাidদ্বারা একটি ছাত্র মুছে ফেলবে।
4. Using MyBatis in Java Code
Java কোডে MyBatis ব্যবহারের জন্য, প্রথমে SqlSessionFactory এবং SqlSession তৈরি করতে হবে, যা SQL কুয়েরি চালানোর জন্য ব্যবহৃত হয়।
Example: Using MyBatis in Java
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.io.Resources;
import java.io.InputStream;
public class MyBatisUtil {
private static SqlSessionFactory sessionFactory;
static {
try {
// Load MyBatis configuration file
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (Exception e) {
e.printStackTrace();
}
}
// Method to get a SqlSession
public static SqlSession getSession() {
return sessionFactory.openSession();
}
}
Using the Mapper Interface:
import org.apache.ibatis.session.SqlSession;
public class StudentDAO {
public Student getStudentById(int id) {
try (SqlSession session = MyBatisUtil.getSession()) {
// Get the mapper instance
StudentMapper mapper = session.getMapper(StudentMapper.class);
// Call the method to retrieve student by id
return mapper.selectStudent(id);
}
}
public void saveStudent(Student student) {
try (SqlSession session = MyBatisUtil.getSession()) {
// Get the mapper instance
StudentMapper mapper = session.getMapper(StudentMapper.class);
// Call the method to insert the student
mapper.insertStudent(student);
// Commit the transaction
session.commit();
}
}
}
Explanation:
getMapper():getMapper()মেথডের মাধ্যমে StudentMapper ইন্টারফেসটি ইনস্ট্যান্স করা হয় এবং SQL কুয়েরি কার্যকর করা হয়।session.commit(): ডেটাবেসে পরিবর্তন সেভ করতে commit() মেথড ব্যবহার করা হয়।
5. Using Annotations for SQL Mapping (Alternative to XML)
iBATIS/MyBatis-এ Annotations ব্যবহার করে SQL কুয়েরি ম্যানেজ করা সম্ভব। এটি XML ফাইলের পরিবর্তে Java কোডে SQL কুয়েরি নির্ধারণ করতে ব্যবহৃত হয়।
Example: Using Annotations for Mapping
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Select;
public interface StudentMapper {
@Select("SELECT * FROM student WHERE id = #{id}")
Student selectStudent(int id);
@Insert("INSERT INTO student (name, course) VALUES (#{name}, #{course})")
void insertStudent(Student student);
}
Explanation:
@Select: SQLSELECTকুয়েরি ব্যবহার করা হয়।@Insert: SQLINSERTকুয়েরি ব্যবহার করা হয়।
iBATIS (MyBatis)-এ SQL এবং Java Objects এর মধ্যে ম্যাপিং করার জন্য Mapper XML ফাইল এবং Java Mapper Interface ব্যবহার করা হয়। আপনি XML-based configuration অথবা Annotations এর মাধ্যমে SQL কুয়েরি পরিচালনা করতে পারেন। MyBatis-এর সাথে SQL কোয়েরি এবং Java objects-এর মধ্যে ম্যাপিং ব্যবস্থাপনা সহজ এবং কাস্টমাইজযোগ্য হয়, কারণ আপনি SQL কুয়েরি সম্পূর্ণরূপে কাস্টমাইজ করতে পারেন এবং Java objects-এ ফলাফল ম্যাপ করতে পারেন।
Read more