野良SQLを実行する

JDBCはResultSetを返すかどうかで、

  • executeQuery 返す(select)
  • executeUpdate 返さない(insertとかupdateとかdeleteとか)

と、使いわけますが、画面から入力されたSQLを、何も考えずにそのまま投げる場合(危ないですが)はどうするのかと探していたところ、executeというのがありました。

このメソッドは指定されたSQL文を発行後、ResultSetが一つでも返る場合にはtrueを返し、それ以外にはfalseを返します。
http://www.nextindex.net/java/JDBC/SwingJDBC2.html
http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/java/sql/Statement.html#execute(java.lang.String)


DataSourceをSeasarコンテナから取得して(コネクションの管理をSeasarにお任せして)
(それと、ResultSetをMapに詰め込む便利そうなclassがあったのでそれを使わせていただいて)

SingletonS2ContainerFactory.init();
S2Container container = SingletonS2ContainerFactory.getContainer();
DataSource dataSource = (DataSource) container.getComponent(DataSource.class);
Connection con = null;
Statement stmt = null;
try {
    con = DataSourceUtil.getConnection(dataSource);
    stmt = con.createStatement();
    String sql = "select * from test";
    // String sql = "insert into test values (1,'hogepiyo')";
    if(stmt.execute(sql)) {
        ResultSet rs = stmt.getResultSet();
        MapListResultSetHandler handler = new MapListResultSetHandler();
        List list = (List) handler.handle(rs);
        for(Iterator i = list.iterator(); i.hasNext();) {
            Map map = (Map)i.next();
            // 何か処理する
        }
        rs.close();
    } else {
        System.out.println(stmt.getUpdateCount() + "件処理されました。");
    }
} catch (SQLException e) {
    e.printStackTrace();
} finally {
    try {
        stmt.close();
        con.close();
    } catch (SQLException e) {
        e.printStackTrace();
    }
}
SingletonS2ContainerFactory.destroy();


で、動いた・・・!(DBはH2を使用)


もうちょっとスマートな何かを模索して良いのが無かったらこれで。