JDBC学習におけるPreparedStatementの使い方
PreparedStatementは、Javaで事前に準備されたSQLステートメントを実行するためのインターフェースであり、Statementインターフェースを継承しています。Statementと比較して、PreparedStatementには次の利点があります。1. SQLインジェクション攻撃の防止:PreparedStatementは、SQLステートメント中のパラメーターを置換するためにプレースホルダー(?)を使用することで、文字列の連結によるSQLインジェクション問題を回避できます。2. パフォーマンスの向上:PreparedStatementは、SQLステートメントを事前に準備することができ、データベースが実行プランをキャッシュするため、実行効率が向上します。3. 可読性の向上:PreparedStatementを使用することで、SQLステートメントとパラメーターを分離することができ、コードがより明確になります。PreparedStatementを使用する手順は以下の通りです。1. PreparedStatementオブジェクトを作成する:ConnectionオブジェクトのprepareStatement()メソッドを使用して、PreparedStatementオブジェクトを作成します。
PreparedStatement pstmt = connection.prepareStatement(sql);
2. パラメータの値を設定する:PreparedStatementオブジェクトのsetXXX()メソッドを使用して、SQL文のパラメータ値を設定します。ここでXXXはパラメータの型を表します。たとえば、setString()やsetInt()などです。
pstmt.setString(1, "John");
SQL文を実行する際は、PreparedStatementオブジェクトのexecuteUpdate()メソッドを使用して、影響を受けた行の数を返します。
int rows = pstmt.executeUpdate();
4. リソースをクローズする:PreparedStatementオブジェクトとデータベース接続をクローズします。
pstmt.close();
connection.close();
完璧なサンプルコードは以下の通りです:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class PreparedStatementExample {
public static void main(String[] args) {
Connection connection = null;
PreparedStatement pstmt = null;
try {
// 连接数据库
connection = DriverManager.getConnection(“jdbc:mysql://localhost:3306/
mydatabase”, “root”, “password”);
// 创建PreparedStatement对象
String sql = “INSERT INTO users(name, age) VALUES(?, ?)”;
pstmt = connection.prepareStatement(sql);
// 设置参数值
pstmt.setString(1, “John”);
pstmt.setInt(2, 25);
// 执行SQL语句
int rows = pstmt.executeUpdate();
System.out.println(“受影响的行数:” + rows);
} catch (SQLException e) {
e.printStackTrace();
} finally {
// 关闭资源
try {
if (pstmt != null) {
pstmt.close();
}
if (connection != null) {
connection.close();
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
上記のコードでは、PreparedStatementを使用して挿入操作を実行する方法が示されており、プレースホルダー(?)がSQLステートメントのパラメーターを代替するために使用されています。実際の使用では、必要に応じてPreparedStatementを使用してクエリ、更新、削除などを実行することができます。