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

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

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

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

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

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Q&A

解決済

2回答

682閲覧

参照画面を作成していますが、コンパイルエラーがとれません・・・

usako

総合スコア31

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

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

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

0グッド

0クリップ

投稿2019/05/30 07:28

編集2019/05/30 07:32

前提・実現したいこと

閲覧いただき、ありがとうございます。
Eclipse,Springを使ってJAVAの勉強をしている(超)初心者です。
元々、受講していた通信教育の課題がDBを使用しておらず、
内部にテーブルを保持している構造だったので、それを
MySQL,JDBCで外部化しようとしています。
一覧表示、更新、参照機能だけのシンプルな画面です。
内部テーブルを参照していたところを、DBに問合わせするよう
修正しているのですが、コンパイルエラーがとれません。
無理やりキャストするとコンパイルは通るのですが、
ClassCastExceptionが発生してしまいます。
根本的にロジックが間違っているのかもしれないのですが、
どこがどうおかしいのかもわかりません。
どなたかご教示いただけないでしょうか。

発生している問題・エラーメッセージ

AddressBookController.javaの★の個所でコンパイルエラーと
なります。
メソッドgetName()型List<Map<String,Object>>で未定義です
メソッドgetPhone()型List<Map<String,Object>>で未定義です
メソッドgetAddress()型List<Map<String,Object>>で未定義です

該当のソースコード

java

