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

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

新規登録して質問してみよう
ただいま回答率
85.48%
DAO(Data Access Object)

DAO(Data Access Object)とは、データベースなどに保存するための操作を実装したオブジェクトのことです。データの永続化機構に抽象化されたインタフェースを提供し、データベースの詳細を隠蔽。ビジネスロジックとデータ操作も分離できます。

Java

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

817閲覧

データーベースの情報を削除する機能を作りたい

lemon1027

総合スコア4

DAO(Data Access Object)

DAO(Data Access Object)とは、データベースなどに保存するための操作を実装したオブジェクトのことです。データの永続化機構に抽象化されたインタフェースを提供し、データベースの詳細を隠蔽。ビジネスロジックとデータ操作も分離できます。

Java

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2021/06/21 10:36

社員データベースに入っているデータを削除する機能を作成したいです。

・ResultSet rs =pStmt.executeQuery();のところがエラーになり調べたところ、executeUpdate()を使用するべきだとわかったのですが、これを入れると「int から ResultSet には変換できません」と出てきて、結局どうしたらいいのかわかりません。

・★①のところ。なんと書けば、削除該当の社員番号が出力されるのでしょうか。

・★②のところ。YかNをキーボード入力させて、inputにとりこみたいのですが、自分なりに書いてみてもエラーになってしまい、よくわかりませんでした。

まだ勉強したばかりである上に、理解が浅いまま元々ある検索機能やログイン機能を見ながら書いたということもあり、頑張ってみたけど多分いろいろ間違えているんだろうな・・・と思っています。
よろしくお願いいたします。

Java

