サーブレットから JDBC を利用する
ここでは、 JDBC を利用して MySQL データベースに接続するサーブレットを作るにはどうしたらよいか説明します。
Servlet に MySQL の JDBC ドライバーを組み込む
JDBC で接続するにあたり、必要になるのは JDBC ドライバーです。これは利用するデータベース毎に専用のドライバーが必要です。
MySQL の JDBC ドライバーは MySQL のサイトから入手できる Connector/J というドライバーを利用します。 これはサーブレットの場合もその他の Java プログラムの場合も同一です。入手方法については、 MySQL JDBC ドライバーをみてください。
サーブレットの場合、 ドライバーを配置するのは WEB-INF/lib 以下です。
ここに必要な ODBC ドライバーの jar ファイルを配置しておけば、必要に応じてそれを自動的に参照することができます。
JDBC で MySQL を利用するサーブレットの開発
ここでは具体的に、 JDBC を利用して MySQL データベースに、レコードを INSERT する例を示します。
SQL インジェクション等のセキュリティの問題に対処するために PreparedStatement を利用して、 パラメータ化されたクエリを利用しているところに注意してください。
package com.keicode.java.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; public class employee { private String name; private String email; public employee( String name, String email ) { this.name = name; this.email = email; } public void save() throws SQLException { Connection conn; conn = DriverManager.getConnection( "jdbc:mysql://localhost/db1?user=...&password=..."); try { String tmp = "INSERT INTO employees (name,email) VALUES (?,?)"; PreparedStatement stat = conn.prepareStatement(tmp); stat.setString(1, this.name); stat.setString(2, this.email); stat.execute(); } finally { conn.close(); } } }
この例の employee クラスは名前を表す name フィールドと電子メールアドレスを表す email フィールドをもち、コンストラクタでその値を初期化しています。 save メソッドを呼び出すと、その値をデータベースに保存します。
Connection を利用するときに処理しなければならない SQLException については、ここでは catch していません。 このため、save メソッドに throws キーワードで SQLException が指定されています。
こうすることによって、save メソッドの呼出側がそれを処理しなければならないことになります。
さて、このように employee クラスを定義しておき、次のように employee を利用します。
package com.keicode.java.test; import java.io.IOException; import java.sql.SQLException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @SuppressWarnings("serial") public class handlePostServlet extends HttpServlet { protected void doPost( HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { try { employee emp = new employee( req.getParameter("name"), req.getParameter("email")); emp.save(); req.getRequestDispatcher("/form.jsp").forward(req,resp); } catch( SQLException ex ) { resp.getWriter().println(ex.getMessage()); } } }
クライアントが送信した値を受けとるには javax.servlet.http.HttpServletResponse の getParameter メソッドに、パラメータの名前を渡します。
処理が正常終了した後には、form.jsp に要求をディスパッチしています。
両方共にソースコードは WEB-INF/src 以下の com.keicode.java.test パッケージにあります。