以下のクラスがあります。
・Empクラス
⇨社員ID、社員名、所属フィールドがある
・EmpDAOクラス
⇨DBに接続してSQL文を実行、取得した複数のレコードをリストで返す
・Mainクラス
⇨main()実行、取り出したレコードを表示
多くの場合、EmpDAOのメソッドで、
①SQL文実行、ResultSetに格納
②next()でレコードを一行ずつlistに追加
という処理をすると思います(だいぶ省いてますが)
今回、while文を使って②の処理を行ったのですが、取り出したi行目のレコードを一旦格納するEmp型変数empのオブジェクトを、EmpDAOクラス内のどこで作ったかによって、最終的な表示結果が変わってしまいました。
ケース①
・処理を行うメソッド(searchAllという名前に今回はしました)内の一番最初で行う
結果
・rsに取り出した複数レコードのうち、一番最後の行のレコードが、取り出した行分表示された
例) 001、鈴木、営業
002、高橋、経理
003、田中、企画 が取り出したレコードだとすると、
003、田中、企画
003、田中、企画
003、田中、企画
と表示されてしまった
ケース②
・while(rs.next())内で行う
結果
・取り出したレコードが一行ずつ正しく表示された
何故このように処理が変わってしまうのか、わかる方はどうかご教示下さい!
言語 Java ver.8
環境 eclipse
以下searchAll()メソッドです。
Java
1public List<Emp> searchAll() { 2List<Emp> list = new ArrayList<Emp>(); 3String sql = "SELECT empno, ename, job " 4+ "FROM emp;"; 5 6try(Connection conn = DriverManager.getConnection(*パスを記述しています); 7PreparedStatement pstmt = conn.prepareStatement(sql);) { 8 9ResultSet rs = pstmt.executeQuery(); 10 11while(rs.next()) { 12Emp emp = new Emp(); 13int empno = rs.getInt("empno"); 14String ename = rs.getString("ename"); 15String job = rs.getString("job"); 16 17emp.setEmpno(empno); 18emp.setEname(ename); 19emp.setJob(job); 20 21list.add(emp); 22} 23} catch(SQLException e) { 24e.printStackTrace(); 25} 26return list; 27} //メソッド終了
こんな感じです。
上記は正しく表示された記述です。
ケース①のようになってしまったときは、
Emp emp = new Emp();
を while(rs.next()) の中ではなく、
public List<Emp> searchAll() {
のすぐ下に記述しておりました。
宜しくお願い致します!
回答1件
あなたの回答
tips
プレビュー