Java(servlet/JSP)とDB

JDBCドライバ:アプリケーションサーバからDBに接続するツール
 
まず、Javaでデータベース(以下DB)が扱えるように、JDBCドライバをインストールする必要がある。使用するDBのサイトでDLできるので探す
データソース:アプリケーションサーバを利用してDBに接続する仕組み
 接続情報の管理(DBへの接続・切断)を簡素化したり、コネクションプールという機能によって、DBへの接続情報を再利用して処理時間を短縮できる

データソースの設定
 
アプリケーションサーバのMETA-INF以下におかれたcontext.xmlを編集することでデータソースを設定することができる(以下postgresql時の記述)

         <!--context.xml-->
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>
<Context reloadable="true">
         <!--データソースの設定-->
	<Resource
		name="jdbc/book"
		auth="Container"
		type="javax.sql.DataSource"
		driverClassName="org.postgresql.Driver"
		url="jdbc:postgresql://localhost:5432/book"
		username="postgres"
		password="postgres"
	/>
</Context>

Resourceタグ内がデータソースの設定記述となる
name属性:データソースの名前(自由に設定可能)
auth属性:認証の指定 Containerを指定するとWebコンテナが処理し
     Applicationと指定するとアプリケーション側で処理をする
type属性:リソースのクラス名 javax.sql.DataSource を指定する
driverClassName属性:JDBCドライバのクラス名(DBによって違う)
url属性:接続したいDBのアドレス文字列(DBによって違う)
username属性:ユーザ名
password属性:パスワード

DBアクセスの手順

データソースを介してDBに接続するには以下のような処理を行う
1.InitialContextオブジェクトを生成する
 javax.naming.InitialContextクラスのオブジェクトを生成し、
Java Naming and Directory Interface(JNDI)という、名前からオブジェクト等を参照するAPIを用いて、コネクションプールからコネクションを取得する
2.DataSourceオブジェクトを取得する
 
InitialContextクラスのlookupメソッドから、javax.sql.DataSourceインタフェースのオブジェクト(データソース)を取得する
3.Connectionオブジェクトを取得する
 
DataSourceインタフェースのgetConnectionメソッドから、Connectionオブジェクトを取得する

InitialContext ic = new InitialContext();
 //1. InitialContextオブジェクト ic を生成
DataSource ds = (DataSource)ic.lookup("java:/comp/env/jdbc/book");
 //2. DataSourceオブジェクト ds にキャストした 
 //    "java:/comp(onent)/env(ironment)/jdbc/book"のデータソースを取得
Connection con = ds.getConnection();
 //3 Connectionオブジェクト con にデータソースからConnectionを取得

SQL文の作成と実行

1.SQL文をセットする
 SQL文をJavaから実行するために、まずはConnectionオブジェクトからprepareStatementメソッドを使い、java.sql.PreparedStatementインタフェースを使用する(名前が同じようでちょっと違う…)
2.SQL文を実行する
 PreparedStatementオブジェクトにSQL文をセットした後、executeQueryメソッドを使用することで、指定したSQL文を実行することができる
実行結果はResultSetオブジェクトとして返ってくる

PreparedStatement st = con.prepareStatement
            ("select * from product order by id");
       //1. PreparedStatementオブジェクト st 
       //   にprepareStatementメソッドでSQL文をセット
ResultSet rs = st.executeQuery();
       //2. ResultSetオブジェクト rs にstにセットされたSQL文を
       //  executeQueryメソッドで実行

結果を表示する

ResultSetオブジェクトとして返ってきた結果を表示する
1.nextメソッドでカーソルを移動する
 ResultSet内には表データが格納されており、nextメソッドを使用することで現在カーソル(行指定のような)がさしている行数を進めることができる
また返り値として、次の行があればtrue、無ければfalseとboolean型をとる
2.getメソッドで要素を取得する
 各テーブルで決められたフィールド名を指定することでカーソル位置に対応した要素を取得することができる。この時フィールドの型に沿ったgetメソッドを記述する必要がある
 int型:getInt() String型:getString() double型:getDouble() 等

while (rs.next()) {         //ResultSet型 rs を1行進める次行なければ終了
	out.println(rs.getInt("id"));   //int型のフィールド名idから要素を取得
	out.println(rs.getString("name"));//String型フィールド名nameから要素を取得
	out.println(rs.getInt("price")); //int型のフィールド名priceから要素を取得
}

DBから切断する

DBに接続しているオブジェクトを切断する
ここまでに接続しているオブジェクトは順番に
①Connection ②PreparedStatement ③ResultSet があるが
ResultSetに関してはPreparedStatementを切断すれば自動的に切れるので
1.PreparedStatementの切断
 接続した順に入れ子構造になっているため、接続時とは逆順で切断をする必要がある。まずはPreparedStatementをcloseメソッドを使用して切断する
2.Connectionの切断
 
同じようにConnectionをcloseメソッドで切断する

st.close();  //PreparedStatement型のインスタンスstをcloseメソッドで切断
con.close(); //Connection型のインスタンスconをcloseメソッドで切断