Statement 만들기

Connection으로 연결이 됐다면 statement 클래스를 사용할 수 있게 된다.
그리고 이 statement에서 execute 메서드를 사용하여 쿼리를 보내고 그 결과를 ResultSet을 통해 받아올 수 있다.

package prac;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

public class DAO {

	public boolean createTable() throws SQLException {
		boolean flag = false;
		
		String sql = "create table toys (";
				sql+= "No int primary key not null, ";
				sql+= "name varchar(20) not null, ";
				sql+= "manufacturing varchar(20) not null, ";
				sql+= "price int not null ";
				sql+= ")";
				
		Connection con = ConnectionManager.getConnection();
		Statement stmt = con.createStatement();
		int affectedCount = stmt.executeUpdate(sql);
		
		System.out.println("쿼리의 반환값은 :"+affectedCount);
		
		if(affectedCount == 0) {
			flag = true;
		}
		
		return flag;
	}
}
  • connection을 생성한다
  • 여기서 Statement 객체를 통해 쿼리를 실행하고 그 결과를 반환받는다
  • executeUpdate(sql)
    매개변수는 쿼리다
    위 코드에서는 긴 쿼리를 미리 변수로 작성해두었다
    반환값으로 int 타입 value를 반환한다
    반영된 레코드의 개수를 반환하는 것이다
    (단, CREATE, DROP 또는 ALTER 구문에서는 '0'을 반환한다)

과정을 살펴보면...

  1. ConnectionManager 클래스의 getConnection() 실행
  2. createStatement 메서드로 쿼리 실행 객체 생성
  3. 쿼리 실행 객체의 executeUpdate() 메서드를 사용하여 쿼리 전송 및 결과셋 수신

이 과정은 Logic이 아닌 고정된 절차다.
Statementexecute메서드의 종류는 용도에 따라 달라질 수 있지만 큰 틀은 동일하다.

이렇게 작성한 기능을 main에서 실행해본다.

package prac;

import java.sql.SQLException;

public class JdbcMain {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		DAO dao = new DAO();
		
		try {
			dao.createTable();
			System.out.println("테이블 생성에 성공했습니다");
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			System.out.println("테이블 생성에 실패했습니다");
			e.printStackTrace();
		}//try-catch
		
	}//main
    
}

DAO 클래스에서 getTable 메서드를 정의할 때 보류해둔 예외처리를 여기 main에서 실행했다.

JdbcMain의 메서드로 정의하여 예외처리를 먼저 수행하고, main에서 한 줄로 실행해주는 것이 훨씬 깔끔하다.

조금만 변경해보면...

package prac;

import java.sql.SQLException;

public class JdbcMain {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		JdbcMain main = new JdbcMain();
		main.getTable();
	}//main

	
	
	public void getTable() {
		DAO dao = new DAO();
		try {
			dao.createTable();
			System.out.println("테이블 생성에 성공했습니다");
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			System.out.println("테이블 생성에 실패했습니다");
			e.printStackTrace();
		}
	}// getTable()
}
>> 실행 결과
Connected...
쿼리의 반환값은 :0
테이블 생성에 성공했습니다

MariaDB [jdbc]> show tables;
+----------------+
| Tables_in_jdbc |
+----------------+
| toys           |
+----------------+
1 row in set (0.002 sec)

코드는 조금 길어졌다...만
이후 BusinessLogic 클래스의 많은 메서드들을 처리한다고 했을 때, main 클래스 안은 깔끔하게 가져가는 것이 맞는 것 같다.


execute... 메서드

아래는 statement 에 사용할 수 있는 메소드들이다

  • .executeUpdate([query])
    수행 결과로 int 타입을 반환한다: 반영된 레코드 수를 반환하는 것이다
    INSERT / DELETE / UPDATE // CREATE / DROP 에 사용한다
    ( 단, CREATE / ALTER / DROP에 대해서는 ‘0’을 반환한다 )
    SELECT 구문에서는 사용하지 않는다

  • .executeQuery([query])
    수행 결과로 ResultSet 객체를 반환한다
    주로 조회문에 사용된다(SELECT, SHOW)
    • 저장된 값을 레코드 단위(한 행)로 불러올 수 있다
    • 이 때, get자료타입() 메소드로 불러온 레코드(행)의 칼럼값에 접근할 수 있다
    ResultSet rs = pstmt.executeQuery();
    rs.getInt(1)
    rs.getString(2)

이런 식으로 받아온다

  • .execute([query])
    수행 결과로 Boolean 타입의 값을 반환한다
    모든 구문에 대해 수행할 수 있다
    리턴값이 ResultSet일 경우에는 true , 그렇지 않다면 false 로 출력된다

0개의 댓글