Subjects

All subjects Django Java Python React Spring Boot JavaScript PHP
Sign Up Free
Question 2 of 10 · Java Database Connectivity (JDBC)
Interview question

What is the difference between Statement, PreparedStatement, and CallableStatement? Statement, PreparedStatement, और CallableStatement में क्या अंतर है?

Answer
InterfacePurposeSQL injection safe?Performance
StatementStatic SQL queries, no parametersNo - vulnerable if concatenating inputCompiled every execution
PreparedStatementParameterized SQL with placeholders (?)Yes - parameters are never treated as SQLPrecompiled, faster on repeated execution
CallableStatementExecuting stored proceduresYes (same as PreparedStatement)Precompiled
// Statement - VULNERABLE to SQL injection if using user input
Statement stmt = conn.createStatement();
String email = userInput;  // e.g. "' OR '1'='1"
ResultSet rs = stmt.executeQuery('SELECT * FROM users WHERE email = \'' + email + '\'');
// A malicious input can alter the query logic entirely - NEVER do this

// PreparedStatement - SAFE, parameters bound separately from SQL
String sql = 'SELECT * FROM users WHERE email = ?';
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, email);  // treated strictly as data, never as SQL code
ResultSet rs2 = pstmt.executeQuery();

// PreparedStatement for INSERT/UPDATE
PreparedStatement insertStmt = conn.prepareStatement(
    'INSERT INTO users (name, email) VALUES (?, ?)');
insertStmt.setString(1, 'John');
insertStmt.setString(2, 'john@example.com');
insertStmt.executeUpdate();

// CallableStatement - for calling a stored procedure
CallableStatement cstmt = conn.prepareCall('{call getUserById(?)}');
cstmt.setInt(1, 5);
ResultSet rs3 = cstmt.executeQuery();

// Stored procedure with an OUT parameter
CallableStatement cstmt2 = conn.prepareCall('{call getUserCount(?)}');
cstmt2.registerOutParameter(1, java.sql.Types.INTEGER);
cstmt2.execute();
int count = cstmt2.getInt(1);
Interfaceउद्देश्यSQL injection safe?Performance
StatementStatic SQL, parameters नहींनहींहर बार compile
PreparedStatementParameterized SQL (?)हाँPrecompiled, तेज़
CallableStatementStored proceduresहाँPrecompiled
// Statement - SQL injection के लिए VULNERABLE
Statement stmt = conn.createStatement();
String email = userInput;
ResultSet rs = stmt.executeQuery('SELECT * FROM users WHERE email = \'' + email + '\'');
// कभी न करें

// PreparedStatement - SAFE
String sql = 'SELECT * FROM users WHERE email = ?';
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, email);
ResultSet rs2 = pstmt.executeQuery();

PreparedStatement insertStmt = conn.prepareStatement(
    'INSERT INTO users (name, email) VALUES (?, ?)');
insertStmt.setString(1, 'John');
insertStmt.setString(2, 'john@example.com');
insertStmt.executeUpdate();

// CallableStatement - stored procedure के लिए
CallableStatement cstmt = conn.prepareCall('{call getUserById(?)}');
cstmt.setInt(1, 5);
ResultSet rs3 = cstmt.executeQuery();

Was this answer clear?