独習Javaサーバサイド編第2版 第4章まとめ

データベース

後から検索・分析することを目的に、体系的に蓄積した情報群のこと

データベースサーバ

データベースに情報を確実に矛盾なく蓄積、更新し、必要な情報を大量のデータの中から高速に取り出すための手段を提供するソフトウェア

データベースの種類

・カード型データベース
一つの情報を一枚のカードとして扱う
・ネットワーク型データベース
関連するデータ同士が網状に関連付けられる
・リレーショナルデータベース
現在の主流
関連する一連のデータをテーブルに格納する

mysqlクライアント

MySQLにアクセスするにはMySQLに標準で付属しているコマンドラインツールであるmysqlクライアントを利用する

JDBC

データベースごとの仕様差を吸収し、Javaアプリケーションがデータベースに対してなんらかのアクセスを試みる際に一元的なインターフェースを提供するもの
コアはJavaSEのjava.sqlパッケージで提供されている
実際に各DBへの接続や操作を担うのは、個々のJDBCドライバである
DBによって別個に提供されているので必要に応じて適切なドライバをインストールする必要がある

データベース接続

JSPアプリケーションからDBを操作するには、DBに対して接続を確立しなければならない
接続をプール(保管)しておくために コネクションプーリング という仕組みを利用する
・いちいち接続を確立する必要がなくパフォーマンスがよい
・ユーザー数の増減に比較的強い
コネクションプーリングを管理する一連の手続きを規定するのが データソース の役割
設定はcontext.xmlに対して行う。アプリケーションルート配下の/META-
INFフォルダに保存する(要コンテナ再起動)
データソースの情報を定義するのは要素配下の要素である

データソースURL

データベース接続のための基本情報を表す

jdbc:subprotocol:subname

subprotocolにはJDBCドライバを識別するための文字列を指定する

データベース接続の基本

登録したデータソースを取得するにはInitialContextクラスのlookupメソッドを使用する
lookupメソッドの引数にはjava:comp/env/データソース名の形式で使用したいデータソースを指定する必要がある
戻り値はObjectクラスなので必ずDataSourceオブジェクトへの型キャストを行う必要が有る

データベース切断時注意

原則としてcloseメソッドはfinallyブロックで記述すること

SQLクエリの発行

DBに発行する一連の命令を管理するのはPreparedStatementオブジェクトの役割でConnectionオブジェクトdbからprepareStatementメソッドを呼び出すことで取得する

PrepareStatementメソッド(Connectionインターフェース)
PreparedStatement prepareStatement(String sql) throws SQLException
sql:発行するsql命令
指定されたSQL命令を実行するためのPreparedStatementオブジェクトを取得する
SQLの命令には?の形式でプレースホルダを含めることが可能
setXxxxxメソッド(PreparedStatementインターフェース)
void setXxxxx(int i,T value) throws SQLException
i:パラメータの番号(1スタート)
value:値(Tはデータ型がメソッドに応じて変動する意味)
プレースホルダ?に対して指定された値をセットする
Xxxxxの部分はBoolean,Byte,Date,Double,Float,Int,Long,Short,String,Timeなど

結果セット取得

SQLのSELECT命令によって、一つまたは複数のテーブルから取り出されたレコード群を保持するためにメモリ上に用意された仮想テーブルのこと
結果セットを読み込む場合、レコード単位で読み込む必要がある
現在読み込み可能なレコードを表す内部的な目印のことを レコードポインタ といい、それが示す現在行を カレントレコード という
結果セットから個々の行を取り出すことを フェッチする という

nextメソッド(ResultSetインターフェース)
boolean next() throws SQLException
レコードポインタを次のレコードに移動する
ポインタの移動に成功した場合はtrueを、そうでないならfalseを返す
getXxxxxメソッド(ResultSetインターフェース)
T getXxxxx(int i)
T getXxxxx(String name)
T:Boolean,Byte,Date,Double,Float,Int,Long,Short,String,Timeなど
i:インデックス番号
name:フィールド名
カレントコードから指定されたフィールドの値を取得する

トランザクション処理

分けることのできない複数の処理をグループ化したもの
処理を元に戻すことを ロールバック といい、トランザクションに属するすべての処理をなかったことにする
自動コミット はSQL命令を一つ発行するたびトランザクションを自動的に確定する機能

メタデータまたはメタ情報

データの構成を表すためのデータのこと

getTablesメソッド(DatebaseMetaDataインターフェース)
 ResultSet getTables(String catalog, String schemaPattern, String tableNamePattern,
 String[] types) throws SQLException
 catalog:データベース名
 schemaPattern:スキーマ名
 tableNamePattern:テーブル名
 types:テーブルの種類
 指定されたテーブルのメタ情報を取得する
 テーブルの種類は文字列配列で指定可能
getColumnsメソッド(DatebaseMEtaDataインターフェース)
 ResultSet getColumns(String catalog, String schemaPattern, String tableNamePattern, String columnNamePattern) throws SQLException
 catalog:データベース名
 schemaPattern:スキーマ名
 tableNamePattern:テーブル名
 columnNamePattern:フィールド名
 指定されたテーブルに含まれるフィールドのメタ情報を取得する
getMetaDataメソッド(ResultSetインターフェース)
 ResultSetMataDate getMetaData() throws SQLException
 結果セットの構成情報をResultSetMetaDataオブジェクトとして返す