JavaSer/javadrive/database

Last-modified: 2010-10-15 (金) 18:22:42

注意

このページには、isertというエラー回避があるので注意

サーブレット間の連携

 1)インクルード: 他のサーブレットの処理をインクルードする方法
  他のサーブレットに処理を委譲する。
  引数には委譲先のファイルやサーブレットのパスを指定(相対パス)

String disp = "/includetest";
RequestDispatcher dispatch = request.getRequestDispatcher(disp);
dispatch.include(request, response);
//includetestの処理が終わると、ここに戻ってくる

 2)フォワード: 他のサーブレットに処理を移す方法
  インクルードに似ているが、呼び出し元に戻ってこない。
  完全に処理を移す場合に利用する。
  クライアント側はページを移ったことに気づかない

String disp = "/forwardtest";
RequestDispatcher dispatch = request.getRequestDispatcher(disp);
dispatch.forward(request, response);

 3)リクエストへの属性追加
  フォワードする際に、フォワード元のリクエストは引き継がれるが、
  そこにさらにリクエストの属性を追加することができる。

フォワード元でrequest.setAttribute("名前", "値");
フォワード先でrequest.getAttribute("名前")で取得
取得した値は(String)などでキャストして使う

  HTMLから受け取った値を判定して、
  他のサーブレットに結果を反映させるなどの使い方が考えられる

 4)リダイレクト
  フォワードに似ているが、フォーワードはサーバー内でページを移るが、
  クライアントに別のページに移るように指示を出すだけ。
  クライアントはページを移ったことがわかる。
  また、リクエストを移動先ページに渡すことはない 
  したがって、用途はエラーページに飛ばすなどの処理に使われる。

  メリットとしては、フォワードは同一サーバーにしか飛ばせないが、
  リダイレクトは別のサーバーのURLへ飛ばすことも可能。

String url = "/dispatch/redirecttest";
response.sendRedirect(url);

JDBCドライバ

 JDBCとは、Javaでデータベースを扱う場合に使用するAPIで
 データベースを操作するためのファイルやクラスの集まり(JAR)

 Mysql用のJDBCなどというように、データベースによってJDBCがあるが、
 JDBC自体には共通のAPIでアクセスできるので、
 プログラムの可搬性があがる

 JDBCのインストールや使い方
 http://www.javadrive.jp/servlet/database/

JDBCドライバのロード

try {
Class.forName("com.mysql.jdbc.Driver").newInstance();
}catch (ClassNotFoundException e){
}catch (Exception e){
}

 Classクラスで、Javaのクラスを表すことができる。
 forNameメソッドで任意の名前のクラスを指定できる。
 そして、指定した名前のクラスを作るには、
 newInstanceメソッドをもちいる

データベースへの接続

 getConnectionメソッドを用いてデータベースに接続する。
 "jdbc:mysql://(サーバー名)/(データベース名)"を指定する

 Connection conn = null;
 String url = "jdbc:mysql://localhost/jdbctestdb";
 String user = "testuser";
 String password = "testpass";

 try{
  conn = DriverManager.getConnection(url, user, password);

  // データベースに対する処理

 }catch (SQLException

データベースとの切断(Closeメソッド)

 Closeを呼ばなくても、ガーベージクレクタで切断されるが、
 セキュリティのために速やかに切断する。

 切断を忘れないようにするため、finally文中に記述する

Connection conn = null;
String url = "jdbc:mysql://localhost/jdbctestdb";
String user = "testuser";
String password = "testpass";

try{
conn = DriverManager.getConnection(url, user, password);

// データベースに対する処理

}catch (SQLException e){
// 例外処理
}finally{
try{
if (conn != null){
conn.close();
}
}catch (SQLException e){
// 例外処理
}
}

mysqlの使用データベースの設定

 use (データベース名)で使用するデータベースを設定できる。
 データベースを設定しておけば
 select * from price のようにしてデータを取得できる。
 データベースを設定していない場合は
 select * from goods.price
 のように(データベース名).(テーブル名)の形式で設定すれば取得可能

 また、接続時に
 mysql -u root -p (データベース名)
 とすれば、そのまま目的のデータベースに接続できる

 接続中のデータベースは
 select database();
 で確認できる

 show databases;
 は登録されているデータベース一覧を取得するコマンドなので混同注意!

データベースの削除

 
 drop database (データベース名)
 でデータベースの削除

mysqlに日本語でInsertできない場合

 英語でテーブルにデータをinsertすることは可能だが、
 日本語で挿入すると失敗する場合の対処法
 http://d.hatena.ne.jp/tacohachi/20100128/p1

JDBCからのSELECT(データの取得)

conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement();
String sql = "SELECT * FROM kabukatable";
ResultSet rs = stmt.executeQuery(sql);

 のようにしてexecuteQueryメソッドにて取得する。

 数値ならば、 rs.getInt("名前");
 文字列ならば、rs.getString("名前");
 のようにして取得する。

 すべてのデータを取得するときは
 while( rs.next() ){
  ...
 }
 のようにして取得する。

  rs.close(); //Resultsetのclose
  stmt.close(); //ステートメントのclose

 ステートメントやResultsetもcloseしてリソースを解放するべし
 もちろん、前述の接続のcloseも必要

データの更新(UPDATE)

 データを取得するときは、executeQueryメソッドをもちいるが、
 データの更新や削除、追加の場合は結果として何か受け取るわけではない。
 このような場合は、executeUpdateメソッドをもちいる。

conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement();
String sql = "update kabukatable set company='楽天(株)' where code = 4755";
int num = stmt.executeUpdate(sql);

データの追加(INSERT)・削除(DELETE)

 更新のときと同じく、executeUpdateメソッドをもちいる。
 データベースに送信するSQL文が異なるだけ。

高速化

 prepareStatementは、Statementと同じく
 データベースに対するSQL文を実行するために使われるが、
 事前にコンパイルされていて高速に動作する。
 
 事前にコンパイルされているが、変更の可能性がある個所を指定して、
 後からパラメータとして、指定することも可能である。

String sql = "insert into kabukatable (basho, company) values (?, ?)";
PreparedStatement pstmt = conn.prepareStatement(sql);

pstmt.setInt(1, "東証");
pstmt.setString(2, "ドコモ");
int num = pstmt.executeUpdate();

pstmt.setString(2, "KDDI"); //2番目のパラメータのみ変更

 上記のように、' ? 'を用いてパラメータの個所を指定する。
 '?'を付けた順番に1,2,...と番号が割り当てられる。
 さらに、setXXXがパラメータをセットしている部分である。
 また、パラメータの1番目は変更の必要がないので、改めて設定する必要がない