Cute Happy Ghost
본문 바로가기
JAVA/Java

20201105_29 jdbc문제 및 해결

by JENN_tech7 2020. 11. 5.
728x90
SMALL

#1

 

 

1.

원인 : 컬럼인덱스는 1부터 시작하는데 0부터 불러오고있다

조치 : 1부터 시작하도록 

if(rset.next()) {
	Memo m = new Memo();
	m.setNo(rset.getInt(1));
	m.setName(rset.getString(2));
	m.setMsg(rset.getString(3));
	m.setWriteday(rset.getDate(4));				
    }

 

 

2.

원인 : 조회된 결과 memo객체에 저장후 list에 담아야 하지만 담지않음

조치 : list에 담음

list.add(m)

 

 

 

3.

원인 : 여러행을 출력하는 쿼리지만 if문을 사용하였기떄문에 여러 row가 조회되어도 상단의 첫 행만 불러와서 저장함

조치 : if를 while로 변경

        if(rset.next()) 
		//변경후
        while(rset.next()) 

 

 

 

*****최종코드*****

 

  • Controller
import java.util.ArrayList;

public class Controller {

	public static void main(String[] args) {
		Dao dao = new Dao();
		ArrayList<Memo> list = dao.selectAll();
		if(list.isEmpty()) {
			System.out.println("데이터가 없습니다.");
		}else {
			System.out.println("NO\tNAME\tMSG\tWRITEDAY");
			System.out.println("-----------------------------------");
			for(Memo m : list) {
				System.out.println(m.getNo() + "\t" + m.getName() + "\t" + m.getMsg() + "\t" + m.getWriteday());			
			}
		}
	}
}

list.isempty()에 값이 하나도 없으면 true

 

 

 

  • 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;

public class Dao {

	public ArrayList<Memo> selectAll() {
		ArrayList<Memo> list = new ArrayList<Memo>();
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rset = null;
		String query = "select * from memo";
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe", "system", "oracle");
			pstmt = conn.prepareStatement(query);
			rset = pstmt.executeQuery();
			while(rset.next()) {
				Memo m = new Memo();
				m.setNo(rset.getInt(1));
				m.setName(rset.getString(2));
				m.setMsg(rset.getString(3));
				m.setWriteday(rset.getDate(4));		
				list.add(m);
			}
		} catch (ClassNotFoundException e) {			
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			try {
				rset.close();
				pstmt.close();
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return list;
	}
}

 

 

  • memo
import java.sql.Date;
public class Memo {

	private int no;
	private String name;
	private String msg;
	private Date writeday;

	public Memo() {
		super();
	}

	public Memo(int no, String name, String msg, Date writeday) {
		super();
		this.no = no;
		this.name = name;
		this.msg = msg;
		this.writeday = writeday;
	}

	public int getNo() {
		return no;
	}

	public void setNo(int no) {
		this.no = no;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getMsg() {
		return msg;
	}

	public void setMsg(String msg) {
		this.msg = msg;
	}

	public Date getWriteday() {
		return writeday;
	}

	public void setWriteday(Date writeday) {
		this.writeday = writeday;
	}	
}

 

****결과****

 

 

 

 

 

 

#2

 

 

1

원인: setInt 메소드에 파라미터 순서 설정 잘못됨(1부터 시작해야함)

조치: setInt 1번으로 수정

pstmt.setInt(1, no);

 

 

 

2.

원인 : resultSetㅔㅇ서 파라미터 순서가 1번부터이지만 0번부터 시작하고있음

조치 : rset.get... 파라미터 인덱스 1부터 시작하도록 수정

 

 

 

3

원인 : 자원 반환을 하는 코드가 누락됨

조치 : 자원반환 코드를 추가함

finally {
	try {
		rset.close();
		pstmt.close();
		conn.close();
	} catch (SQLException e) {
		e.printStackTrace();
	}
}

 

 

 

 

****최종코드****

  • Controller
import java.util.ArrayList;//두번째문제
public class Controller {
	public static void main(String[] args) {
		Dao dao = new Dao();
		Memo m = dao.selectOne(101);
		if(m == null) {
			System.out.println("데이터가 없습니다.");
		}else {
			System.out.println("NO\tNAME\tMSG\tWRITEDAY");
			System.out.println("-----------------------------------");
			System.out.println(m.getNo() + "\t" + m.getName() + "\t" + m.getMsg() + "\t" + m.getWriteday());			
			
		}
	}
}
  • 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;
public class Dao {
	public Memo selectOne(int no) {
		Memo m = null;
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rset = null;
		String query = "select * from memo where no = ?";
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:xe", "system", "oracle");
			pstmt = conn.prepareStatement(query);
			pstmt.setInt(1, no);
			rset = pstmt.executeQuery();
			if(rset.next()) {
				m = new Memo();
				m.setNo(rset.getInt(1));
				m.setName(rset.getString(2));
				m.setMsg(rset.getString(3));
				m.setWriteday(rset.getDate(4));				
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try {
				rset.close();
				pstmt.close();
				conn.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return m;
	}
}
  • Memo
import java.sql.Date;
public class Memo {
	private int no;
	private String name;
	private String msg;
	private Date writeday;
	public Memo() {
		super();
	}
	public Memo(int no, String name, String msg, Date writeday) {
		super();
		this.no = no;
		this.name = name;
		this.msg = msg;
		this.writeday = writeday;
	}
	public int getNo() {
		return no;
	}
	public void setNo(int no) {
		this.no = no;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getMsg() {
		return msg;
	}
	public void setMsg(String msg) {
		this.msg = msg;
	}
	public Date getWriteday() {
		return writeday;
	}
	public void setWriteday(Date writeday) {
		this.writeday = writeday;
	}	
}

 

****결과*****

 

 

 

 

 

※자원반환안했을 시

user1님이 모두에게:  11:50 AM 
2번문제 마지막 조치사항 자원반환 코드를 꼭 추가해야만 정상적으로 작동하는 건가요?
try ~ close() 저 부분 추가 안하고 했었을 때도 정상적으로 값 출력 되었었는데 다른 점이 무엇인가요? 

Chiho Won님이 모두에게:  11:52 AM 
추가 안해도 정상적으로 동작은 돼죠. 
자원 반환을 안해서 나중에 뿌셔지겠져 
프로그램이 지금이야 간단한 예제 프로그램이라서 바로바로 실행되고 꺼지지만 
회사에서 만들 애플리케이션은 배포 전까지 살아 있는 친구들이라 저런거 쌓이면 알아서 죽어요
배포하기도 전에 그럼 심각해지겠져 

 

나도 궁금했던 것이었는데 이런 이유였군

 

 

 

 

#3

 

1

원인 : DML은 executeUpdate로 실행해야하는데 executeQuery를 호출하고있음

조치 : executeQuery-> executeUpdate 

result = pstmt.executeUpdate();			

 

2

원인 : controller에서 변경 성공 여부를 출력하는 부분의 조건이 잘못됨

조치 : 출력 부분 조건 변경

  if (result > 0) {
            System.out.println("변경 성공");
        }

 

 

3

원인 : commit, rollback 제어 안됨

조치 : commitm, rollback제어코드 추가

 

 conn.commit();
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
            try {
                conn.rollback();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        } finally {
            try {
                pstmt.close();
                conn.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

 

728x90
LIST

'JAVA > Java' 카테고리의 다른 글

20201119 1:1채팅  (0) 2020.11.19
201106_32 상속  (0) 2020.11.06
20201104_28 thread  (0) 2020.11.04
20201104_28 jdbc  (0) 2020.11.04
20201104_27 Review  (0) 2020.11.04

댓글