今さら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がでるのでしっかりバインドしなければなりません。