iBATIS (MyBatis) একটি শক্তিশালী ফ্রেমওয়ার্ক যা SQL কুয়েরি এবং Java objects এর মধ্যে সম্পর্ক স্থাপন করতে সহায়ক। একদিকে iBATIS আপনার SQL কুয়েরি কাস্টমাইজড এবং JavaBeans-এর সাথে ডেটাবেসের মধ্যে ম্যাপিং করতে দেয়, অন্যদিকে আপনি stored procedures-কে iBATIS-এর মাধ্যমে সহজেই কল করতে পারেন।
Stored Procedures হল ডেটাবেসের মধ্যে সংরক্ষিত SQL কুয়েরি ব্লক যা পুনরায় ব্যবহারযোগ্য, এবং এতে ডেটাবেস অপারেশন (যেমন: ইনসার্ট, আপডেট, ডিলিট, সিলেক্ট) করা যায়। iBATIS (MyBatis) স্টোরড প্রোসিজার কলের মাধ্যমে আপনি সেই কুয়েরিগুলিকে Java application থেকে কার্যকর করতে পারেন।
iBATIS এর সাথে Stored Procedures ব্যবহার করার পদ্ধতি
iBATIS-এর মাধ্যমে স্টোরড প্রোসিজার কল করার জন্য আপনাকে Mapper XML ফাইলের মধ্যে স্টোরড প্রোসিজারের SQL স্টেটমেন্ট এবং প্যারামিটারগুলি ডিফাইন করতে হবে। iBATIS স্টোরড প্রোসিজারগুলির সাথে যোগাযোগ করতে <select>, <insert>, <update>, এবং <delete> ট্যাগের মাধ্যমে কাজ করতে দেয়।
Step 1: Stored Procedure in the Database
প্রথমে আপনাকে ডেটাবেসে একটি Stored Procedure তৈরি করতে হবে। উদাহরণস্বরূপ, একটি স্টোরড প্রোসিজার তৈরি করি যা employee টেবিল থেকে কর্মচারী তথ্য সিলেক্ট করবে।
Example: Stored Procedure in MySQL
DELIMITER
DELIMITER ;
এখানে, GetEmployeeById স্টোরড প্রোসিজারটি emp_id ইনপুট প্যারামিটার নেয় এবং employees টেবিল থেকে সেই আইডি সহ কর্মচারীর তথ্য রিটার্ন করে।
Step 2: iBATIS Mapper XML Configuration
এখন EmployeeMapper.xml ফাইলে এই স্টোরড প্রোসিজারটি কল করতে হবে।
Example: Mapper XML with Stored Procedure
<?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 Mapping for Stored Procedure -->
<select id="getEmployeeById" statementType="CALLABLE" resultClass="com.example.model.Employee">
{CALL GetEmployeeById(#{empId, mode=IN, jdbcType=INTEGER})}
</select>
</sqlMap>
Explanation:
statementType="CALLABLE": এখানেstatementType="CALLABLE"ব্যবহার করা হয়েছে যা স্টোরড প্রোসিজারের জন্য সঠিক JDBC কুয়েরি টাইপ নির্ধারণ করে।{CALL GetEmployeeById(#{empId})}: স্টোরড প্রোসিজারGetEmployeeByIdকে কল করা হচ্ছে এবংempIdপ্যারামিটারটি স্টোরড প্রোসিজারের ইনপুট হিসেবে পাস করা হচ্ছে।mode=IN: এটি ইনপুট প্যারামিটার হিসেবে empId নির্দেশ করে।
Step 3: Java Model Class (Employee.java)
iBATIS-এ স্টোরড প্রোসিজার থেকে ডেটা মডেল করার জন্য JavaBean ক্লাস তৈরি করতে হবে।
Example: 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 ক্লাসটি JavaBean হিসেবে কাজ করছে, যেখানে ডেটাবেস টেবিলের
id,name, এবংsalaryপ্রপার্টি সংরক্ষিত রয়েছে।
Step 4: Using iBATIS to Call the Stored Procedure
এখন, SqlSession ব্যবহার করে স্টোরড প্রোসিজার কল করতে হবে।
Example: Calling Stored Procedure in Java
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 MyBatis 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()) {
// Call the stored procedure to get employee by ID
Employee employee = session.selectOne("com.example.mapper.EmployeeMapper.getEmployeeById", 1);
System.out.println("Employee Name: " + employee.getName());
}
}
}
Explanation:
- session.selectOne(): এখানে
selectOneমেথডটি ব্যবহার করা হয়েছে যাgetEmployeeByIdস্টোরড প্রোসিজারের মাধ্যমে একক কর্মচারী তথ্য রিটার্ন করে। - "com.example.mapper.EmployeeMapper.getEmployeeById": এটি Mapper XML ফাইলের মধ্যে
getEmployeeByIdনামক স্টোরড প্রোসিজার কল করে।
Step 5: Handling Output Parameters in Stored Procedures
iBATIS ব্যবহার করে আপনি output parameters ও হ্যান্ডল করতে পারেন। যেমন, যদি আপনার স্টোরড প্রোসিজার আউটপুট প্যারামিটার ফিরিয়ে দেয়, তবে আপনি সেগুলি #{} সিনট্যাক্সের মাধ্যমে ম্যানিপুলেট করতে পারবেন।
Example: Stored Procedure with Output Parameters in MySQL
DELIMITER
DELIMITER ;
এখানে, emp_salary একটি আউটপুট প্যারামিটার যা কর্মচারীর salary রিটার্ন করবে।
iBATIS Mapper for Output Parameters
<select id="getEmployeeSalary" statementType="CALLABLE" resultClass="java.lang.Double">
{CALL GetEmployeeSalary(#{empId, mode=IN, jdbcType=INTEGER}, #{empSalary, mode=OUT, jdbcType=DOUBLE})}
</select>
Explanation:
#{empSalary, mode=OUT, jdbcType=DOUBLE}: আউটপুট প্যারামিটারempSalaryকে OUT হিসেবে নির্ধারণ করা হয়েছে।resultClass="java.lang.Double": আউটপুট প্যারামিটার হিসেবেDoubleটাইপ ব্যবহার করা হয়েছে, কারণ এটি salary রিটার্ন করবে।
iBATIS (MyBatis) স্টোরড প্রোসিজার ব্যবহারের মাধ্যমে SQL কুয়েরি এবং Java objects এর মধ্যে সম্পর্ক আরও শক্তিশালী এবং নমনীয় হয়ে ওঠে। iBATIS এর dynamic SQL ফিচারের সাথে স্টোরড প্রোসিজার কল করার ক্ষমতা আপনাকে ডেটাবেস অপারেশনগুলিকে আরও কাস্টমাইজড এবং দক্ষ করতে সাহায্য করে।
স্টোরড প্রোসিজারগুলি ব্যবহার করে আপনি বড় এবং জটিল ডেটাবেস অপারেশনগুলি সহজভাবে এবং পুনঃব্যবহারযোগ্যভাবে পরিচালনা করতে পারবেন। iBATIS এর মাধ্যমে আপনি input, output parameters, এবং result mapping এর মাধ্যমে স্টোরড প্রোসিজার কুয়েরি করতে পারেন এবং ডেটাবেস ইন্টারঅ্যাকশনকে আরও কার্যকরী ও নিরাপদ করতে পারবেন।
iBATIS (বর্তমানে MyBatis নামে পরিচিত) একটি SQL Mapping Framework যা ডেটাবেসের সাথে Java objects এর সম্পর্ক তৈরি করে এবং SQL স্টেটমেন্টগুলির মাধ্যমে ডেটাবেস অপারেশন পরিচালনা করে। Stored Procedure হল একটি প্রি-কম্পাইলড SQL কোডের ব্লক যা ডেটাবেসের মধ্যে সংরক্ষিত থাকে এবং বিভিন্ন ডেটাবেস অপারেশন সম্পাদন করার জন্য ব্যবহার করা হয়। Stored Procedure সাধারণত INSERT, UPDATE, DELETE, SELECT ইত্যাদি SQL অপারেশন করতে পারে এবং এটি ডেটাবেসে প্রসেসিং করতে ব্যবহার হয়।
MyBatis (iBATIS) তে, আপনি Stored Procedures ব্যবহার করতে পারেন এবং SQL Mapping এর মাধ্যমে Java কোডের সাথে তাদের একত্রিত করতে পারেন। এখানে আলোচনা করা হবে Stored Procedure কী এবং MyBatis-এ এটি কিভাবে কাজ করে।
Stored Procedure: Definition
Stored Procedure হল একটি SQL কোডের গ্রুপ যা ডেটাবেসে সংরক্ষিত থাকে এবং ডেটাবেস অ্যাপ্লিকেশন থেকে বার বার ব্যবহার করা যায়। এটি একটি প্রি-কংফিগারড SQL অপারেশন যা ডেটাবেস সার্ভারে রান করা হয়, ফলে সার্ভারের মাধ্যমে reusable, performant, এবং modular SQL কোড তৈরি করা যায়।
Stored Procedure এর মূল সুবিধা:
- Code Reusability: একবার কোড লিখে সেটি বার বার ব্যবহার করা যায়।
- Performance: Precompiled SQL কোড ডেটাবেসে রান হয়, যা অনেক দ্রুত হতে পারে।
- Security: SQL কোড ডেটাবেস সার্ভারে থাকে, ফলে ক্লায়েন্ট অ্যাপ্লিকেশনটি ডেটাবেস কোডের সাথে সরাসরি ইন্টারঅ্যাক্ট করে না, যা সিকিউরিটি বাড়ায়।
Stored Procedure কিভাবে কাজ করে MyBatis (iBATIS) এ
MyBatis-এ Stored Procedures ব্যবহার করতে হলে, আপনাকে XML Mapper ফাইল এবং Mapper Interface তৈরি করতে হবে, যেখানে আপনি Stored Procedure এর জন্য SQL কোড এবং প্যারামিটার পাস করতে পারবেন। MyBatis SQL Mapping এর মাধ্যমে আপনি stored procedures চালাতে পারেন এবং সেই অনুযায়ী রেজাল্ট ম্যাপ করতে পারেন।
Step 1: Stored Procedure in MySQL Example
ধরা যাক, আমাদের একটি Employee টেবিল আছে এবং একটি stored procedure রয়েছে যেটি একটি কর্মচারীর তথ্য আপডেট করতে ব্যবহৃত হবে।
Stored Procedure Definition (MySQL):
DELIMITER
DELIMITER ;
এই stored procedure টি emp_id এবং new_salary ইনপুট প্যারামিটার হিসাবে গ্রহণ করে এবং উল্লিখিত কর্মচারীর salary আপডেট করে।
Step 2: MyBatis Configuration for Stored Procedure
mybatis-config.xml Example:
MyBatis কনফিগারেশন ফাইলের মধ্যে ডেটাবেস সংযোগ এবং mapper ফাইলের অবস্থান নির্ধারণ করা হয়।
<?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 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>
<mappers>
<mapper resource="com/example/mapper/EmployeeMapper.xml"/>
</mappers>
</configuration>
Explanation:
- environments: ডেটাবেস সংযোগ কনফিগারেশন এবং transactionManager কনফিগার করা হয়েছে।
- mappers: এখানে EmployeeMapper.xml ফাইলের অবস্থান নির্ধারণ করা হয়েছে, যেখানে SQL স্টেটমেন্ট এবং stored procedure কনফিগারেশন করা হবে।
Step 3: Mapper XML for Stored Procedure
MyBatis XML Mapper ফাইলে আপনি Stored Procedure কল এবং প্যারামিটার পাস করতে পারেন।
EmployeeMapper.xml Example:
<?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">
<!-- Stored Procedure to Update Employee Salary -->
<update id="updateEmployeeSalary">
{ CALL update_employee_salary(#{emp_id, mode=IN}, #{new_salary, mode=IN}) }
</update>
</mapper>
Explanation:
- :
id="updateEmployeeSalary"স্টোরড প্রোসিডিউর কল করার জন্য ব্যবহার করা হয়েছে। এটিCALLSQL স্টেটমেন্ট ব্যবহার করে, যা MySQL তে স্টোরড প্রোসিডিউর চালানোর জন্য ব্যবহৃত হয়। - #{emp_id, mode=IN}: emp_id এবং new_salary ইনপুট প্যারামিটার হিসেবে স্টোরড প্রোসিডিউরে পাস করা হয়।
mode=INমানে, এটি একটি ইনপুট প্যারামিটার।
Step 4: Mapper Interface
MyBatis এ Mapper Interface ব্যবহার করে আপনি স্টোরড প্রোসিডিউর চালাতে পারেন এবং SQL ফলাফল অর্জন করতে পারেন।
EmployeeMapper Interface:
package com.example.mapper;
import org.apache.ibatis.annotations.Param;
public interface EmployeeMapper {
// Call Stored Procedure to Update Employee Salary
void updateEmployeeSalary(@Param("emp_id") int empId, @Param("new_salary") double newSalary);
}
Explanation:
- @Param Annotation:
@Param("emp_id")এবং@Param("new_salary")এর মাধ্যমে প্যারামিটার নাম নির্ধারণ করা হয়। এই অ্যানোটেশন ব্যবহার করা হয় যাতে XML Mapper ফাইলে প্যারামিটার মান পাস করা যায়।
Step 5: Main Code to Call Stored Procedure
এখন, আপনি Stored Procedure কল করতে এবং EmployeeMapper ইন্টারফেস ব্যবহার করতে পারবেন।
Main.java:
package com.example;
import com.example.mapper.EmployeeMapper;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
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);
// Call the stored procedure to update employee salary
employeeMapper.updateEmployeeSalary(1, 75000.0); // Example: Update salary of employee with ID = 1
session.commit(); // Commit the transaction
}
}
}
Explanation:
- updateEmployeeSalary method: এটি
EmployeeMapperইন্টারফেসের মাধ্যমে স্টোরড প্রোসিডিউর কল করে, এবং কর্মচারীর salary আপডেট করে। - session.commit(): SQL অপারেশন সম্পন্ন হওয়ার পর ট্রানজেকশন কমিট করা হয়।
Stored Procedure in MyBatis: Best Practices
- Exception Handling:
- স্টোরড প্রোসিডিউর কল করার সময় যে কোনো ত্রুটি ঘটলে তা হ্যান্ডেল করতে হবে। MyBatis তে try-catch ব্লক ব্যবহার করে exception হ্যান্ডলিং করা উচিত।
- Proper Transaction Management:
- স্টোরড প্রোসিডিউর সাধারণত একাধিক ডেটাবেস অপারেশন সম্পন্ন করে, তাই transaction management খুবই গুরুত্বপূর্ণ। MyBatis-এ ট্রানজেকশন ম্যানেজমেন্ট কনফিগারেশন এবং commit/rollback ব্যবহারে মনোযোগ দিন।
- Optimize Stored Procedures:
- স্টোরড প্রোসিডিউরগুলি ডেটাবেস সার্ভারে একাধিক অপারেশন একসাথে সম্পাদন করার জন্য ব্যবহার করা হয়। সুতরাং, স্টোরড প্রোসিডিউরগুলি সঠিকভাবে অপটিমাইজ করা উচিত যাতে পারফরম্যান্স ইস্যু না হয়।
- Use of Parameterized Queries:
- স্টোরড প্রোসিডিউরগুলিতে ইনপুট প্যারামিটারগুলি সঠিকভাবে ব্যবহৃত হলে SQL ইনজেকশন থেকে রক্ষা পাওয়া যায়। MyBatis এ parameterized queries ব্যবহার করলে এটি সুরক্ষিত থাকে।
MyBatis (iBATIS) তে Stored Procedures ব্যবহার একটি শক্তিশালী পদ্ধতি যা ডেটাবেস অপারেশনগুলিকে দ্রুত এবং কার্যকরীভাবে সম্পন্ন করতে সাহায্য করে। MyBatis এর মাধ্যমে, আপনি SQL স্টেটমেন্টগুলি তৈরি করতে পারেন এবং XML Mapper এবং Mapper Interface ব্যবহার করে stored procedure কল করতে পারেন। এর মাধ্যমে আপনি modular, performant, এবং secure ডেটাবেস অপারেশন সম্পাদন করতে পারেন।
iBATIS (বর্তমানে MyBatis) একটি ORM ফ্রেমওয়ার্ক যা ডেটাবেসের সাথে SQL কুয়েরি এবং স্টোরড প্রোসিজারগুলি চালানোর জন্য ব্যবহৃত হয়। স্টোরড প্রোসিজার (Stored Procedure) হল ডেটাবেসে সংরক্ষিত SQL কোডের একটি সেট যা নির্দিষ্ট কাজ সম্পন্ন করতে ব্যবহৃত হয়। iBATIS বা MyBatis এর মাধ্যমে স্টোরড প্রোসিজার কল করার পদ্ধতি সহজ এবং কার্যকর।
MyBatis-এ স্টোরড প্রোসিজার কল করতে, আপনাকে SQL মেপিং ফাইলে call স্টেটমেন্ট ব্যবহার করতে হবে এবং SqlSession বা SqlMapper এর মাধ্যমে জাভা কোড থেকে ওই প্রোসিজার কল করতে হবে।
Step 1: Stored Procedure তৈরি করা
প্রথমে, একটি সাধারণ স্টোরড প্রোসিজার তৈরি করা যাক। ধরুন আমাদের একটি Employee টেবিল আছে, এবং আমরা একটি স্টোরড প্রোসিজার তৈরি করব যা একটি কর্মচারীকে ইনসার্ট করবে এবং ইনসার্ট হওয়া কর্মচারীর আইডি রিটার্ন করবে।
Example Stored Procedure in MySQL:
DELIMITER
DELIMITER ;
এটি একটি স্টোরড প্রোসিজার যা কর্মচারী নাম এবং বিভাগ ইনপুট হিসেবে নেয় এবং নতুন কর্মচারী তৈরি করে এবং তার ID আউটপুট হিসেবে রিটার্ন করে।
Step 2: MyBatis Configuration (sql-map-config.xml)
আমাদের sql-map-config.xml কনফিগারেশন ফাইল সেটআপ করতে হবে, যাতে ডেটাবেস সংযোগ এবং স্টোরড প্রোসিজার ব্যবহার করা যায়।
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE sqlMapConfig PUBLIC "-//iBATIS//DTD SQL Map Config 3.0//EN" "http://ibatis.apache.org/dtd/sql-map-config-3.dtd">
<sqlMapConfig>
<!-- DataSource Configuration -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mydatabase"/>
<property name="username" value="root"/>
<property name="password" value="password"/>
</dataSource>
<!-- Transaction Manager Configuration -->
<transactionManager type="JDBC"/>
<!-- Mapper Files -->
<sqlMap resource="com/example/mapper/EmployeeMapper.xml"/>
</sqlMapConfig>
এখানে:
dataSource: MySQL ডেটাবেসের জন্য ড্রাইভার, URL, ইউজারনেম এবং পাসওয়ার্ড কনফিগার করা হয়েছে।transactionManager:JDBCভিত্তিক ট্রানজেকশন ম্যানেজার ব্যবহার করা হয়েছে।
Step 3: MyBatis Mapper XML (EmployeeMapper.xml)
এখন, আমাদের EmployeeMapper.xml ফাইলে স্টোরড প্রোসিজার কল করার কুয়েরি সংজ্ঞায়িত করতে হবে।
EmployeeMapper.xml Example (for Stored Procedure Call):
<?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">
<!-- Call the Stored Procedure to insert an employee -->
<select id="insertEmployee" statementType="CALLABLE" parameterClass="map" resultClass="int">
{CALL insertEmployee(
#{employeeName, mode=IN, jdbcType=VARCHAR},
#{employeeDept, mode=IN, jdbcType=VARCHAR},
#{employeeId, mode=OUT, jdbcType=INTEGER}
)}
</select>
</mapper>
Explanation:
statementType="CALLABLE": এটি MyBatis কে জানায় যে এই কুয়েরি একটি স্টোরড প্রোসিজার কল করছে।parameterClass="map":Mapপ্যারামিটার হিসেবে পাঠানো হবে যাতে স্টোরড প্রোসিজার ইনপুট প্যারামিটার এবং আউটপুট প্যারামিটার মান পাঠানো যায়।#{parameterName, mode=IN/OUT, jdbcType=XXX}: এখানেIN,OUT, এবংjdbcTypeব্যবহার করে MyBatis কে স্টোরড প্রোসিজারের প্যারামিটার সম্পর্কে নির্দেশ দেওয়া হয়।
Step 4: Java Code to Call Stored Procedure
এখন, আমরা Java কোডে MyBatis ব্যবহার করে স্টোরড প্রোসিজার কল করব।
EmployeeApp.java Example (Calling the Stored Procedure):
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.util.HashMap;
import java.util.Map;
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 SqlSession
try (SqlSession session = sessionFactory.openSession()) {
// Step 3: Prepare parameters for the stored procedure
Map<String, Object> parameters = new HashMap<>();
parameters.put("employeeName", "John Doe");
parameters.put("employeeDept", "IT");
// Step 4: Execute the stored procedure to insert employee and get employeeId
session.selectOne("com.example.mapper.EmployeeMapper.insertEmployee", parameters);
// Step 5: Retrieve the employeeId from the parameters map
Integer employeeId = (Integer) parameters.get("employeeId");
System.out.println("Inserted Employee ID: " + employeeId);
// Commit transaction
session.commit();
} catch (Exception e) {
e.printStackTrace();
}
}
}
Explanation:
parameters.put("employeeName", "John Doe"): প্যারামিটার হিসেবে কর্মচারীর নাম এবং বিভাগ সেট করা হচ্ছে।session.selectOne("com.example.mapper.EmployeeMapper.insertEmployee", parameters): এখানেinsertEmployeeমেথড কল করা হচ্ছে যা স্টোরড প্রোসিজার কল করবে। প্যারামিটার হিসেবেparametersম্যাপ ব্যবহার করা হচ্ছে।parameters.get("employeeId"): স্টোরড প্রোসিজার থেকে রিটার্ন হওয়াemployeeIdআউটপুট প্যারামিটার থেকে নেওয়া হচ্ছে।
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
iBATIS (MyBatis) এর মাধ্যমে Stored Procedures কল করা একটি সহজ প্রক্রিয়া যা ডেটাবেস অপারেশনকে আরও কার্যকরী এবং দক্ষ করে তোলে। আপনি CALLABLE স্টেটমেন্ট ব্যবহার করে SQL কুয়েরি এবং স্টোরড প্রোসিজার প্যারামিটার ম্যানেজ করতে পারেন। এখানে কিছু গুরুত্বপূর্ণ পদ্ধতি:
statementType="CALLABLE": MyBatis-কে জানায় যে এটি একটি স্টোরড প্রোসিজার কল হচ্ছে।Mapপ্যারামিটার: ইনপুট এবং আউটপুট প্যারামিটারগুলিকে একটিMapএ পাঠানো হয়।
এটি আপনাকে iBATIS বা MyBatis ব্যবহার করে স্টোরড প্রোসিজার কল করার জন্য একটি শক্তিশালী এবং নমনীয় পদ্ধতি প্রদান করে।
iBATIS (বর্তমানে MyBatis) একটি powerful framework যা SQL ভিত্তিক কাস্টম ডেটাবেস অপারেশন সম্পাদন করতে সাহায্য করে। Stored Procedures (এসকিউএল সার্ভারের মধ্যে সঞ্চিত প্রোগ্রাম বা ফাংশন) এর ব্যবস্থাপনা MyBatis এর মাধ্যমে খুব সহজ এবং কার্যকরীভাবে করা যায়। MyBatis-এ input parameters এবং output parameters এর সাথে কাজ করার জন্য , , , ট্যাগ ব্যবহার করা হয়।
এখানে Stored Procedure এর জন্য ইনপুট (input) এবং আউটপুট (output) প্যারামিটার ব্যবস্থাপনা করার একটি বিশদ উদাহরণ দেওয়া হল।
1. Stored Procedure Configuration in iBATIS (MyBatis)
MyBatis-এ স্টোরড প্রোসিডিউর ব্যবহারের জন্য আমরা CallableStatement ব্যবহার করতে পারি। এটা স্টোরড প্রোসিডিউরের সাথে সম্পর্কিত কাস্টম SQL কুয়েরি চালাতে সহায়তা করে এবং ইনপুট ও আউটপুট প্যারামিটারগুলোর জন্য ম্যানেজমেন্ট সহজ করে।
Step 1: Create Stored Procedure in Database
প্রথমে, একটি স্টোরড প্রোসিডিউর তৈরি করতে হবে যা ইনপুট এবং আউটপুট প্যারামিটার গ্রহণ করবে। নিচে একটি উদাহরণ দেওয়া হল:
DELIMITER
DELIMITER ;
Explanation:
- IN
emp_id: এটি ইনপুট প্যারামিটার যাemployee idপ্রদান করে। - OUT
emp_name,emp_email: এটি আউটপুট প্যারামিটার যাnameএবংemailআউটপুট করে।
2. MyBatis Configuration
MyBatis-এ Stored Procedure-এ ইনপুট এবং আউটপুট প্যারামিটার ব্যবহার করার জন্য Mapper XML এবং Mapper Interface তৈরি করতে হবে।
Step 2: Configure MyBatis Mapper XML for Stored Procedure
<mapper namespace="com.yourpackage.mapper.EmployeeMapper">
<!-- Call stored procedure with input and output parameters -->
<select id="getEmployeeInfo" statementType="CALLABLE" resultMap="employeeResultMap">
{CALL GetEmployeeInfo(
#{empId, mode=IN, jdbcType=INTEGER},
#{empName, mode=OUT, jdbcType=VARCHAR},
#{empEmail, mode=OUT, jdbcType=VARCHAR}
)}
</select>
</mapper>
Explanation:
statementType="CALLABLE": এটি নির্দেশ করে যে কুয়েরি একটি স্টোরড প্রোসিডিউর কল করবে।#{empId, mode=IN, jdbcType=INTEGER}: এখানেempIdইনপুট প্যারামিটার হিসেবে ব্যবহার করা হচ্ছে।#{empName, mode=OUT, jdbcType=VARCHAR}:empNameআউটপুট প্যারামিটার হিসেবে ব্যবহার করা হচ্ছে।#{empEmail, mode=OUT, jdbcType=VARCHAR}:empEmailআউটপুট প্যারামিটার হিসেবে ব্যবহৃত হবে।
Step 3: Create Mapper Interface
এখন, একটি Mapper Interface তৈরি করতে হবে যেখানে স্টোরড প্রোসিডিউরের জন্য মেথড থাকবে।
public interface EmployeeMapper {
void getEmployeeInfo(@Param("empId") int empId,
@Param("empName") String empName,
@Param("empEmail") String empEmail);
}
Explanation:
- @Param:
@Paramঅ্যানোটেশনটি MyBatis-কে জানায় যে কোন প্যারামিটারটি ইনপুট এবং আউটপুট হিসেবে পাঠানো হচ্ছে।
3. Using the Stored Procedure in Java
Java কোডে SqlSession ব্যবহার করে আপনি getEmployeeInfo মেথডটি কল করতে পারেন।
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 org.apache.ibatis.exceptions.PersistenceException;
import java.io.Reader;
public class EmployeeApp {
public static void main(String[] args) {
SqlSessionFactory sqlSessionFactory = null;
SqlSession session = null;
try {
// Step 1: Initialize SqlSessionFactory
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
// Step 2: Open a new session
session = sqlSessionFactory.openSession();
// Step 3: Get Mapper
EmployeeMapper employeeMapper = session.getMapper(EmployeeMapper.class);
// Step 4: Prepare input and output variables
int empId = 1;
String empName = null;
String empEmail = null;
// Step 5: Call stored procedure
employeeMapper.getEmployeeInfo(empId, empName, empEmail);
// Step 6: Output result
System.out.println("Employee Name: " + empName);
System.out.println("Employee Email: " + empEmail);
// Step 7: Commit and close session
session.commit();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (session != null) {
session.close();
}
}
}
}
Explanation:
session.getMapper(EmployeeMapper.class): এটি MyBatis Mapper ইন্টারফেস ব্যবহার করে স্টোরড প্রোসিডিউর মেথড কল করে।employeeMapper.getEmployeeInfo(empId, empName, empEmail): এখানে স্টোরড প্রোসিডিউরটি কল করা হচ্ছে এবং প্যারামিটারগুলি ইনপুট ও আউটপুট হিসাবে সেট করা হচ্ছে।empNameএবংempEmail: এই আউটপুট প্যারামিটারগুলি স্টোরড প্রোসিডিউর থেকে রিটার্ন হবে।
4. Handling Output Parameters
MyBatis-এ আউটপুট প্যারামিটারগুলিকে সঠিকভাবে হ্যান্ডেল করার জন্য @Param অ্যানোটেশন এবং resultMap ব্যবহার করা হয়।
Example: Handling Output Parameters Using ResultMap
<resultMap id="employeeResultMap" type="Employee">
<result property="name" column="emp_name" />
<result property="email" column="emp_email" />
</resultMap>
<resultMap>: এই মাপিংটি আউটপুট প্যারামিটারগুলির মানকেEmployeeঅবজেক্টের প্রপার্টির সাথে ম্যাপ করে।
iBATIS (MyBatis) এ স্টোরড প্রোসিডিউরের input এবং output প্যারামিটার ব্যবস্থাপনা খুবই শক্তিশালী এবং নমনীয়। SqlSession এর মাধ্যমে CallableStatement ব্যবহার করে MyBatis-এ স্টোরড প্রোসিডিউর কল করা যায় এবং IN, OUT প্যারামিটারগুলি সহজেই হ্যান্ডল করা যায়।
- Input Parameters: স্টোরড প্রোসিডিউরের ইনপুট প্যারামিটার গুলি
#{paramName, mode=IN}এভাবে ব্যবহার করা হয়। - Output Parameters: আউটপুট প্যারামিটারগুলি
#{paramName, mode=OUT}আকারে ব্যবহার করা হয়। - Mapper XML and Java: Mapper XML ফাইল এবং Mapper Interface এর মাধ্যমে আপনি SQL কুয়েরি এবং প্রোসিডিউর ম্যানেজ করতে পারবেন।
iBATIS (MyBatis) হল একটি SQL ম্যাপিং ফ্রেমওয়ার্ক যা Java objects এবং SQL কুয়েরির মধ্যে সম্পর্ক স্থাপন করে। iBATIS একটি ডেটাবেসে সংরক্ষিত Stored Procedures পরিচালনা করতে সহায়ক, এবং এটি Java কোড থেকে SQL Stored Procedures কুয়েরি করতে এবং তাদের আউটপুটে ম্যাপ করতে ব্যবহৃত হতে পারে।
এখানে iBATIS (MyBatis)-এ Complex Stored Procedures হ্যান্ডল করার পদ্ধতি এবং কৌশল আলোচনা করা হবে।
1. Stored Procedures Overview
Stored Procedures হল ডেটাবেসে সংরক্ষিত SQL কোডের সেট যা নির্দিষ্ট কাজ সম্পাদন করতে ব্যবহৃত হয়। এগুলো প্রথামানিত SQL কুয়েরি ও অপারেশনগুলির জন্য আরও দক্ষ এবং পুনঃব্যবহারযোগ্য সমাধান প্রদান করে। MyBatis (iBATIS)-এ, আপনি Stored Procedures কে ডেটাবেসের মধ্যে কার্যকরভাবে কল করতে পারেন এবং তাদের আউটপুট Java objects-এ ম্যাপ করতে পারেন।
2. Calling Stored Procedures from iBATIS (MyBatis)
iBATIS (MyBatis)-এ Stored Procedures কল করার জন্য SQL ম্যাপিং ফাইলে <select>, <insert>, <update>, বা <delete> ট্যাগ ব্যবহার করা যেতে পারে, যা স্টোরড প্রোসিডিউরকে কল করার জন্য #{} প্যারামিটারগুলি ব্যবহার করে।
a) Stored Procedure Calling Using <select> Tag
ধরা যাক, আপনার ডেটাবেসে একটি স্টোরড প্রোসিডিউর রয়েছে যা কিছু students এর তথ্য প্রদান করে। আপনি iBATIS-এ এই প্রোসিডিউরটি কল করতে পারেন।
Example: Stored Procedure Call Using <select> in MyBatis
<select id="getStudentByCourse" statementType="CALLABLE" resultType="com.example.Student">
{CALL GetStudentByCourse(#{course, mode=IN, jdbcType=VARCHAR})}
</select>
Explanation:
statementType="CALLABLE": এটি MyBatis-এ স্টোরড প্রোসিডিউর কল করার জন্য ব্যবহৃত হয়।#{course, mode=IN, jdbcType=VARCHAR}: এটি স্টোরড প্রোসিডিউরের প্যারামিটার।INমোডটি ইঙ্গিত দেয় যে এটি ইনপুট প্যারামিটার হিসেবে ব্যবহৃত হবে এবংjdbcType=VARCHARইঙ্গিত দেয় যে প্যারামিটারটি একটি VARCHAR টাইপ।resultType="com.example.Student": এটি স্টোরড প্রোসিডিউরের আউটপুট Java object-এ ম্যাপ করতে ব্যবহৃত হয়।
3. Handling Output Parameters in Stored Procedures
Stored Procedures সাধারণত আউটপুট প্যারামিটার ফিরিয়ে দেয়, যা INOUT প্যারামিটার হতে পারে। iBATIS (MyBatis)-এ আউটপুট প্যারামিটার হ্যান্ডল করার জন্য, আপনি #{} সিনট্যাক্স ব্যবহার করতে পারেন, এবং আউটপুট প্যারামিটারটি যথাযথভাবে ম্যাপ করতে পারেন।
Example: Stored Procedure with Output Parameter
<select id="getStudentCountByCourse" statementType="CALLABLE" resultType="int">
{CALL GetStudentCountByCourse(#{course, mode=IN, jdbcType=VARCHAR}, #{studentCount, mode=OUT, jdbcType=INTEGER})}
</select>
Explanation:
#{studentCount, mode=OUT, jdbcType=INTEGER}: এটি একটি OUT প্যারামিটার যা স্টোরড প্রোসিডিউর থেকে রিটার্ন হয় এবংjdbcType=INTEGERব্যবহার করা হয় কারণ আউটপুটটি একটি সংখ্যা।
4. Calling Stored Procedures with Multiple Result Sets
บางครั้ง একটি স্টোরড প্রোসিডিউর একাধিক ফলাফল প্রদান করতে পারে। iBATIS (MyBatis)-এ একাধিক ফলাফল সেটের জন্য, আপনি <resultMap> ব্যবহার করতে পারেন, যা একাধিক রেজাল্ট সেট ম্যাপিং করে।
Example: Stored Procedure with Multiple Result Sets
<select id="getStudentAndCourseDetails" statementType="CALLABLE" resultMap="studentCourseMap">
{CALL GetStudentAndCourseDetails(#{course, mode=IN, jdbcType=VARCHAR})}
</select>
<resultMap id="studentCourseMap" type="com.example.Student">
<id property="id" column="student_id"/>
<result property="name" column="student_name"/>
<result property="course" column="course_name"/>
</resultMap>
Explanation:
<resultMap>: এটি একাধিক কলামের মানকে Java objects এর প্রপার্টিতে ম্যাপ করতে ব্যবহৃত হয়।statementType="CALLABLE": এটি ইঙ্গিত দেয় যে SQL কুয়েরি একটি স্টোরড প্রোসিডিউর।
5. Handling Complex Stored Procedures with Multiple Parameters
যখন স্টোরড প্রোসিডিউরে একাধিক ইনপুট প্যারামিটার এবং আউটপুট প্যারামিটার থাকে, তখন আপনি <select>, <insert>, <update>, বা <delete> ট্যাগের মাধ্যমে এই প্যারামিটারগুলি পাস করতে পারেন।
Example: Stored Procedure with Multiple Parameters
<select id="getStudentByNameAndCourse" statementType="CALLABLE" resultType="com.example.Student">
{CALL GetStudentByNameAndCourse(#{name, mode=IN, jdbcType=VARCHAR}, #{course, mode=IN, jdbcType=VARCHAR})}
</select>
Explanation:
- Multiple Parameters: এখানে
nameএবংcourseদুটি ইনপুট প্যারামিটার হিসেবে ব্যবহৃত হচ্ছে, যা স্টোরড প্রোসিডিউরকে পাস করা হবে।
6. Using MyBatis with Stored Procedure in Java Code
এখন, আপনি MyBatis থেকে স্টোরড প্রোসিডিউর কল করার জন্য Java কোড ব্যবহার করতে পারেন। MyBatis-এ SQL ম্যাপিং ফাইলের মাধ্যমে আপনি স্টোরড প্রোসিডিউর কল করবেন, কিন্তু আপনি SqlSession এবং Mapper Interface ব্যবহার করে স্টোরড প্রোসিডিউরটি কল করবেন।
Example: Calling Stored Procedure from Java Code
import org.apache.ibatis.session.SqlSession;
public class StudentDAO {
public int getStudentCountByCourse(String course) {
try (SqlSession session = MyBatisUtil.getSession()) {
// Get the Mapper interface
StudentMapper mapper = session.getMapper(StudentMapper.class);
// Call the stored procedure
return mapper.getStudentCountByCourse(course);
}
}
}
Explanation:
session.getMapper(StudentMapper.class): এটিStudentMapperইন্টারফেসের ইনস্ট্যান্স রিটার্ন করে।mapper.getStudentCountByCourse(course): এটি স্টোরড প্রোসিডিউরকে কল করে এবং আউটপুট প্যারামিটার (যেমনstudentCount) ফিরিয়ে আনে।
7. Handling Transaction with Stored Procedures
MyBatis-এ স্টোরড প্রোসিডিউরের সাথে transaction management হ্যান্ডল করার জন্য, আপনি SqlSession এবং Spring's @Transactional ব্যবহার করতে পারেন। ট্রানজেকশন ম্যানেজমেন্টের মাধ্যমে আপনি নিশ্চিত করতে পারেন যে, একাধিক SQL অপারেশন একত্রে সফলভাবে কমিট বা রোলব্যাক হবে।
Example: Using @Transactional with Stored Procedures
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class StudentService {
@Autowired
private StudentMapper studentMapper;
@Transactional
public void processStudentData(String course) {
studentMapper.insertStudent(new Student("John", course));
studentMapper.getStudentCountByCourse(course);
}
}
Explanation:
@Transactional: এটি Spring ব্যবহারে ট্রানজেকশন ম্যানেজমেন্টের জন্য ব্যবহৃত হয়। এটি নিশ্চিত করে যে সবকিছু atomicভাবে একসাথে কমিট বা রোলব্যাক হবে।
iBATIS (MyBatis)-এ Complex Stored Procedures হ্যান্ডল করার জন্য আপনি XML-based mapping files, SQL tags (যেমন <select>, <insert>, <update>, <delete>), এবং annotations ব্যবহার করে স্টোরড প্রোসিডিউর কল করতে পারেন। MyBatis ট্রানজেকশন ম্যানেজমেন্ট, আউটপুট প্যারামিটার হ্যান্ডলিং, এবং একাধিক প্যারামিটার সহ dynamic SQL পরিচালনা করতে সাহায্য করে। আপনার Java কোডে SqlSession এবং Mapper Interface ব্যবহার করে স্টোরড প্রোসিডিউরগুলি কল এবং তাদের ফলাফল পরিচালনা করা যেতে পারে।
Read more