自分用データベースプログラミングのリファレンス

PostgreSQL + JDBC + Servlet/JSP + Java な環境で書籍のオークションサイトを実装するとてつもない実験*1SQLとかJavaとかのリファレンスをいちいち参照するのが面倒なのでまとめておく。

PostgreSQLコマンド

コマンド 処理
\l 作成されたデータベースの一覧を表示する
\z データベース内のテーブルを一覧する。
\q 対話環境を終了する。

準備

Statementを作る。

Statement statement = myConnection.createStatement();

検索

executeQueryメソッドを使う。ResultSetが返ってくるので、もし結果に行があるか無いかで処理をわけたい場合はnextメソッドで結果があるかどうか調べてdo〜whileでループを回す*2。情報を取り出すのはgetIntメソッドとかgetStringメソッドとか。

String selectQuery = "SELECT * FROM 商品表 WHERE ISBN13='" + isbn + "';";
ResultSet result = statement.executeQuery(selectQuery);

if(result.next())
{
    do
    {
        String title = result.getString("書籍名");
        int price = result.getInt("価格");
    }
    while(result.next());
}

挿入・更新・削除

executeUpdateメソッドを使う。挿入・更新・削除した行数が返ってくる。

String insertQuery = "INSERT INTO 商品表 VALUES ('hoge',500)";
int lineNum = statement.executeUpdate(insertQuery);

String updateQuery = "UPDATE 商品表 SET 価格 = 価格+100 WHERE 書籍名='hoge';";
lineNum = statement.executeUpdate(updateQuery);

String deleteQuery = "DELETE FROM 商品表 WHERE 書籍名='hoge';";
lineNum = statement.executeUpdate(deleteQuery)

テーブルの作成

同じくexecuteUpdateメソッドを使う。返り値は0。

String createTableQuery = "";
createTableQuery += "CREATE TABLE 会員番号" +  member_number;
createTableQuery += " (ISBN13 char(15) REFERENCES 商品表(ISBN13),";
createTableQuery += "  所有数 integer NOT NULL CHECK(所有数>0),";
createTableQuery += " );";
			
statement.executeUpdate(createTableQuery);

このように(会員番号に対して)動的にテーブルを作成するような設計はそもそも間違っているので、テーブルの設計を見直した方がよい。

自動コミットをオフに

デフォルトだとSQL文の実行は1文ごとにコミットされるので、一連の作業が成功したときにだけコミットしたい場合はsetAutoCommitメソッドにfalseを渡す。失敗したらroolbackメソッドで取消し。成功したらcommitメソッドを忘れないように。BEGIN文とEND文でトランザクションブロックを作ってやるのもできるかもしれない。

myConnection.setAutoCommit(false);

// SQL文の実行

if(失敗)
{
    myConnection.rollback();
    return;
}

myConnection.commit();

例外

SQL関連はSQLExceptionで受け取る。データベースアクセスエラーが起きたときに投げられる。

try
{
    Statement statement = myConnection.createStatement();
    
    String insertQuery = "INSERT INTO 商品表 VALUES ('hoge',500)";
    int lineNum = statement.executeUpdate(insertQuery);

    // 省略
}
catch(SQLException e)
{
    e.printStackTrace();
}

*1:情報系の実験は、実験というより演習に近いよね。

*2:これは普通は前から後ろに一方向にしか走査できない(結果セットの型が TYPE_FORWARD_ONLY)からである。そのためnextメソッドを実行した後firstメソッドで先頭に戻してwhile文を回すということができない。