IT/Spring, 스프링(17.04.05~)

3. DB 연동 프로젝트(2) (2번 게시물 이어서)

만두토끼 2018. 4. 12. 16:25

코드 작성 & DB의 데이터 읽기


5. GoodDao 클래스의 생성자 접근 지정자를 private 로 변경

코드 입력 받아 DB의 데이터를 읽어오는 메소드 생성

package dao;


import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;


import domain.Good;


public class GoodDao {

//싱글톤을 만들기 위한 코드

private static GoodDao goodDao;


public GoodDao() {}


public static GoodDao sharedInstance() {

if(goodDao==null) {

goodDao=new GoodDao();

}

return goodDao;

}


//문자열로 된 code를 입력받아서 goods 테이블에서 데이터를 찾아서 리턴하는 메소드

public Good getGood(String code) {

Good good = null;


//데이터베이스 연동을 위한 변수

//finally에서 사용하기 위해서 여기서 생성

Connection con = null;

PreparedStatement pstmt = null;

ResultSet rs = null;


//문제가 발생할 가능성이 있는 코드, try-catch 구문에 넣기

try {

//오라클 드라이버 클래스 로드

Class.forName("oracle.jdbc.driver.OracleDriver");

//데이터베이스 연결

con=DriverManager.getConnection("jdbc:oracle:thin:@192.168.0.200:1521:xe",

                               "user23","user23");

//goods 테이블에서 code를 가지고 데이터를 조회하는 sql

pstmt=con.prepareStatement("select * from goods where code=? AND price>=?");


                        //pstmt.setString(1,code); <- 무엇을 의미하는건지 의문이 생김.

//code는 이미 "001"이라고 설정되어있는거 아닌가? 

                        //일단 실행해보고 만약 2를 넣었을 경우 어떤 결과가 나오는지 확인해보자

//오류뜸. -> 1의 의미가 혹시 column일까봐 name으로 바꾸어 보아도 2는 오류.

//그럼 여기서 1의 의미 하는건 뭘까? pstmt.setString의 document 확인 필요.

                        

                        //알아냄!

//첫번째 ?에 code을 넣는다.

pstmt.setString(1, code);


                        //확인을 위한 추가 코드

//두번째 ?에 3000을 넣어보자.

pstmt.setInt(2, 3000);

//pstmt.setInt(2, 6000);

//6000 넣으면 해당하는 조건없으니까 null

                        //DB의 code 1에 해당되는 구아바는 price가 5000이므로

 //>>결론: pstmt.setString(1,code) 에서 1은 첫번째, 2를 넣으면 두번째 ?를 의미

 //>>결론: 그 뒤의 값은 ?에 넣을 값인것


//>>>>>>> 말도안되는 추측:goods Table의 low 1개를 가져 오는 것 

//>>>>>>> 말도안되는 추측:아! sql 에서 code 라는 primary key를 만들었었네~(무관)

//>>>>>>> 말도안되는 추측:아! where은 조건이었잖아~ 


//sql 실행

rs=pstmt.executeQuery();


//데이터읽기

//rs.next를 해서 데이터가 남아있는 경우에 중괄호 안의 코드를 실행

if(rs.next()) {

good = new Good();

good.setCode(rs.getString("code"));

good.setName(rs.getString("name"));

good.setManufacture(rs.getString("manufacture"));

good.setPrice(rs.getInt("price"));

}

}

//문제가 발생했을 때 수행하는 코드

catch(Exception e) {

//어떤 문제가 발생 했는지 확인

System.out.println("Dao-get: "+e.getMessage());

//예외 발생 위치를 확인

e.printStackTrace();

}

//무조건 수행할 코드

finally {

try {

//닫을 때는 생성되는 것의 역순으로 닫기

//생성된 경우에만 닫도록 합니다.

//생성되지 않았는데 닫으면 이미 닫혔다고 예외 발생

if(rs!=null) rs.close();

if(pstmt!=null) pstmt.close();

if(con!=null) con.close();


}catch(Exception e){}

}

return good;

}

}



6. Main 클래스의 main 메소드 수정

package main;


import dao.GoodDao;


public class Main {

//Java 응용 프로그램에서 사용되는 entry point(진입점)

//Java 응용 프로그램을 실행하면 이 메소드가 호출됩니다.


public static void main(String[] args) {

GoodDao goodDao = GoodDao.sharedInstance();

System.out.println(goodDao.getGood("001"));

}

}