주니 개발 도서관

오라클(Oracle)

(6) 자바에서 SQL을 이용해 CRUD 표현하기

주니홍 2022. 7. 4. 17:48

오라클과 자바를 연동하는

JDBC 4단계를 모두 준비 해놓는다!

 

stmt객체를 이용하여 JAVA에서 SQL을 이용하도록하고

CRUD와 접목시켜 사용해보겠습니다

 


0705 정리

stmt 객체를 이용하여 JAVA에서 SQL을 이용하고 있었는데,

오늘 배운 pstmt를 이용하여 CRUD와 접목시켜 사용하겠습니다!

 

사용할 SQL 테이블 이름은 STUDENT 입니다

 

 

잘생각해보면 InsertStudent, deleteStudent, updateStudnet 등

CRUD 하나하나 사용할때마다 JDBC 연결하는 4단계의

코드를 메소드마다 사용해야 SQL문을 사용할 수 있다!

 

코드를 재사용한다?

모듈화를 할 수 있다는 생각을 할 수 있다

 

JDBC 4단계를 모듈화하기위해 만드는 클래스가 있는데

JDBCUtil 클래스이다

 

기본적으로 객체를 만들기위해 사용하는 것이아니고

메소드를 사용하기 위해 만든 것이기 때문에

객체와 무관하다는 " static "을 사용한다

 

JDBCUtil클래스를 만들어 보도록 하자

public class JDBCUtil {

	static final String driverName ="oracle.jdbc.driver.OracleDriver";
	static final String url = "jdbc:oracle:thin:@localhost:1521:xe";
	static final String user = "kim";
	static final String passwd="1234";
    