1(AddressBookController.java) 2package jp.practice.address; 3 4import java.util.List; 5import java.util.Map; 6 7import org.springframework.stereotype.Controller; 8import org.springframework.ui.Model; 9import org.springframework.web.bind.annotation.RequestMapping; 10 11@Controller 12@RequestMapping(value = "/book") 13public class AddressBookController { 14 private static final String INIT = "init"; 15 private static final String REFER = "refer"; 16 private static final String UPDATE = "update"; 17 private static final String LIST = "list"; 18 private static final String INIMSG = "従業員番号を入力してください"; 19 private static final String REFMSG = "情報が取得できました"; 20 private static final String UPDMSG = "情報を更新してください"; 21 private static final String ERRMSG = "該当するデータはありません"; 22 23 private RecordManager recordManager; 24 public AddressBookController(RecordManager recordManager) { 25 this.recordManager = recordManager; 26 } 27 28 @RequestMapping(value = "/start") 29 public String init(AddressBookForm form, Model model) { 30 model.addAttribute("message", INIMSG); 31 return INIT; 32 } 33 34 @RequestMapping(params = "reference") 35 public String refer(AddressBookForm form, Model model) { 36//*start *** 37 List<Map<String, Object>> list1 = recordManager.selectEmployee(form.getId()); 38 if (list1 != null) { 39★ form.setName(list1.getName()); 40★ form.setPhone(list1.getPhone()); 41★ form.setAddress(list1.getAddress()); 42// Employee employee = RecordManager.selectEmployee(form.getId()); 43// if (employee != null) { 44// form.setName(employee.getName()); 45// form.setPhone(employee.getPhone()); 46// form.setAddress(employee.getAddress()); 47//*e n d 48 model.addAttribute("message", REFMSG); 49 return REFER; 50 } else { 51 model.addAttribute("message", ERRMSG); 52 return INIT; 53 } 54 } 55 56 ----------割愛-------------- 57 58 @RequestMapping(params = "toInit") 59 public String toInit(AddressBookForm form, Model model) { 60 model.addAttribute("message", INIMSG); 61 return INIT; 62 } 63}

java

1(AddressBookForm.java)) 2package jp.practice.address; 3 4public class AddressBookForm { 5 6 private String id; 7 private String name; 8 private String phone; 9 private String address; 10 11 public AddressBookForm() { 12 } 13 /** 14 * @return id 15 */ 16 public String getId() { 17 return id; 18 } 19 /** 20 * @param id セットする id 21 */ 22 public void setId(String id) { 23 this.id = id; 24 } 25 /** 26 * @return name 27 */ 28 public String getName() { 29 return name; 30 } 31 /** 32 * @param name セットする name 33 */ 34 public void setName(String name) { 35 this.name = name; 36 } 37 /** 38 * @return phone 39 */ 40 public String getPhone() { 41 return phone; 42 } 43 /** 44 * @param phone セットする phone 45 */ 46 public void setPhone(String phone) { 47 this.phone = phone; 48 } 49 /** 50 * @return address 51 */ 52 public String getAddress() { 53 return address; 54 } 55 /** 56 * @param address セットする address 57 */ 58 public void setAddress(String address) { 59 this.address = address; 60 } 61}

java

1(Employee.java) 2package jp.practice.address; 3 4public class Employee { 5 6 private String id; 7 private String name; 8 private String phone; 9 private String address; 10 11 /** 12 * @param id 13 * @param name 14 * @param phone 15 * @param address 16 */ 17 public Employee(String id, String name, String phone, String address) { 18 this.id = id; 19 this.name = name; 20 this.phone = phone; 21 this.address = address; 22 } 23 /** 24 * @return id 25 */ 26 public String getId() { 27 return id; 28 } 29 /** 30 * @param id セットする id 31 */ 32 public void setId(String id) { 33 this.id = id; 34 } 35 /** 36 * @return name 37 */ 38 public String getName() { 39 return name; 40 } 41 /** 42 * @param name セットする name 43 */ 44 public void setName(String name) { 45 this.name = name; 46 } 47 /** 48 * @return phone 49 */ 50 public String getPhone() { 51 return phone; 52 } 53 /** 54 * @param phone セットする phone 55 */ 56 public void setPhone(String phone) { 57 this.phone = phone; 58 } 59 /** 60 * @return address 61 */ 62 public String getAddress() { 63 return address; 64 } 65 /** 66 * @param address セットする address 67 */ 68 public void setAddress(String address) { 69 this.address = address; 70 } 71 /* (非 Javadoc) 72 * @see java.lang.Object#hashCode() 73 */ 74 @Override 75 public int hashCode() { 76 final int prime = 31; 77 int result = 1; 78 result = prime * result + ((id == null) ? 0 : id.hashCode()); 79 return result; 80 } 81 /* (非 Javadoc) 82 * @see java.lang.Object#equals(java.lang.Object) 83 */ 84 @Override 85 public boolean equals(Object obj) { 86 if (this == obj) { 87 return true; 88 } 89 if (obj == null) { 90 return false; 91 } 92 if (!(obj instanceof Employee)) { 93 return false; 94 } 95 Employee other = (Employee) obj; 96 if (id == null) { 97 if (other.id != null) { 98 return false; 99 } 100 } else if (!id.equals(other.id)) { 101 return false; 102 } 103 return true; 104 } 105}

java

1(RecordManager.java) 2package jp.practice.address; 3 4import java.util.ArrayList; 5import java.util.List; 6import java.util.Map; 7 8import org.springframework.jdbc.core.JdbcTemplate; 9import org.springframework.stereotype.Component; 10@Component 11public class RecordManager { 12 private JdbcTemplate jdbcTemplate; 13 14// /** 初期値データ */ 15 private static List<Employee> list = new ArrayList<>(); 16 static { 17 } 18 public RecordManager(JdbcTemplate jdbcTemplate) { 19 this.jdbcTemplate = jdbcTemplate; 20 } 21 /** 22 * 指定したID のレコードを取得 23 * 24 * @param id 25 * 従業員番号 26 * @return Employee 27 */ 28 29/**start ****/ 30// public static Employee selectEmployee(String id) { 31 public List<Map<String, Object>> selectEmployee(String id) { 32 System.out.println("step1"); 33 List<Map<String, Object>> list1 = jdbcTemplate.queryForList("select * from unit02.addressbook where id = '200101'"); 34 System.out.println("step2"); 35 System.out.println("list1=" + list1); 36 return list1; 37// int index = list.indexOf(new Employee(id, "", "", "")); 38// if (index < 0) { 39// return null; 40// } 41// return list.get(index); 42/**e n d*/ 43 } 44 45 /** 46 * 指定した従業員情報を反映 47 * 48 * @param emp 49 * 従業員情報 50 */ 51 public static void updateEmployee(Employee emp) { 52 int index = list.indexOf(emp); 53 list.set(index, emp); 54 } 55 public List<Map<String, Object>> getEmployeeList() { 56 List<Map<String, Object>> list1 = jdbcTemplate.queryForList("select * from unit02.addressbook order by id"); 57 return list1; 58 } 59}

試したこと

クイック・フィックス機能で(Employee)や(AddressBookForm)にキャスト
してみましたが、実行時にClassCastExceptionが発生してしまいます。

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

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

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

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

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

guest

回答2

0

ベストアンサー

id, name, phone, address を Employee で纏めて扱おうとされているのに, RecordManager のメソッドは結果を List<Map<String, Object>> で返す等, ちぐはぐです.

selectEmployee が Employee を返す宣言がコメント化されていることを見ますと, 元は Employee だった返り値を, jdbcTemplate.queryForList が List を返すからと変更されたのでは無いでしょうか.

このような場合は宣言を変えずにメソッド内でその変化を吸収するようにしなければ, 折角動作していたコードをあちこち直すことになり, ごちゃごちゃになり易いかと思います.

id によって SELECT が 0~1件しか結果を返さないのでしたら, List にも 0~1件しか入っていませんので, それを取り出して Employee に詰め直し, 返り値として戻せば良いと思います.

いっそ queryForObject を使うようにしてみました. なお, コンパイルもしていませんので, ご参考までに.

java

1 public Employee selectEmployee(String id) { 2 return jdbcTemplate.queryForObject("select * from unit02.addressbook where id = ?", 3 new Object[]{ id }, 4 new RowMapper<Employee>() { 5 @Override 6 public Employee mapRow(ResultSet rs, int rowNum) throws SQLException { 7 Employee employee = new Employee(); 8 employee.setId(rs.getString("id")); 9 employee.setName(rs.getString("name")); 10 employee.setPhone(rs.getString("phone")); 11 employee.setAddress(rs.getString("address")); 12 return employee; 13 } 14 }); 15 }

投稿2019/05/30 09:22

編集2019/05/30 13:07
jimbe

総合スコア12543

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

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

退会済みユーザー

退会済みユーザー

2019/05/30 09:59

やるなら第2引数にちゅうもくしないと?
jimbe

2019/05/30 13:01

RowMapper にもしてみました. 書いただけですが...
usako

2019/05/31 05:26

皆さまコメントありがとうございます! jimbe様、サンプルロジックで無事、動くようになりました! ただ、ソースの中でなぜこの記述が必要なのか理解できない個所が何点かありました。ネットでも調べたのですが・・・ 理由を教えてはいただけないでしょうか。 ①return <戻り値>という文法しかダメだと思っていたのですが、 ソースを拝見するとreturn <戻り値>,<Object>,<Object>となっているように見えました。(勘違い?)このような記述も可能ということでしょうか? ②idをObject型でインスタンス化している意味がわかりませんでした。 ③@Overrideする意味がわかりませんでした。 return jdbcTemplate.queryForObject("select * from unit02.addressbook where id = ? ",←① new Object[]{ id },←② new RowMapper<Employee>() { @Override←③ public Employee mapRow(ResultSet rs, int rowNum) throws SQLException { Employee employee = new Employee("","","","");   ・   ・   ・
jimbe

2019/05/31 06:11 編集

取り敢えず動いたようで良かったです.(本当に何も確認していないコードでしたので.) return ですが, 各括弧の対応をご確認戴ければ, jdbcTemplate.queryForObject メソッドの戻り値を return しているのがお分かりになると思います. new Object[]{ id } は,『要素としてidを持つObject配列の生成』です. JdbcTemplate#queryForObject には幾つかオーバーロードされた形式がありまして, このコードでは 第1引数に文字列, 第2引数にObject配列, 第3引数に RowMapperオブジェクトを持つ形式を使用しました. 第2引数の配列は第1引数の SQL 内に書いた'?'に対応していまして, このようにすると JdbcTemplate#queryForObject が id を ? の箇所に(必要に応じてクオットをつけたりエスケープしたりして)自動で埋め込んでくれます. @Override は, この場合は『mapRow は RowMapper で定義されたものです』程度の意味でした.
usako

2019/05/31 07:38

jimbe様、返信ありがとうございます! JdbcTemplate.queryForObjectの文法の中の1つに則ってこのような記述になったとの理解で合っておりますでしょうか。
jimbe

2019/05/31 07:55

引数は勿論仕様に則って書かなければコンパイルエラーになりますから, そうするしかありません. 個別に変数を用意してメソッドを呼ぶ方が分かり易い場合もありますが, (このコードのObject配列のように)一瞬しか必要ない場合は, 直接書いた方が, 変数の有効範囲を極力狭くするという意味で分かり易くなります.
usako

2019/05/31 08:03 編集

jimbe様、早々のコメントありがとうございます! 何度も質問して申訳ありません。 「個別に変数を用意して ・・・(このコードのObject配列のように)」とありますが、この場合、変数を定義していることになっているのでしょうか? 変数には名前が必ずつくものと理解しています。 new Object[]{ id }には名前がついていないように見えるのですが。 レベルの低い質問で恐縮です・・・
jimbe

2019/05/31 08:20

『このコードのObject配列のように』はその後の『一瞬しか必要ない場合は』に付けたものですので, お察しの通り, new Object[]{ id } は変数には入っていません.
usako

2019/05/31 08:24

なるほど。すっきりしました。何度も返信をしてくださって感謝しています。 ありがとうございました。
jimbe

2019/05/31 08:42

いえいえ, 私の書いたものに対するご質問なら, 私が答えるのが正道ですので. お疲れさまでした.
guest

0

list1 の型が、Employeeではないです。
List<Map<String, Object>>型です。

ですので、Employeeクラスで定義している
メソッド getName()、getPhone()、getAddress()は、list1では未定義となります。

投稿2019/05/30 08:34

MAKOTO_MOBY

総合スコア193

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問