今さらPrepareStatementの使い方
かなり今さら感もありますが、PrepareStatementの使い方を載せておこうと思います。
現場に出たとききっと役に立つ・・・・はずです。
ではウンチクの前にサンプルコードを吟じてみたいと思います。
吟じます!!
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class PrepareStatementTest { public static void main(String[] args) { System.out.println("#----selectAll()----"); selectAll(); System.out.println("#----selectById()----"); selectById(1); System.out.println("#----insert()----"); insert("yattar"); System.out.println("#----selectByName()----"); selectByName("damePG2"); System.out.println("#----selectAll()----"); selectAll(); } private static void insert(String name) { Connection con = getConnection(); try { PreparedStatement stmt = con.prepareStatement( "INSERT INTO USERS(NAME) VALUES(?)"); stmt.setString(1, name); stmt.execute(); closeConnection(con); } catch (SQLException e) { e.printStackTrace(); } } private static void selectById(int id) { Connection con = getConnection(); try { PreparedStatement stmt = con.prepareStatement( "SELECT * FROM USERS WHERE ID = ?"); stmt.setInt(1, id); ResultSet rs = stmt.executeQuery(); while(rs.next()){ System.out.print(rs.getInt(1) + ": "); System.out.println(rs.getString(2)); } closeConnection(con); } catch (SQLException e) { e.printStackTrace(); } } private static void selectByName(String name) { Connection con = getConnection(); try { PreparedStatement stmt = con.prepareStatement( "SELECT * FROM USERS WHERE NAME = ?"); stmt.setString(1, name); ResultSet rs = stmt.executeQuery(); while(rs.next()){ System.out.print(rs.getInt(1)+ ": "); System.out.println(rs.getString(2)); } closeConnection(con); } catch (SQLException e) { e.printStackTrace(); } } private static void selectAll() { Connection con = getConnection(); try { PreparedStatement stmt = con.prepareStatement( "SELECT * FROM USERS"); ResultSet rs = stmt.executeQuery(); while(rs.next()){ System.out.print(rs.getInt(1)+ ": "); System.out.println(rs.getString(2)); } closeConnection(con); } catch (SQLException e) { e.printStackTrace(); } } private static Connection getConnection(){ String url = "jdbc:mysql://localhost/test"; Connection con = null; try { String driver = "org.gjt.mm.mysql.Driver"; Class.forName(driver).newInstance(); con = DriverManager.getConnection(url, "yourID", "yourPassword"); return con; } catch (Exception e) { return null; } } private static void closeConnection(Connection con){ try { con.close(); } catch (SQLException e) { e.printStackTrace(); } } }
<概要>
PrepareStatementはStatementを拡張したものです。
PrepareStatementを使用することでSQL文は関数定義のようにパラメータを取る事ができます。
パラメータに値をセットする事を「バインド」といいます。
<オブジェクトの取得>
以下の記述でオブジェクトの取得ができます。
PreparedStatement stmt = con.prepareStatement("実行したいSQL")
以下のようにセットしたいパラメータを「?」にし,SQLを書きます。
(Statement版)"SELECT * FROM <テーブル名> WHERE <検索したいカラム名> = ('" + <変数名.getXXX()> + "');"; ↓ (Prepare版)"SELECT * FROM <テーブル名> WHERE <検索したいカラム名> = ? AND <検索したいカラム名> = ?"
SQLの「?」に値をバインドするにはPrepareStatementのsetXXX()を使用します。
「XXX」の部分はセットしたい値のデータ型を書きます(setInt()やsetString()など)。
setXXX()メソッドは左から右へ「?」に対して値をバインドしていきます。
setString(<Index>, <値>);
?にセットし忘れるとExceptionがでるのでしっかりバインドしなければなりません。