JDBC 6章 DataSourceからConnectionを取得する
- 6.1. server.xmlへの設定
- 6.2. web.xmlへの設定
- 6.3. DataSourceの利用
6.3. DataSourceの利用
DataSourceを利用するには、JNDIというAPIを使用します。JNDIはNaming ServiceやDirectory Serviceなど、ツリー構造の情報に統一的にアクセスするためのAPIです。DataSourceを利用する上において、詳細な知識は不要ですので詳しい説明は省略します。以下はDataSourceを使用し、Connectionを取得しているサーブレットの例です。
import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.ServletException; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.sql.DataSource; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.io.PrintWriter; import java.io.IOException; public class DataSourceServlet extends HttpServlet{ private DataSource dataSource=null; public void init() throws ServletException{ try{ Context context=new InitialContext(); dataSource=(DataSource)context.lookup("java:comp/env/jdbc/datasource"); }catch(NamingException e){ throw new ServletException(e); } } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{ response.setContentType("text/html; charset=SJIS"); PrintWriter writer=response.getWriter(); writer.println("<html><body><ul>"); Connection conn=null; try{ conn=dataSource.getConnection(); PreparedStatement statement =conn.prepareStatement("select name from meibo"); ResultSet result=statement.executeQuery(); while(result.next()){ writer.println("<li>"+result.getString(1)+"</li>"); } }catch(SQLException e){ e.printStackTrace(writer); }finally{ try{ if(conn!=null) conn.close(); }catch(SQLException e){} } writer.println("</ul></body></html>"); } }
まずDataSourceをTomcatから検索します。例ではサーブレットの初期化時(initメソッド内)で行っています。これはJNDIを使用して、javax.naming.Contextを作成してlookupメソッドを呼ぶことで可能です。lookupメソッドの定義は以下の通りです。
Object lookup(String name) throws javax.naming.NamingException
引数にはDataSourceが登録されている名前を指定します。その際の名前は、
java:comp/env/(server.xmlで指定した名前)
にして下さい。ここでは「jdbc/datasource」という名前で登録しましたので、「java:comp/env/jdbc/datasource」という名前を指定します。lookupメソッドの返り値はDataSourceですので、キャストして使用します。
DataSourceからはgetConnectionメソッドでjava.sql.Connectionを取得できます。DriverManagerと異なり、引数に値を指定する必要はありません。必要な情報はserver.xmlで指定しているためです。
(実習課題1)
サンプルのサーブレットを実行させなさい。また「product」テーブルにデータを追加する機能を、Webアプリケーションに追加しなさい。