    //DB 연결 메소드
	public static Connection connect() {
		Connection conn=null;
		try {
			Class.forName(driverName);
			// 원래 해주던 작업 ↑↓
			conn=DriverManager.getConnection(url, user,passwd);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        // conn를 output으로 DAO에서 바로 conn 변수에 담아 쓸수 있다 
		return conn;
	}
    
    
    // 닫아주기 메소드
	public static void disconnect(PreparedStatement pstmt,Connection conn) {
			try {
				// 닫아주기 ★
				pstmt.close();
				conn.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	}
	
}

메소드를 사용하기 위해 만든 것이기 때문에

객체와 무관하다는 " static "을 사용한다

 

해당 클래스를 이용하면 DAO에서 사용할때 간편해진다

 

 

 


 

 

public class StudentDAO {
	Connection conn;
	PreparedStatement pstmt;
}

이제부터 DB를 이용하여 DAO를 사용할때

Connection  conn;

PreparedStatement  pstmt;

객체화를 미리 해두도록 하자

 

public boolean insertStudent(StudentVO vo) {
		conn=JDBCUtil.connect();
		try {
			pstmt=conn.prepareStatement(sql_insert);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return false;
		} finally {
				JDBCUtil.disconnect(pstmt, conn);
			}
		return true;
		}

JDBCUtil을 만들고 이용함으로서

JDBC 4단계를 간편하게 사용할 수 있게 되었다

 

 

 

pstmt 사용법

final String sql_insert="INSERT INTO STUDENT VALUES((SELECT NVL (MAX(SID),0)+1 FROM STUDENT),?,?)";

pstmt=conn.prepareStatement(sql_insert);

String변수에 담아서 사용하고 내용은 SQL문을 사용하여 저장하는데

필요한 값을 ? 로 적어둔다

 

? 는 pstmt메소드를 사용하면서 대입할 예정

 

 

pstmt의 CRUD용 메소드 ***

pstmt.executeQuery(); // R selectOne(), selectAll()
pstmt.executeUpdate(); // CUD insert() update() delete()

executeQuery() 메소드는 R (출력) 에서만 사용한다

executeUpdate() 메소드는 C U D 나머지에서 사용한다

 

 

pstmt의 C UD 표현

** pstmt.executeUpdate 를 사용한다는 점

final String sql_insert="INSERT INTO STUDENT VALUES((SELECT NVL (MAX(SID),0)+1 FROM STUDENT),?,?)";

public boolean insertStudent(StudentVO vo) {
		// DB 연결 메소드
		conn=JDBCUtil.connect();
		try {
        		// DB와 연동하여 SQL을 사용할 준비
			pstmt=conn.prepareStatement(sql_insert);
			pstmt.setString(1, vo.getName()); // ? 와 값 대입
			pstmt.setInt(2, vo.getScore()); // ? 와 값 대입
            
            		// sql_insert를 사용한다 -> executeUpdate();
			pstmt.executeUpdate();
			System.out.println("	로그 : insertStudent() 완료");
		} catch (Exception e) {
				// TODO Auto-generated catch block
			e.printStackTrace();
            		// 무슨 오류로 인해 잘못되었을 경우이므로 false;
			return false;
		} finally { // try & catch문을 지나 무조건 사용되는 바디
        			// JDBDUtil의 pstmt, conn을 닫아주는 메소드
				JDBCUtil.disconnect(pstmt, conn);
			}
        	// 여기까지 도착한다면 알맞은 값들이 잘 들어감
		return true;
		}

여기서 개념을 확실히 알고 가야하는데 그럼 이해가 쉬워진다

 

public boolean insertStudent (StudentVO vo ) 메소드 해석

1. 기본적으로 insert, delete, update의 경우엔 boolean 리턴이다

2. input값으로 VO의 객체를 받아온다 (유지보수에 도움)

 

메소드 바디 해석

1. pstmt = conn.prepareStatement(sql_insert);

sql_insert (SQL) 은 아직 사용되지 않은 것이며

pstmt에 잠깐 담겨져 있는 것이다

 

2. pstmt.setString(1, vo.getName());

     pstmt.setInt(2, vo.getScore());

pstmt.setString (or Int) ( ?의 순서,  넣을값 )

? 에 값을 넣어주는 메소드들이며

VARCHAR 값은 setString으로

INT 값은 setInt로 대입해준다

 

3.  pstmt.executeUpdate();

( sql_insert )를 실행시켜주는 메소드

executeUpdate();의 리턴값은 int타입이다

실행시킨 횟수이며, 0이였을경우에는 실행이 안된것이므로

유효성검사를 이용할때 사용할 수 있다

 

 

이런식으로  insert 뿐만 아니라 Update, Delete 부분도 똑같이 표현할 수 있다

? ? 를 이용하여 SQL을 작성하고 해당 로직을 위 처럼 대입하면 된다!

 

 

 

 

 

pstmt 의 R 표현

** pstmt.executeQuery 를 사용한다는 점

final String sql_selectAll="SELECT * FROM STUDENT ORDER BY SCORE DESC";
final String sql_selectAll2="SELECT * FROM STUDENT WHERE NAME LIKE '%'||?||'%' ORDER BY SID ASC";

public ArrayList<StudentVO> selectAll(StudentVO vo) {
		if(vo.getName()!=null) { // 무언가 값이 들어왔다는 건, 검색으로서 사용
			ArrayList<StudentVO> datas=new ArrayList<StudentVO>();
			conn=JDBCUtil.connect();
			try {
				pstmt=conn.prepareStatement(sql_selectAll2);
				pstmt.setString(1, vo.getName());
				ResultSet rs = pstmt.executeQuery();
				while(rs.next()) {
					StudentVO data = new StudentVO();
					// 현직에서도 이런식으로 빈 데이터를 만들어서 넣어준다
					// 인풋값의 vo는 다시 활용될 수 있는 상황이 있기때문에
					// 오류를 불러올수도 있다!
					data.setName(rs.getString("NAME"));
					data.setSid(rs.getInt("SID"));
					data.setScore(rs.getInt("SCORE"));
					datas.add(data);
				}
				rs.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return datas;
		}// if문 종료
        
		// 이 아래는 input vo에 이름이 없을경우
        
		// 반환이 boolean 이 아니라 배열이라면? 미리 만들고 시작한다
		ArrayList<StudentVO> datas = new ArrayList<StudentVO>();
		conn = JDBCUtil.connect();
		try {
			pstmt=conn.prepareStatement(sql_selectAll);
			ResultSet rs = pstmt.executeQuery();
			
			while(rs.next()) {
				// 1. vo만든다
				// 2. vo에 setter
				// 3. vo를 datas에 add()
				StudentVO data = new StudentVO();
				data.setName(rs.getString("NAME"));
				data.setSid(rs.getInt("SID"));
				data.setScore(rs.getInt("SCORE"));
				datas.add(data);
			}
			rs.close();
		} catch(SQLException e) {
			e.printStackTrace();
		} finally {
			JDBCUtil.disconnect(pstmt, conn);
		}
		return datas;
	}

 

 

위 메소드 에는 두 가지의 행동을

한 메소드에 담아 둔 것입니다

 

if ( vo.getName() ! = null ){

1번 보내준 vo에 이름이 들어 있다면 검색으로 사용

} // else는 쓸필요가 없다

2번 보내준 vo에 이름이 없다면 모든 datas 출력으로 사용

 

이느낌으로 보면된다

 

 

 

1번 해석

  1. sql_selectAll2 의 sql문 의미
    인풋값의 검색한 이름이 들어간 모든 데이터베이스를 출력
    ASC (오름차순)



  2. pstmt=conn.prepareStatement(sql_selectAll2)
    sql_selectAll2 사용 준비!  ( ? 에 값을 넣어주세요 )

  3. pstmt.setString( 1, vo.getName() )
    sql_selectAll2 에 ? + 값 대입하는 메소드
  4. ResultSet rs = pstmt.executeQuery();
    ? 대입을 모두 완료했기때문에 해당 sql문 실행 후
     rs 라는 Set배열에 sql의 결과값들이 저장됨

  5. while ( rs.next() ) { // 다음값이 없을때 까지
    StudentVO data = new StudentVO()
    data.setName(rs.getString("NAME"))
    data.setSid(rs.getInt("SID"))
    data.setScore(rs.getInt("SCORE"))
    datas.add(data)

    rs에 담겨져있는 모든 정보를
    set으로 data객체에 넣어 datas에 저장


  6. datas 를 리턴!

 

2번 해석

  1. sql.selectAll 의 sql문 의미
    저장되어있는 모든 데이터베이스를 모두 출력
    DESC (내림차순)
  2. pstmt=conn.prepareStatement(sql_selectAll)
    sql_selectAll 사용 준비!  ( ? 에 값을 넣어주세요 )
  3. ResultSet rs = pstmt.executeQuery();
    ? 에 넣을값이 없으므로 sql문 실행 후
    rs 라는 Set배열에 sql의 결과값들이 저장됨
  4. while(rs.next() { // 다음값이 없을때 까지
    StudentVO data = new StudentVO()
    data.setName(rs.getString("NAME"))
    data.setSid(rs.getInt("SID"))
    data.setScore(rs.getInt("SCORE"))
    datas.add(data);

    rs에 담겨져있는 모든 정보를
    set으로 data객체에 넣어 datas에 저장


  5. datas를 리턴!

 

 

 

 

이렇게 pstmt를 이용하여 CRUD를 SQL으로 표현할 수 있게 되었다!

 

기억해야 할 부분

1. JDBC 4단계를 모듈화하기위해 만드는 클래스를 이용하여 사용하기

 

2. executeQuery() 메소드는 R (출력) 에서만 사용한다

     executeUpdate() 메소드는 C U D 나머지에서 사용한다

 

 

 

'오라클(Oracle)' 카테고리의 다른 글

(5) 오라클과 자바를 연동하는 법  (0) 2022.07.04
(4) SQL 기초 (조인 JOIN)  (0) 2022.07.04
(3) SQL기초 (페이징처리)  (0) 2022.07.04
(2) SQL기초 (HAVING, GROUP BY 절)  (0) 2022.07.04
(1) SQL 기초  (0) 2022.07.04