今回は、「データベースアプリケーションの作成(12)―ストアドプロシージャを実行する―」です。
CallableStatementを使って、データベースに置いたストアドプロシージャを実行してみましょう。
■動画はこちら
■動画で使用しているソースコード
サーブレット(Sv6.java)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | package yurufuwa.prog.sample; import java.io.IOException; import jakarta.servlet.RequestDispatcher; import jakarta.servlet.ServletContext; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServlet; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; public class Sv6 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //データ追加ページを表示 ServletContext sc = getServletContext(); RequestDispatcher rd = sc.getRequestDispatcher("/WEB-INF/jsp/in.jsp"); rd.forward(req, resp); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //入力パラメーターを取得 String kenCode = req.getParameter("txtKenCode"); String kenName = req.getParameter("txtKenName"); String yomigana = req.getParameter("txtYomigana"); try { //データの追加 CallProcedure cp = new CallProcedure(); cp.execute(kenCode, kenName, yomigana); int rowsCount = cp.getRowsCount(); //結果をリクエストにセット req.setAttribute("ken_code", kenCode); req.setAttribute("ken_name", kenName); req.setAttribute("yomigana", yomigana); req.setAttribute("rows_count", rowsCount); //結果を表示 ServletContext sc = getServletContext(); RequestDispatcher rd = sc.getRequestDispatcher("/WEB-INF/jsp/out.jsp"); rd.forward(req, resp); } catch(Exception e) { //エラーを表示 ServletContext sc = getServletContext(); RequestDispatcher rd = sc.getRequestDispatcher("/WEB-INF/jsp/err.jsp"); rd.forward(req, resp); } } } |
ストアドプロシージャの実行(CallProcedure.java)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | package yurufuwa.prog.sample; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.Types; import javax.naming.InitialContext; import javax.sql.DataSource; public class CallProcedure { private int rowsCount = -1; public void execute(String kenCode, String kenName, String yomigana) throws Exception { Connection conn = null; try { //DBに接続 InitialContext ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/mysql"); conn = ds.getConnection(); //SQLを発行 CallableStatement cstmt = conn.prepareCall( "CALL INSERT_TODOFUKEN( ?, ?, ?, ?)" ); cstmt.setString(1, kenCode); cstmt.setString(2, kenName); cstmt.setString(3, yomigana); cstmt.registerOutParameter(4, Types.INTEGER); cstmt.execute(); rowsCount = cstmt.getInt(4); cstmt.close(); } catch(Exception e) { e.printStackTrace(); throw e; } finally { try { //接続を閉じる conn.close(); } catch(Exception e) { } } } public int getRowsCount() { return rowsCount; } } |
JSP1(in.jsp)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>都道府県データ追加</title> </head> <body> <h2>追加するデータを入力してください</h2> <form action="./sv6" method="post"> <table> <tr><td>都道府県コード</td><td><input type="text" name="txtKenCode" /></td></tr> <tr><td>都道府県名</td><td><input type="text" name="txtKenName" /></td></tr> <tr><td>読み仮名</td><td><input type="text" name="txtYomigana" /></td></tr> </table> <input type="submit" value="追加" /> </form> </body> </html> |
JSP2(out.jsp)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <% String kenCode = (String)request.getAttribute("ken_code"); String kenName = (String)request.getAttribute("ken_name"); String yomigana = (String)request.getAttribute("yomigana"); int rowsCount = (int)request.getAttribute("rows_count"); %> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>都道府県データ追加</title> <style>table, th, td { border-collapse: collapse; border: 1px black solid; }</style> </head> <body> <h2>データの追加結果</h2> <h3>入力内容</h3> <table> <tr><td>都道府県コード</td><td><%= kenCode %></td></tr> <tr><td>都道府県名</td><td><%= kenName %></td></tr> <tr><td>読み仮名</td><td><%= yomigana %></td></tr> </table> <h3>テーブルの件数</h3> <%= rowsCount %>件 </body> </html> |
JSP3(err.jsp)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>都道府県データ追加</title> <style>table, th, td { border-collapse: collapse; border: 1px black solid; }</style> </head> <body> データの追加でエラーが発生しました。 </body> </html> |
ストアドプロシージャ ※MySQL
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | package yurufuwa.prog.sample; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.Types; import javax.naming.InitialContext; import javax.sql.DataSource; public class CallProcedure { private int rowsCount = -1; public void execute(String kenCode, String kenName, String yomigana) throws Exception { Connection conn = null; try { //DBに接続 InitialContext ctx = new InitialContext(); DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/mysql"); conn = ds.getConnection(); //SQLを発行 CallableStatement cstmt = conn.prepareCall( "CALL INSERT_TODOFUKEN( ?, ?, ?, ?)" ); cstmt.setString(1, kenCode); cstmt.setString(2, kenName); cstmt.setString(3, yomigana); cstmt.registerOutParameter(4, Types.INTEGER); cstmt.execute(); rowsCount = cstmt.getInt(4); cstmt.close(); } catch(Exception e) { e.printStackTrace(); throw e; } finally { try { //接続を閉じる conn.close(); } catch(Exception e) { } } } public int getRowsCount() { return rowsCount; } } |
web.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:web="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_5_0.xsd" id="WebApp_ID" version="5.0"> <display-name>testWeb</display-name> <servlet> <description></description> <display-name>Sv6</display-name> <servlet-name>Sv6</servlet-name> <servlet-class>yurufuwa.prog.sample.Sv6</servlet-class> </servlet> <servlet-mapping> <servlet-name>Sv6</servlet-name> <url-pattern>/sv6</url-pattern> </servlet-mapping> </web-app> |
context.xml
1 2 3 4 5 6 7 8 9 10 11 12 | <?xml version="1.0" encoding="UTF-8"?> <Context> <Resource name="jdbc/mysql" auth="Container" type="javax.sql.DataSource" factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" maxActive="5" maxIdle="5" initialSize="5" username="yuruku" password="fuwatto" driverClassName="com.mysql.cj.jdbc.Driver" url="jdbc:mysql://localhost/yuruku"/> </Context> |