Java基礎ーSQL

SQL

Java標準の機能を使用したDBの処理 についてまとめる。

JDBCドライバのダウンロード

DBの公式サイトからJDBCドライバをダウンロードして、クラスパスに配置する。

DBに接続する

public void doSql(){
    // ドライバーのダウンロード
    Class.forName("org.postgresql.Driver");

    String url = "jdbc:postgresql://localhost/jdbctestdb";
    String user = "testuser";
    String password = "testpass";

    Connection conn = null;
    try{
        conn = DriverManager.getConnection(url, user, password);
        // データベースに対する処理
    }catch (SQLException e){
    // 例外処理
    }finally{
        try{
            if (conn != null){
                conn.close();
            }
        }catch (SQLException e){
        // 例外処理
        }
    }
}

SQLの実行:SELECT

Statement stmt = connection.createStatement();

// selectの実行
String SQL = "SELECT * FROM テーブル名";
ResultSet rs = stmt.executeQuery(sql);

// rs.next()で1行ずつデータを取得できる
while(rs.next()){
    // get*()メソッドの引数にカラム名を指定することで値を取得できる
    int code = rs.getInt("code");
    String company = rs.getString("company");
}

// 使い終わったらクローズする
rs.close();
stmt.close();

カラムの値を取るのに使用できるメソッド例

  • boolean getBoolean(String columnName)
  • byte getByte(String columnName)
  • Date getDate(String columnName)
  • double getDouble(String columnName)
  • int getInt(String columnName)
  • long getLong(String columnName)
  • Timestamp getTimestamp(String columnName)

SQLの実行:insert,update,delete

Statement statement = connection.createStatement();

// insertサンプル
String sql="insert into product values(101,'Viz','Compact car',100);"
statement.executeUpdate(sql);
 
// updateサンプル   
sql="update product set price=price*1.1 where price>=200;"
int result=statement.executeUpdate(sql);

// deleteサンプル
sql="delete product where price<=100;";
int result=statement.executeUpdate(sql);

SQLの実行:バインド変数の使用

バインド変数とは、プログラミング言語の実行環境からデータベース管理システム(DBMS)へSQL文を発行する際、一部を動的に変更できる変数にする機能のこと。
その部分に後から代入や変更を行ってもSQL文の再生成や解釈をし直す必要がなく、高速に実行することができる。

String selectStatement = "select title from books where title like ?";
PreparedStatement prepStmt =  con.prepareStatement(selectStatement);
prepStmt.setString(1, "%Java%");
ResultSet rs = prepStmt.executeQuery();

トランザクション制御

ConnectionクラスのsetAutoCommit(boolean)メソッドで、自動コミットを適用するかどうかを選択できる。 デフォルトはtrueが設定されており、1クエリ実行後に自動的にコミットされている。

falseを設定した場合は、自動でコミットが実行されないため、明示的にcommit()もしくはrollback()メソッドを呼び出す必要がある。

public class SampleClass {
    public void doSql(){
        // ドライバーのダウンロード
        Class.forName("org.postgresql.Driver");

        String url = "jdbc:postgresql://localhost/jdbctestdb";
        String user = "testuser";
        String password = "testpass";

        Connection conn = null;
        try{
            conn = DriverManager.getConnection(url, user, password);
            conn.setAutoCommit(false);
            
            Statement statement = connection.createStatement();

            String sql="insert into product values(101,'Viz','Compact car',100);"
            statement.executeUpdate(sql);
            
            conn.commit();
        }catch (SQLException e){
            try {
                conn.rollback();
            } catch (SQLException ex) {
                // 例外処理
            }
        }finally {
            try{
                if (conn != null){
                    conn.close();
                }
            }catch (SQLException e){
                // 例外処理
            }
        }
    }
}