1public class MainSystem{ 2 public static void main(String[] args) { 3 // TODO 自動生成されたメソッド・スタブ 4 5 String jdbcUrl="jdbc:mysql://localhost/eimsdb?serverTimezone=JST";//データベースに接続するためのURL 6 String user="eimsuser";//データベースに接続するためのユーザ名 7 String passwd="eimspass";//データベースに接続するためパスワード 8 9 //接続メソッド 10 try(Connection con = DriverManager.getConnection(jdbcUrl,user,passwd)){ 11 12 boolean fact=true; //true = ログインが完了していない 13 while(fact) { 14 ArrayList<String> inf = LoginGamen.getLoginInfo(); //ログイン入力情報の入れ子 15 int empno = Integer.parseInt(inf.get(0)); 16 String password = inf.get(1); 17 18 fact = Login.doLogin(con, empno, password); 19 } 20 21 fact = true; 22 String function; 23 String input = null; 24 25 if(Login.getDeptname().equals("人事部")){ 26 JinjiDAO jinji =new JinjiDAO(con); 27 while(fact) { 28 function = JinjiDAO.showFunctions(); 29 if(function.equals("検索")) { 30 ArrayList<Syain> syain =jinji.doKensaku(); 31 32 for(Syain s : syain) { 33 System.out.println(s); 34 } 35 36 }else if(function.equals("追加")) { 37 38 }else if(function.equals("削除")) { 39 ArrayList<Syain> syain =jinji.doSakuzyo(); 40 System.out.println("以下の社員を削除しますか?");//確認画面 41 System.out.println("社員番号:" + ★①該当の社員番号); 42 System.out.println("氏:"); 43 System.out.println("名"); 44 System.out.println("氏(カナ):"); 45 System.out.println("名(カナ):"); 46 System.out.println("パスワード:"); 47 System.out.println("性別:"); 48 System.out.println("部署コード:"); 49 ★②YNをキーボード入力させて、inputにとりこみたい 50 System.out.println("(YorN):"); 51 if(input.equals("Y")||input.equals("N")) { 52 break; 53 }else { 54 System.out.println("YまたはNを入力してください"); 55 } 56 } 57 } 58 59 }else if(function.equals("変更")) { 60 61 } 62 input = LogoutGamen.doLogout(); 63 if(input.equals("Y")) { 64 break; 65 }else { 66 SyainDAO syain = new SyainDAO(con); 67 while(fact) { 68 function=FunctionListSyain.showFunctions(); 69 if(function.equals("検索")) { 70 ArrayList<Syain> sList =syain.doKensaku(); 71 72 for(Syain s : sList) { 73 System.out.println(s); 74 } 75 } 76 input= LogoutGamen.doLogout(); 77 if(input.equals("Y")){ 78 break; 79 } 80 81 82 } 83 } 84 }catch(SQLException e) { 85 e.printStackTrace(); 86 } 87 } 88}

Java

1public class Sakuzyo { 2 3 public static String createSql() { 4 StringBuilder sql = new StringBuilder(); 5 sql.append("delete from employee whele emp = "); 6 try { 7 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 8 9 System.out.print("削除したい社員番号を入力してください"); 10 System.out.println("->"); 11 String empno = br.readLine(); 12 sql.append(empno); 13 }catch(IOException e) { 14 e.printStackTrace(); 15 } 16 return sql.toString(); 17 } 18}

Java

1public class SyainDAO { 2 private Connection con = null; 3 4 public SyainDAO(Connection con) { 5 this.con = con; 6 } 7 public ArrayList<Syain> doSakuzyo() { 8 ArrayList<Syain> syainList = new ArrayList<>(); 9 String sql = Sakuzyo.createSql(); 10 11 try { 12 PreparedStatement pStmt = con.prepareStatement(sql); 13 ResultSet rs =pStmt.executeQuery(); //sqlを実行し、rsに格納 14 while (rs.next()) { 15 int empno = rs.getInt("empno"); 16 String lname = rs.getString("lname"); 17 String fname = rs.getString("fname"); 18 String lkana = rs.getString("lkana"); 19 String fkana = rs.getString("fkana"); 20 String password = rs.getString("password"); 21 int gender = rs.getInt("gender"); 22 int deptno = rs.getInt("deptno"); 23 String deptname = rs.getString("deptname"); 24 25 Busyo busyo = new Busyo(deptno, deptname); 26 syainList.add(new Syain(empno, lname, fname, lkana, fkana, password, gender, deptno, busyo)); 27 28 } 29 } catch (SQLException e) { 30 e.printStackTrace(); 31 } 32 return syainList; 33 } 34}

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

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

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

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

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

guest

回答1

0

ベストアンサー

エラー原因はリファレンス読んでみればわかります。

PreparedStatement#executeUpdate

戻り値:
(1) SQLデータ操作言語(DML)文の場合は行数、(2)何も返さないSQL文の場合は0

返却値がintなのでResultSetでは受け取れません。


ただ、そもそもロジックおかしいです。

PreparedStatement pStmt = con.prepareStatement(sql);
ResultSet rs =pStmt.executeQuery(); //sqlを実行し、rsに格納

SyainDAO.doSakuzyo()で削除してしまってます。(executeUpdateは直接関係ない)
「以下の社員を削除しますか?」と出ているときには該当のデータ削除は終わっています。
そうではなく、キー(DELETEと同じ検索条件)でSELECTしてきた結果を表示させたうえで「Y」→削除実行とすべきです。

投稿2021/06/21 10:54

編集2021/06/21 10:56
m.ts10806

総合スコア80850

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

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

lemon1027

2021/06/21 11:53

遅くなり申し訳ありません。考えていたら時間がかかってしまいました。 >返却値がintなのでResultSetでは受け取れません。 ResultSetがexecuteUpdateでは使えないことは理解できました。 となると、ResultSet rs =pStmt.executeQuery();の部分は int del =pStmt.executeUpdate(); などに変える必要があるのでしょうか? もしそうならば、この続きがわからず手が止まってしまいました。 >キー(DELETEと同じ検索条件) Sakuzyoでは ssql.append("delete from employee whele emp = "); sql.append("select * from employee whele emp = "); と、上記二種類のSQLが必要になるということでしょうか?
m.ts10806

2021/06/21 11:59

リンクのリファレンスは読まれましたか? 該当箇所も引用したのですけど。 そもそもの問題点として「確認メッセージを出す前に削除実行している」ことなので、 ・SELECTで対象のデータを取得 ・「削除しますか?」で対象データをprintで表示 ・Y でDELETE実行 と現在のロジックを大幅に書き換える必要があります。 「上記二種類のSQLが必要になる」については「YES」が返答ですが、 それぞれ独立して実行されるものですし、「N」が選択されればDELETEは実行されません。
dodox86

2021/06/21 12:27

>@質問者さん executeQueryでどんなSQLを対象に実行するのかというとSELECT文なので、0個以上の結果(行)が返ります。なので返り値はResultSetで受けるのです。対してexecuteUpdateではどんなSQLかというとDELETEやUPDATE、INSERT文です。これらの実行結果は処理された行数で返るので、返り値がintなのです。どういうSQLを実行し、それによって何を得るのか。その後に何をしたいのか良く考えましょう。
lemon1027

2021/06/21 12:33

>リンクのリファレンスは読まれましたか? リファレンスは読ませていただきました。ただ、私の読解力と経験不足では今回のコードexecuteUpdateをどのように活用するのか、少々難しかったです。 >「確認メッセージを出す前に削除実行している」 MainSystemの削除部分はこのような感じでしょうか。 (★はどう書いていいかわからない箇所です) 的外れなことを言っていたら申し訳ありません。 }else if(function.equals("削除")) { ArrayList<Syain> syain =jinji.doSakuzyo(); String sql = Sakuzyo.createSql(); try { PreparedStatement pStmt = con.prepareStatement(sql); ResultSet rs =pStmt.executeQuery(); while (rs.next()) { System.out.println("以下の社員を削除しますか?");//確認画面 System.out.println("社員番号:" + ★ ); System.out.println("氏:"); System.out.println("名"); System.out.println("氏(カナ):"); System.out.println("名(カナ):"); System.out.println("パスワード:"); System.out.println("性別:"); System.out.println("部署コード:"); System.out.println("(YorN):"); if(input.equals("Y")) { String ssql = Sakuzyo.createSql(); ★ }else if(input.equals("N")) { break; }else { System.out.println("YまたはNを入力してください"); } } } catch (SQLException e) { e.printStackTrace(); }
m.ts10806

2021/06/21 12:34

1個ずつやりませんか。 まず「削除対象のデータを取得するSELECT」だけ。
lemon1027

2021/06/21 12:49

dodox86さん ご回答ありがとうございます。 SQL文に該当した行数が返ってきたとして、そのあとその行数をどのように活用するのかわからず、混乱してしまいました。
lemon1027

2021/06/21 12:51

m.ts10806さん わかりました。 現在、「削除対象のデータを取得するSELECT」は sql.append("select * from employee whele emp = "); ここにsql.append(empno);でキーボード入力した社員番号をSELECTしている、という流れです。
m.ts10806

2021/06/21 13:04

>SQL文に該当した行数が返ってきたとして、そのあとその行数をどのように活用するのかわからず 「削除された行数」なので、0かそれ以上かで分岐できます。 >sql.append(empno);で エスケープされてないのとか、「キーボード入力した社員番号」と言いつつ入力された情報を受け取っているコードなかったりとか、色々と疑問に思う部分はありますが、 ロジックの整理のためにフローチャート一度書かれては。 現状のコードからなんとかしようとすると手法にしか目に行かないので 「実現したい要件は何か」からフローを書いて、その通りに実装する。 すると無駄な実装や使うべき機能が見えてきます。 書きながら考えるのではなく、考えてから書く。
lemon1027

2021/06/21 13:34

理解と経験不足なので、フローチャートで整理してみたいと思います。 ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問