Java Database Connectivity (JDBC) হল একটি Java API যা ডেটাবেসের সাথে যোগাযোগ এবং ডেটা পরিচালনা করার জন্য ব্যবহৃত হয়। এটি Java অ্যাপ্লিকেশনগুলিকে ডেটাবেসের সাথে সংযোগ স্থাপন, ডেটা সন্নিবেশ (insert), আপডেট (update), মুছে ফেলা (delete), এবং অনুসন্ধান (retrieve) করতে সাহায্য করে।
JDBC একটি স্ট্যান্ডার্ড ইন্টারফেস সরবরাহ করে যা বিভিন্ন ডেটাবেস সিস্টেমের মধ্যে কাজ করতে পারে, যেমন MySQL, Oracle, SQL Server ইত্যাদি। এটি ডেটাবেসের জন্য প্রোগ্রাম্যাটিক ইন্টারফেস সরবরাহ করে, যার মাধ্যমে Java প্রোগ্রামগুলি SQL কমান্ডগুলিকে কার্যকরভাবে চালাতে পারে এবং ডেটাবেস থেকে ডেটা প্রাপ্ত করতে পারে।
SELECT
, INSERT
, UPDATE
, DELETE
ইত্যাদি।DriverManager.getConnection()
মেথড ব্যবহার করে ডেটাবেসের সাথে সংযোগ স্থাপন করা হয়।executeQuery()
(যদি SELECT হয়) বা executeUpdate()
(যদি INSERT/UPDATE/DELETE হয়) মেথড ব্যবহার করা হয়।import java.sql.*;
public class JDBCExample {
public static void main(String[] args) {
// ডেটাবেস সংযোগ এবং SQL কুয়েরি চালানোর জন্য প্রয়োজনীয় অবজেক্ট তৈরি
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try {
// JDBC ড্রাইভার লোড করা
Class.forName("com.mysql.cj.jdbc.Driver"); // MySQL ড্রাইভার
// ডেটাবেসের সাথে সংযোগ স্থাপন
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "username", "password");
// SQL স্টেটমেন্ট তৈরি
statement = connection.createStatement();
// SELECT কুয়েরি চালানো
resultSet = statement.executeQuery("SELECT * FROM users");
// ফলাফল প্রাপ্তি
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
String email = resultSet.getString("email");
System.out.println("ID: " + id + ", Name: " + name + ", Email: " + email);
}
} catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
} finally {
// সংযোগ এবং অবজেক্ট বন্ধ করা
try {
if (resultSet != null) resultSet.close();
if (statement != null) statement.close();
if (connection != null) connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
ব্যাখ্যা:
import java.sql.*;
public class PreparedStatementExample {
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
try {
// JDBC ড্রাইভার লোড করা
Class.forName("com.mysql.cj.jdbc.Driver");
// ডেটাবেসের সাথে সংযোগ স্থাপন
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "username", "password");
// PreparedStatement তৈরি
String sql = "INSERT INTO users (name, email) VALUES (?, ?)";
preparedStatement = connection.prepareStatement(sql);
// ডেটা সেট করা
preparedStatement.setString(1, "John Doe");
preparedStatement.setString(2, "johndoe@example.com");
// SQL কমান্ড চালানো
int rowsAffected = preparedStatement.executeUpdate();
System.out.println(rowsAffected + " row(s) inserted.");
} catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
} finally {
// সংযোগ এবং অবজেক্ট বন্ধ করা
try {
if (preparedStatement != null) preparedStatement.close();
if (connection != null) connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
ব্যাখ্যা:
?
(প্লেসহোল্ডার) ব্যবহার করে ডেটা ইনপুট করা হয়।JDBC (Java Database Connectivity) হল একটি Java API যা Java প্রোগ্রামগুলিকে ডেটাবেসের সাথে সংযুক্ত এবং যোগাযোগ করতে সক্ষম করে। JDBC ডেটাবেস অ্যাপ্লিকেশনগুলির মধ্যে ডেটা পাঠানো, গ্রহণ করা এবং পরিচালনা করার জন্য স্ট্যান্ডার্ড ইন্টারফেস প্রদান করে। এটি Java অ্যাপ্লিকেশন এবং বিভিন্ন ডেটাবেস যেমন MySQL, Oracle, SQL Server, PostgreSQL ইত্যাদির মধ্যে ব্রিজ হিসেবে কাজ করে।
JDBC ব্যবহার করে Java অ্যাপ্লিকেশনগুলিকে ডেটাবেসে সংযোগ স্থাপন, কুয়েরি পরিচালনা, ডেটা আপডেট, ইনসার্ট বা ডিলিট করার জন্য বিভিন্ন কার্যক্রম সম্পাদন করতে পারে।
SELECT
, INSERT
, UPDATE
, DELETE
ইত্যাদি।executeQuery()
বা executeUpdate()
পদ্ধতি ব্যবহার করে কুয়েরি চালায়।commit
, rollback
।import java.sql.*;
public class JDBCExample {
public static void main(String[] args) {
try {
// Load the JDBC driver
Class.forName("com.mysql.cj.jdbc.Driver");
// Establish the connection
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "root", "password");
// Create a Statement object
Statement stmt = con.createStatement();
// Execute SQL query
ResultSet rs = stmt.executeQuery("SELECT * FROM students");
// Process the ResultSet
while (rs.next()) {
System.out.println("ID: " + rs.getInt(1) + ", Name: " + rs.getString(2));
}
// Close the connection
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
import java.sql.*;
public class JDBCPreparedStatementExample {
public static void main(String[] args) {
try {
// Load the JDBC driver
Class.forName("com.mysql.cj.jdbc.Driver");
// Establish the connection
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "root", "password");
// Create PreparedStatement object
String query = "INSERT INTO students (id, name) VALUES (?, ?)";
PreparedStatement pstmt = con.prepareStatement(query);
// Set parameters
pstmt.setInt(1, 1);
pstmt.setString(2, "John Doe");
// Execute update
int rowsAffected = pstmt.executeUpdate();
System.out.println("Rows affected: " + rowsAffected);
// Close the connection
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
JDBC (Java Database Connectivity) হল একটি শক্তিশালী API যা Java প্রোগ্রামকে ডেটাবেসের সাথে সংযোগ স্থাপন, SQL কুয়েরি ইজেকিউট করা এবং ডেটা ম্যানিপুলেট করার জন্য ব্যবহৃত হয়। এটি ডেটাবেস-নির্ভর অ্যাপ্লিকেশন তৈরি করতে সাহায্য করে এবং cross-platform compatibility প্রদান করে। JDBC ব্যবহার করার মাধ্যমে আপনি Java অ্যাপ্লিকেশন থেকে ডেটাবেসে ডেটা পাঠানো, গ্রহণ করা, আপডেট করা, এবং ডিলিট করার কাজ করতে পারেন।
Java-তে Statement
, PreparedStatement
, এবং CallableStatement
হল JDBC (Java Database Connectivity) এর অংশ, যা Java অ্যাপ্লিকেশনকে ডাটাবেসের সাথে সংযোগ করতে এবং SQL কুয়েরি চালাতে সহায়তা করে। যদিও এই তিনটি ক্লাস একই উদ্দেশ্যে ব্যবহৃত হয়, তবে তাদের মধ্যে কিছু পার্থক্য রয়েছে, যা তাদের ব্যবহারের ক্ষেত্রে গুরুত্বপূর্ণ।
Statement
ক্লাসটি JDBC API তে ডিফাইন করা একটি সাধারণ ক্লাস, যা SQL কুয়েরি সরাসরি ডাটাবেসে এক্সিকিউট করার জন্য ব্যবহৃত হয়। এটি সাধারণত এক্সিকিউট করার সময় SQL কুয়েরি প্যারামিটার (parameters) অ্যাসাইন করতে পারবে না এবং এটি ডাইনামিক SQL কোড এক্সিকিউট করার জন্য ব্যবহৃত হয়।
Statement stmt = connection.createStatement();
String sql = "SELECT * FROM users WHERE id = 10";
ResultSet rs = stmt.executeQuery(sql);
PreparedStatement
হল Statement
এর একটি সাবক্লাস, যা প্রি-কাম্পাইলড SQL কুয়েরি এবং প্যারামিটারাইজড কুয়েরি সমর্থন করে। এটি SQL injection প্রতিরোধে সাহায্য করে এবং একাধিকবার একই কুয়েরি রান করলেও এটি পারফর্ম্যান্স উন্নত করে।
String query = "SELECT * FROM users WHERE id = ?";
PreparedStatement stmt = connection.prepareStatement(query);
stmt.setInt(1, 10); // set the parameter value
ResultSet rs = stmt.executeQuery();
CallableStatement
হল PreparedStatement
এর একটি সাবক্লাস, যা stored procedure বা stored function এক্সিকিউট করার জন্য ব্যবহৃত হয়। এটি ডাটাবেসে সংরক্ষিত পদ্ধতিকে কল করতে সক্ষম এবং এটি আর্গুমেন্ট পাস করতে পারে, পাশাপাশি আউটপুট রিটার্নও করতে পারে।
CallableStatement stmt = connection.prepareCall("{call getUserDetails(?, ?)}");
stmt.setInt(1, 10); // set input parameter
stmt.registerOutParameter(2, Types.VARCHAR); // register output parameter
stmt.execute();
String userDetails = stmt.getString(2); // get output parameter
বিষয় | Statement | PreparedStatement | CallableStatement |
---|---|---|---|
প্রকার | সাধারণ SQL কুয়েরি এক্সিকিউট করার জন্য ব্যবহৃত। | প্যারামিটারাইজড SQL কুয়েরি এক্সিকিউট করতে ব্যবহৃত। | Stored procedure অথবা function কল করার জন্য ব্যবহৃত। |
Precompiled | না, রানটাইমে কুয়েরি কম্পাইল হয়। | হ্যাঁ, কুয়েরি আগে থেকেই কম্পাইল করা থাকে। | হ্যাঁ, stored procedure কম্পাইল এবং এক্সিকিউট করা হয়। |
SQL Injection | SQL ইনজেকশন প্রতিরোধে নিরাপদ নয়। | SQL ইনজেকশন প্রতিরোধে নিরাপদ। | SQL ইনজেকশন প্রতিরোধে নিরাপদ। |
Performance | একাধিক কুয়েরি এক্সিকিউট করার সময় পারফর্ম্যান্স কম। | একাধিক কুয়েরি এক্সিকিউট করার জন্য দ্রুত, কারণ এটি কম্পাইলড থাকে। | stored procedures এক্সিকিউট করতে ভালো পারফর্ম্যান্স প্রদান করে। |
Use Case | সাধারণ কুয়েরি যেমন SELECT , INSERT , UPDATE , DELETE | প্যারামিটার সহ কুয়েরি এক্সিকিউট করা, যেমন SELECT কুয়েরি। | Stored procedure, function এবং complex database operations। |
Input Parameters | পার্স করা যায় না। | হ্যাঁ, প্যারামিটারাইজড কুয়েরি হিসেবে ইনপুট প্যারামিটার নিতে পারে। | ইনপুট ও আউটপুট প্যারামিটার নেয়। |
Output Parameters | পার্স করা যায় না। | পার্স করা যায় না। | আউটপুট প্যারামিটার নিতে পারে। |
Java তে এই তিনটি ক্লাসের মধ্যে পার্থক্য বোঝা এবং সঠিক প্যাটার্নে তাদের ব্যবহার করার মাধ্যমে একটি নিরাপদ এবং উচ্চ কার্যক্ষম ডেটাবেস অ্যাপ্লিকেশন তৈরি করা সম্ভব।
ResultSet একটি Java ইন্টারফেস যা JDBC (Java Database Connectivity) API এর অংশ এবং এটি SQL কুয়েরি থেকে ডেটার ফলাফল ধারণ করে। যখন একটি SQL কুয়েরি (যেমন SELECT
স্টেটমেন্ট) এক্সিকিউট করা হয়, তখন যে ডেটা রিটার্ন হয়, তা একটি ResultSet অবজেক্টে সংরক্ষণ করা হয়। এটি ডেটাবেস থেকে ফিরে আসা রেকর্ডগুলো (বা রো) একটি টেবিলের আকারে ধারণ করে এবং Java অ্যাপ্লিকেশনকে সেই ডেটা অ্যাক্সেস করতে সহায়তা করে।
ResultSet ডেটা হ্যান্ডলিংয়ের জন্য বিভিন্ন পদ্ধতি সরবরাহ করে, যেমন রেকর্ড পরিদর্শন, সেলে ডেটা প্রাপ্তি, এবং বিভিন্ন ফিল্টারিং অপারেশন।
next()
মেথড ব্যবহার করে রো-by-রো ডেটা পরিদর্শন করতে পারেন।getXXX()
মেথডের মাধ্যমে আপনি কোনো নির্দিষ্ট কলাম থেকে ডেটা বের করতে পারেন, যেখানে XXX
ডেটা টাইপ (যেমন getString()
, getInt()
, getDate()
) হয়ে থাকে।forward-only
হতে পারে, যেখানে ডেটা শুধুমাত্র পরবর্তীতে যেতে পারবে।CONCUR_READ_ONLY
এবং CONCUR_UPDATABLE
এর মাধ্যমে কনকারেন্সি কন্ট্রোল করা হয়। প্রথমটি শুধু পড়ার জন্য এবং দ্বিতীয়টি লেখার জন্য ব্যবহৃত হয়।next()
মেথড ব্যবহার করে রেকর্ডগুলি একে একে অ্যাক্সেস করতে পারেন।getString()
, getInt()
, getDate()
এর মতো মেথড ব্যবহার করে আপনি নির্দিষ্ট কলামের মান সংগ্রহ করতে পারেন।next()
মেথড কল করতে হয় ডেটা পড়ার জন্য।close()
মেথড দিয়ে করা যায় যাতে মেমরি ফ্রি হয় এবং Garbage Collector অবজেক্টটি পরিস্কার করতে পারে।import java.sql.*;
public class ResultSetExample {
public static void main(String[] args) {
try {
// ড্রাইভার লোড করা
Class.forName("com.mysql.cj.jdbc.Driver");
// ডেটাবেসে সংযোগ স্থাপন করা
Connection con = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "root", "password");
// SQL কুয়েরি তৈরি করা
Statement stmt = con.createStatement();
String query = "SELECT id, name, age FROM students";
// SQL কুয়েরি চালানো এবং ResultSet পাওয়া
ResultSet rs = stmt.executeQuery(query);
// ResultSet থেকে ডেটা পড়া
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
System.out.println("ID: " + id + ", Name: " + name + ", Age: " + age);
}
// ResultSet এবং Connection বন্ধ করা
rs.close();
stmt.close();
con.close();
} catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
Connection
: প্রথমে, ডেটাবেসে সংযোগ স্থাপন করা হয়।Statement
: SQL কুয়েরি তৈরি করা হয় এবং এক্সিকিউট করা হয়।ResultSet
: কুয়েরির ফলাফল হিসেবে ResultSet অবজেক্ট পাওয়া যায়।while(rs.next())
: ResultSet এর মাধ্যমে ডেটা একে একে পরিদর্শন করা হয় এবং getInt()
, getString()
মেথড দিয়ে কলামের মান পাওয়া হয়।rs.close()
: ব্যবহার শেষে ResultSet বন্ধ করা হয়।next()
:
ResultSet
এর পরবর্তী রেকর্ডে এগিয়ে যাওয়ার জন্য ব্যবহার করা হয়।boolean
মান রিটার্ন করে, যদি পরবর্তী রেকর্ড থাকে তবে true
, না থাকলে false
।if (rs.next()) {
// Process data
}
getString(int columnIndex)
:
String
হিসেবে রিটার্ন করে।String name = rs.getString("name"); // By column name
int id = rs.getInt(1); // By column index
getInt(int columnIndex)
:
int
হিসেবে রিটার্ন করে।int age = rs.getInt("age");
getDate(String columnLabel)
:
Date date = rs.getDate("birthdate");
close()
:
ResultSet
অবজেক্ট বন্ধ করার জন্য ব্যবহৃত হয়।rs.close();
ResultSet হলো একটি গুরুত্বপূর্ণ Java JDBC ইন্টারফেস যা SQL কুয়েরি থেকে প্রাপ্ত ডেটা ধারণ এবং অ্যাক্সেস করার জন্য ব্যবহৃত হয়। এটি বিভিন্ন মেথডের মাধ্যমে ডেটা পরিদর্শন, পরিবর্তন, এবং প্রদর্শন করতে সাহায্য করে। ResultSet এর মাধ্যমে ডেটা একে একে ট্রাভার্স করে প্রয়োজনীয় ডেটা অ্যাক্সেস করা যায়।
Transaction Management হল একটি গুরুত্বপূর্ণ বিষয় যা ডেটাবেস অপারেশনগুলির মধ্যে একাধিক কাজের অখণ্ডতা বজায় রাখে। এটি নিশ্চিত করে যে একাধিক SQL অপারেশন একসাথে সফলভাবে সম্পন্ন হবে বা কোনও ত্রুটি ঘটলে সেগুলিকে বাতিল করা হবে, যাতে ডেটাবেসের অবস্থা অপরিবর্তিত থাকে। JDBC তে Transaction Management ব্যবহার করে আপনি নিশ্চিত করতে পারেন যে ডেটাবেসের মধ্যে একাধিক অপারেশন পরস্পর সম্পর্কিত এবং একে অপরের উপর নির্ভরশীল।
JDBC তে ট্রানজেকশন ম্যানেজমেন্ট সাধারণত নিম্নলিখিত ৩টি ধাপে কাজ করে:
import java.sql.*;
public class TransactionManagementExample {
public static void main(String[] args) {
Connection conn = null;
Statement stmt = null;
try {
// Load the JDBC driver
Class.forName("com.mysql.cj.jdbc.Driver");
// Establish connection to the database
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "root", "password");
// Disable auto-commit mode
conn.setAutoCommit(false);
// Create a Statement object
stmt = conn.createStatement();
// First SQL statement: INSERT into table1
stmt.executeUpdate("INSERT INTO table1 (id, name) VALUES (1, 'John')");
// Second SQL statement: INSERT into table2 (assume this is for the same transaction)
stmt.executeUpdate("INSERT INTO table2 (id, address) VALUES (1, 'New York')");
// If both operations succeed, commit the transaction
conn.commit();
System.out.println("Transaction committed successfully.");
} catch (SQLException | ClassNotFoundException e) {
// If there is any exception, rollback the transaction
try {
if (conn != null) {
conn.rollback();
System.out.println("Transaction rolled back.");
}
} catch (SQLException ex) {
ex.printStackTrace();
}
e.printStackTrace();
} finally {
try {
if (stmt != null) stmt.close();
if (conn != null) conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
setAutoCommit(false)
: প্রথমে, আমরা ডাটাবেস সংযোগের জন্য conn.setAutoCommit(false)
ব্যবহার করছি যাতে auto-commit mode বন্ধ করা যায়। এর মানে হল যে আমরা ম্যানুয়ালি commit বা rollback করব।INSERT
) চালানো হয়েছে। এই অপারেশনগুলো একটি একক ট্রানজেকশনের অংশ হিসেবে কাজ করবে।conn.commit()
: যদি সমস্ত অপারেশন সফলভাবে শেষ হয়, তবে commit() মেথড ব্যবহার করে সমস্ত পরিবর্তন ডেটাবেসে স্থায়ী করা হবে।conn.rollback()
: যদি কোনো এক্সপেকশন ঘটে, তবে আমরা rollback() ব্যবহার করে সমস্ত পরিবর্তন বাতিল করে ডেটাবেসকে পূর্বাবস্থায় ফিরিয়ে আনব।Statement
এবং Connection
অবজেক্টগুলো বন্ধ করা হয়।JDBC তে Transaction Management খুবই গুরুত্বপূর্ণ একটি বৈশিষ্ট্য যা ডেটাবেসে একাধিক পরিবর্তন নিশ্চিত করে। এটি auto-commit বন্ধ করে, এবং ম্যানুয়ালি commit() বা rollback() মেথড ব্যবহার করে ডেটাবেসের পরিবর্তন নিয়ন্ত্রণ করতে সহায়তা করে। এটি ডেটাবেসের atomicity, consistency, isolation, এবং durability (ACID) নিশ্চিত করতে গুরুত্বপূর্ণ ভূমিকা পালন করে।
Read more