現在servlet&jspの学習の一環で、jspにて入力した情報をもとにMysqlのDBへレコードを追加する方法を調べているのですが、どうにもうまくいきません。
まずjspが
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
(略)
<input type="submit" value="登録" /> </form> </body> </html>と、名前やその他の情報を入力できるようにしています。
次にservletが、
package servlet;
import java.io.IOException;
import java.util.ArrayList;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import Dao.listDao;
import dto.Listinfo;
/**
- Servlet implementation class Insert
*/
@WebServlet("/Insert")
public class Insert extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { listDao daoArray = new listDao(); ArrayList<Listinfo> listInfo = daoArray.findAll(null); request.setAttribute("list", listInfo); request.getRequestDispatcher("/WEB-INF/jsp/Insert.jsp").forward(request, response); } /** * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response) */ protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // HttpSession session = request.getSession(); request.setCharacterEncoding("UTF-8"); //UTF-8にエンコーディング String name = request.getParameter("Name"); String birthday = request.getParameter("BirthDay"); String sex = request.getParameter("性別"); listDao dao = new listDao(); //Daoクラス生成 dao.InsertInformation(employeeId, name, name_hiragana, birthday, sex, mail_address, teliphone_number, company_id, business_maneger, department, commissioning_status, enter_date, retire_date, status); //挿入処理}
response.sendRedirect("./List");//レコード追加後、入力画面の前の一覧へもどる
}
}
と、jspから情報を取得し、daoへ渡します。
最後にDao内のメソッドで
package Dao;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import dto.Listinfo; //(他のメソッドの文も含まれているので関係ないものが混ざってます)
public void InsertInformation(String name, String birthday, String sex,) {
//SQL文
//メッセージ情報を挿入
String sql =
"INSERT INTO table_a left outer join table_a on table_b.b_id = table_a.a_id left outer join table_c on table_b.id_b_c = table_c.id_c VALUES(?, ?, sysdate(), 0, sysdate(), sysdate(), ?, ?)";
try { Class.forName("com.mysql.jdbc.Driver"); //ドライバクラスのロード conn = DriverManager.getConnection(url, user, password); //Connectionクラス生成 pstmt = conn.prepareStatement(sql); //PreparedStatementクラス生成 pstmt.setString(1, name); pstmt.setString(2, birthday); pstmt.setString(3, sex); pstmt.executeUpdate(); //INSERT文を実行 } catch(SQLException e){ } catch (ClassNotFoundException e) { } finally { //終了処理 //PreparedStatement終了 if(pstmt != null) { try { pstmt.close(); } catch (SQLException e) { } pstmt = null; } //Connection終了 if(conn != null) { try { conn.close(); } catch (SQLException e) { } conn = null; } } }
とinsert文を実地、という風な感じです。
実際は他にも入れたいカラムがありますが割愛しています。
上記の状態では結局レコードの追加が出来ていないのですがどこに問題があるのでしょうか?
添削してもらえれば幸いです。
(Insert文が短縮のため書き換えていたり、他にも部分的に変えてあるのでちょっとおかしくなっているかもしれません。そもそもあっている自信もないのですが、おかしな部分があればご指摘願います。)
どうぞ宜しくお願い致します。
追記です。
環境についてですが、使用しているのはEclipseというソフトで、PcがMacのためオラクルではなくMysqlを使用しています。(他に情報というとどのような点について記載すればよいのでしょうか、申し訳ありません)
どこがうまくいってないのかという原因を明確にできていないのですが、デバッグをしてみるとdaoまで動作はしているとは思います。結局jspの入力フォームから情報を渡せていないのか、servletかdaoのsql文に問題があるのかがまだよくわからない状況です。
情報が少なくて申し訳ありませんが、よろしくお願いします。
追記(誤ってコメントランに載せてしまっていたので再記します)
デバッグをして確認してみたところ変数にはちゃんと目的の値が格納されていました。なのでやはりsql文に問題があったようです。
insert文を複数のテーブルに対してやる場合はSELECT文と同じではダメなんですね・・・
自分で調べて見つけたのが
INSERT ALL
INTO テーブル名(カラム名1, カラム名2)
VALUES (カラム1, カラム2)
INTO テーブル名2(カラム名1, カラム名2)
VALUES (カラム1, カラム2)
SELECT * FROM DUAL;
というものだったんですがこれでも複数のテーブルに登録はできませんでした(テーブルを分けてのinsertは成功しています)。
こういう場合はsql文を二つ用意しないとダメなんでしょうか?
その時daoでのsql文を格納している変数"sql"は同じように変数をもう一つ用意するべきなんでしょうか?
大変お手数ですがよろしくお願いいたします。

回答3件
あなたの回答
tips
プレビュー