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

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

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

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

Q&A

解決済

1回答

3547閲覧

Javaで、 SQLデータベースからのデータの取り出しについて質問があります。

misa35

総合スコア7

Java

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

0グッド

0クリップ

投稿2015/11/01 16:05

まず、データベース内の説明をさせて頂きます。
MENUとCOLORという名前のテーブルがあり、MENU内にはIdとItemというカラム。COLOR内にはColorId とColorというカラムが存在します。MENUとCOLORは1:Mの関係にあり、それぞれのItem は複数のColorを保持している状態です。
そこで質問なのですが、全てのItemと、そのItemが保持する全てのColorを表示させる方法をご教授頂けませんでしょうか。
表示方法は Item, Color, Color, Color のように一つのItemが一行になるように。

MenuDB クラスのreadColorメソッドでColorを採取。MenuクラスのaddColorメソッドで複数のColorをコレクトし、同じくMenuクラスのgetColorsメソッドをMenuMainクラスから呼び出して表示…という手順のハズなのですが、呼び出したItemとColorをリンクさせる方法がわかりません。もしかしたらMenu内のコンストラクタも変える必要があるのでしょうか…。

以下のコードは省略部分、スペルミスも含め、正常に動いているものとして頂いて大丈夫です。
長々となりますが、3ファイル、以下に記載します。

宜しくお願い致します。

MenuMain.java
public class MenuMain {
public static void main(String[] args) {
MenuDB mdb = new MenuDB();
List<Menu> menu = mdb.getMenu();

System.out.println("All Menu:"); for (Menu allMenu: menu){ System.out.println("Item: " + allMenu.getItem() + " Color: " + ここにコレクトした複数のカラーを表示させるコード ); //もしかしたら、output は別にする必要があるのでしょうか…? } }

}

MenuDB.java

public class MenuDB {
-略-
private static final String GET_MENU_SQL = "SELECT * FROM MENU";
private static final String GET_MENU_COLOR_SQL = "SELECT * FROM MENU_COLOR WHERE MenuId = ?";

-略- private List<Menu> readMenu() { List<Menu> menu = new ArrayList<>(); try ( Connection connection = getConnection(); PreparedStatement stmt = connection.prepareStatement(GET_MENU_SQL); ResultSet rs = stmt.executeQuery() ) { while (rs.next()) { menu.add(new menu(rs.getInt("Id"), rs.getString("Item"))); } } - 略 catch(){ } - return menu; } private void readColor() { try ( Connection connection = getConnection(); PreparedStatement stmt = connection.prepareStatement(GET_MENU_COLOR_SQL); ) { for (Menu m: menu) { stmt.setInt(1, m.getId()); ResultSet rs = stmt.executeQuery(); while(rs.next()){ // rs.getString(“Color”) をどうすれば、上のreadMnuメソッドのデータと //リンクする事が出来るのでしょう? } rs.close(); } } - 略 catch(){ } – } public List<Menu> getMenu() { return menu; }

}

Menu.java
private String color;
private List<String> colors;

public Menu (int id, String item) { this.id = id; this. item = item; }

//ここのaddColor()とgetColors()の中身は正解かどうかわからないです。
public void addColor (String color){
colors = new ArrayList<>();
colors.add(color);
}

public String getColors() { return colors.toString(); } public int getId() { return id; } public String getItem() { return item; }

}
-------------------------------------------------------------以上

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

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

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

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

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

guest

回答1

0

ベストアンサー

文中とコードでテーブル名が一致していないのと結合のキーの説明がないので合っているか分かりませんが、

  • MENUテーブルのIdカラムがPK
  • MENUテーブルのIdカラムとMENU_COLORテーブルのMenuIdカラムがFK?

ならばSQLで結合してしまい、Mapに詰めていきます。
最後にMapの値を取得すればおしまいです。

java

1private static final String GET_MENU_SQL = "SELECT m.Id, m.Item, mc.Color FROM MENU m INNER JOIN MENU_COLOR mc ON m.Id = mc.MenuId"; 2 3 private List<Menu> readMenu() { 4 Map<Integer, Menu> menu = new HashMap<>(); 5 try ( 6 Connection connection = getConnection(); 7 PreparedStatement stmt = connection.prepareStatement(GET_MENU_SQL); 8 ResultSet rs = stmt.executeQuery() 9 ) { 10 while (rs.next()) { 11 Integer id = rs.getInt("Id"); 12 String item = rs.getString("Item"); 13 String color = rs.getString("Color"); 14 if (!menu.containsKey(id)) { 15 menu.put(id, new Menu(id, item)); 16 } 17 menu.get(id).addColor(color); 18 } 19 } catch(SQLException e){ 20 e.printStackTrace(); 21 } 22 return menu.values(); 23 }

あとMenu#addColorは今の実装では最後に追加した値しか保存できないのでcolorsの初期化タイミングを見直しましょう。

投稿2015/11/01 17:00

編集2015/11/01 17:02
shiena

総合スコア1825

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

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

misa35

2015/11/02 10:42

不十分な説明、文中とコード名の不一致等々、不手際を考慮して下さって有難うございます。これまた説明不足だったのですが、コードは基本的に上記に準じる形が望ましく、従ってそれぞれのテーブルを別々に、それぞれのメソッドに呼び出す…という形のままの解決法を模索しておりました。あと、実は省略してありますがMENU内にはId,Itemの他にもいくつかのカラムが存在している為、HashMapではなくArrayListを使用しております。HashMapの事を考慮にいれて、カラムをもう一つ位は提示しておくべきでした。申し訳ありません。 ですが、頂戴したコードはとても端的で勉強になりました。今後Javaを勉強していく上で参考にさせて頂きたいと思います。 有難うございました。
shiena

2015/11/02 12:07

うーん、そうですか… そうなるとreadColorメソッドのwhile内のコメント箇所について、SQLの検索条件で既にリンクしているのでm.addColorするだけに見えます。 細かい事を言えば、以下のつっこみがありますが省略部分なんだと思っています。 * forのmenuがどこから出てきたのか? * readColorメソッドがどこからも呼ばれていない あと、表示方法が抜けていましたね。 MenuクラスのcolorsはListなので String#join を使えば簡単に出力できるでしょう。 http://docs.oracle.com/javase/jp/8/docs/api/java/lang/String.html#join-java.lang.CharSequence-java.lang.Iterable-
misa35

2015/11/04 12:34

再度のご支援有難うございます…!表示方法は join の使い方がよく分からなかったので以下のように書いてみたらちゃんと表示されました…よかったです…。 for (Menu m: menu){     System.out.print("Item: " + m.getItem() + " Color: " + m.getColors()); } SQLからの読み出しはご指摘の通り、readColorメソッド内で m.addColor(rs.getString("Color")); でした。 shienaさんのつっこみ通り、?にあたる箇所は省略部分でした。質問欄は短い方が良いだろうと思い色々省略したのですが、かえって回答者様に不要な推測をさせてしまうのだと理解しました。今後、同じような質問の場合は全てのコードを記載するように(あと、文中との不一致のないように)したいと思います。join も、折角教えて頂いたコードなので、今後活用出来るようにしっかり勉強したいと思います。 ネットでプログラミングの質問をするのは始めてで緊張しましたが、テラテイルを選んで、そしてshiena さんのような親切な方からご回答頂けて本当に良かったです。また何かありましたら宜しくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問