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メソッドで切断