[JAVA] DBMS 연동

나옹·2022년 11월 20일
0

데이터를 자유롭고 편하게 사용하기 위해 오라클 DB와 연동을 해준다.

DBMS에서는 외부에서 자원을 공유하도록 한다.
공유할 때마다 공유에 필요한 자원을 할당해준다. (은행 창구)
만약 자원을 필요로 하는 프로그램이 100개라면 필요한 자원도 100개이다.
이렇게 무한대로 자원을 허락한다면 DBMS는 자원의 처리보다 연결을 관리하는데 더 많은 자원이 필요합니다. 그래서 성능이 저하될 수 있다.
그래서 이를 방지하기 위한 코드는
1. 자원을 할당 받은 후 자원을 반납한다.
2. 별도로 자원을 할당하는 객체를 만들고 그 객체에서는 미리 5개정도의 연결자원을 확보하고 필요한 객체에 공유하도록 한다.
Database connection pool(DBCP) 이라고 한다.

	private Connection conn = null;

데이터베이스 연결을 위한 자원(객체)의 주소를 저장할 참조변수를 전역으로 선언

클래스가 시작될 때 jdbc 드라이버를 로딩해준다.

	WordDAO(){
		//예외.. 프로그램 실행 중에 발생하는 것.. 에러: 실행조차 안됨..
		try {
			// 1. 드라이버 로딩(필요한 클래스를 자바로 로드)
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("로드 성공");
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			//e.printStackTrace();
			System.out.println("로드 실패");
		}
	}

필요할때마다 커넥션 얻어는 메서드 정의

	public boolean connect() {
		try {
			// 커넥션을 시도하고 그 결과를 얻어 오는 코드... 
			conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:orcl", "system", "11111111");
			System.out.println("연결성공");
			return true;
		} catch (SQLException e) {
			System.out.println("연결실패");
			return false;
		}
	}

연결요청을 하고 쿼리전송 결과를 받고 연결자원을 반납하는 순서

	public void insertWord(WordInfoDTO w) {
		if(connect()) {
			String sql="insert into word1 values (?,?,?,?,default)";
			//실제 쿼리를 전달하는 객체
			try {
				PreparedStatement psmt = conn.prepareStatement(sql); //쿼리 객체 얻어 오기
				psmt.setString(1, w.getEngName());  //mapping
				psmt.setString(2, w.getKorName());  //mapping
				psmt.setString(3, w.getImporFlag());  //mapping
				psmt.setString(4, w.getComment());  //mapping
				int r = psmt.executeUpdate();   // 쿼리 실행 후 리턴값 저장.
				System.out.println(r+"건이 입력되었습니다");
				conn.close();  // 연결자원을 반납
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}else {
			System.out.println("연결을 할 수 없어서 입력을 하지 못합니다.");
		}	
	}

원하는 데이터를 처리해주었다면 바로 Close()메서드로 연결을 끊어주어야 한다.

DAO는 WordManager에서 실행해도 상관이 없지만
코드가 많아지고 협업을 하게 되면 DAO를 찾거나, 이해하는것이 어려울 수 있다.
sql에 관련된 코드들은 전부 DAO 클래스를 따로 만들어 저장해주는 것이 좋다.

쿼리문이 완성된 쿼리문이라면

			String sql="select * from goods1";
				Statement s1=conn.createStatement();
				rs=s1.executeQuery(sql);

Statement를 사용하여 쿼리문을 넘겨주고
완성되지 않은 쿼리문이라면

			String sql="select * from goods1 where name=?";
				PreparedStatement  p1= conn.prepareStatement(sql);
				p1.setString(1, name);
				rs=p1.executeQuery();

쿼리문에 부족한 부분에 ? 를 넣어주고 PreparedStatement를 사용하여 ?에 들어갈 단어를 셋팅해준다. ?가 여러개여도 가능하다.

여러 튜플을 반환하는 경우

	public void search(String name) {
		ResultSet rs=null;
		if(connect()) {
			String sql="select * from goods1 where name=?";
			try {
				PreparedStatement  p1= conn.prepareStatement(sql);
				p1.setString(1, name);
				rs=p1.executeQuery();
				while(rs.next()) {
					System.out.println("ID: "+rs.getString("id"));
					System.out.println("이름: "+rs.getString("name"));
					System.out.println("수량: "+rs.getString("cnt"));
					System.out.println("가격: "+rs.getString("price"));
					System.out.println("판매자: "+rs.getString("sname"));
					System.out.println("등록일자: "+rs.getString("indate"));
					System.out.println("-----------------------");
				}
				
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}

자료형 ResultSet의 변수를 선언한 후 쿼리문의 결과를 저장시킨다.
while(rs.next())메서드를 사용하여 rs의 모든 값에 접근하고 저장된 값들을 출력시킨다.

만약 결과물이 하나뿐인 쿼리라면(조건문에 PK를 걸어준 경우) if(rs.next())로 사용하여도 무관하다.

profile
최고의 개발을 위해 !

0개의 댓글

관련 채용 정보