質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Q&A

解決済

3回答

26574閲覧

jsp→servlet→daoの流れでMysqlへレコードの追加

manmos

総合スコア55

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

0グッド

2クリップ

投稿2016/02/21 07:50

編集2016/02/25 15:17

現在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"%>

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta http-equiv="Content-Type" content= "width=device-width, initial-scale=1"> <script type="text/javascript"> </script> <title>登録</title> </head> <body> <h1>登録</h1> <form action="./Syousai" method="post"> 氏名<input type="text" name="Name" size="20" maxlength="20"><br> 生年月日<input type="text" name="BirthDay" size="10" maxlength="10"><br> 性別<input type="radio" name="性別" value="0" /> 男 <input type="radio" name="性別" value="1" /> 女<br>

(略)

<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"は同じように変数をもう一つ用意するべきなんでしょうか?

大変お手数ですがよろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lib

2016/02/21 10:05

開発の環境についてもっと詳しい情報を記載いただけますか?どこまでがうまくいってどこまでがうまくいかないかもあわせていただけますか。
guest

回答3

0

MySQLでは SELECT * FROM DUAL は利用できません。(Oracle DB独自の構文です)
なお、複数のテーブルへ一括INSERTできる構文もありません。

MySQLでの一括投入するは、1つのテーブルに対して複数の組み合わせを投入する方法があり、MySQLでは以下のように書きます。

insert into Table1 (column1,column2) values(1,1),(2,3),(3,6);

よって2つSQLを発行するようになるか、またはうまく動的にSQLを組み立ててコード量を減らすといった工夫が必要でしょう。

投稿2016/04/23 18:14

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

接続関係がうまくいっていることが前提ですが、sql構文エラーである可能性が比較的高そうです。
内容を再度見直していただけますか。

そのうえで、小生でわかる限りの推測をしました。質問と追記していただいた内容に対して以下の取り組みをしてもらえますか。

1.結局jspの入力フォームから情報を渡せていないのか
以下のやり方をとってみてください。
・サーブレットのソースコードで以下内容のところを書き換えてください。
・実行してみて、eclipse側でのConsole出力を確認する。

◆変更前

Java

1String name = request.getParameter("Name"); 2String birthday = request.getParameter("BirthDay"); 3String sex = request.getParameter("性別");

◆変更後

Java

1String name = request.getParameter("Name"); 2System.out.println(name); 3String birthday = request.getParameter("BirthDay"); 4System.out.println(birthday); 5String sex = request.getParameter("性別"); 6System.out.println(sex);

2.servletかdaoのsql文に問題があるのか
servletは、1について確認してみてください。

daoのsqlについては、
実際のmysql側に直接例文を入れて確認されるとよいかと思います。
また、この構文ではおそらくエラーであることがmysql側から表示されたりしませんか?

そもそも、insert構文ではleft outerによる結合表記はmysqlでは許容できないです。

もしこのようなアプローチをとる場合は、以下のアプローチに置き換えてみるのはいかがでしょうか。
1.left outer joinの条件を満たすように一度SELECT分で抽出する
抽出したデータはjava側にて持つようにしてください

2.次に挿入したいテーブル table_aに対して、1の条件を満たしたデータのうち登録したい
データを以下のsqlにて登録する。

※質問内容からテーブル構造がわからないので無視して適当な推測で入力しているため、
そのまま利用せず登録するカラムの数、型と、値の数はあわせて登録できるsqlに直して利用すること。

sql

1INSERT INTO table_a (employeeId, name, name_hiragana, birthday, sex, mail_address, teliphone_number, company_id, business_maneger, department, commissioning_status, enter_date, retire_date, status) VALUE 2('0001', 'name1', 'name-hiragana', sysdate(), 0, 'mail@example.com', '000', 'c001', 'manager1', '', 0, sysdate(), sysdate(), 0)

投稿2016/02/21 11:21

lib

総合スコア446

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

manmos

2016/02/23 15:10

間が空いてしまって失礼いたしました。 デバッグをして確認してみたところ変数にはちゃんと目的の値が格納されていました。なのでやはり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"は同じように変数をもう一つ用意するべきなんでしょうか? 大変お手数ですがよろしくお願いいたします。
guest

0

ベストアンサー

Insert文の「?」の数が4つに対して、パラメータセットが3つしか設定されていないので単純なエラーなのではないでしょうか? パラメータ設定が1つ不足しています。

(追記)
例外が発生したときに、何も処理が記載されていないようですが、
エラー原因を探るためにも、自前で何かしらの形で用意しとくと便利ですよ。

投稿2016/02/21 11:11

favoriteigo

総合スコア66

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問