野良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を使用)
もうちょっとスマートな何かを模索して良いのが無かったらこれで。