String name ="피카츄";int korean =50, english =60, math =70;
데이터는 Scanner 클래스 등을 이용하여 사용자에게 입력 받는 것도 가능하다.
Scanner sc =newScanner(System.in);System.out.print("이름 : "); String naem =sc.next();System.out.print("국어 : "); int korean =sc.nextInt();System.out.print("영어 : "); int english =sc.nextInt();System.out.print("수학 : "); int math =sc.nextInt();sc.close();
int no =1;String name ="라이츄";int korean =60, english =70, math =80;
Scanner를 이용하여 입력 받을 경우의 코드는 다음과 같다.
Scanner sc =newScanner(System.in);System.out.print("수정할 번호 : ");int no =sc.nextInt();System.out.print("수정할 이름 : ");String name =sc.next();System.out.print("수정할 국어점수 : ");int korean =sc.nextInt();System.out.print("수정할 영어점수 : ");int english =sc.nextInt();System.out.print("수정할 수학점수 : ");int math =sc.nextInt();sc.close();
준비한 데이터를 설정할 수 있도록 구문과 배열을 준비한다. 주의할 점은 구문에 작성된 홀더(?)와 동일한 순서로 배열의 데이터가 존재해야 한다는 것이다.
String sql ="UPDATE STUDENT SET NAME=?,KOREAN=?,ENGLISH=?,MATH=? WHERE NO=?";Object[] param = {name, korean, english, math, no};
구문과 데이터를 JdbcTemplate에게 전달하여 실행을 지시한다. 단, 조건에 따라 수정된 데이터가 없을 수도 있으므로 결과를 받아서 확인해야한다.
int result =jdbcTemplate.update(sql, param);
결과에 따라 성공/실패 여부를 사용자에게 출력한다.
if(result >0){System.out.println("정보 변경이 완료되었습니다");}else {System.out.println("해당하는 번호가 존재하지 않습니다");}
완성 코드
//데이터 준비Scanner sc =newScanner(System.in);System.out.print("수정할 번호 : ");int no =sc.nextInt();System.out.print("수정할 이름 : ");String name =sc.next();System.out.print("수정할 국어점수 : ");int korean =sc.nextInt();System.out.print("수정할 영어점수 : ");int english =sc.nextInt();System.out.print("수정할 수학점수 : ");int math =sc.nextInt();sc.close();//연결 도구 생성 DriverManagerDataSource dataSource =newDriverManagerDataSource();dataSource.setDriverClassName("oracle.jdbc.OracleDriver");dataSource.setUrl("jdbc:oracle:thin:@localhost:1521:xe");dataSource.setUsername("계정이름");dataSource.setPassword("비밀번호");//구문 실행 도구 생성JdbcTemplate jdbcTemplate =newJdbcTemplate(dataSource);//구문 및 데이터 배열 준비String sql ="UPDATE STUDENT SET NAME=?,KOREAN=?,ENGLISH=?,MATH=? WHERE NO=?";Object[] param = {name, korean, english, math, no};//실행int result =jdbcTemplate.update(sql, param); //결과에 따른 출력if(result >0){System.out.println("정보 변경이 완료되었습니다");}else {System.out.println("해당하는 번호가 존재하지 않습니다");}
Scanner sc =newScanner(System.in);System.out.print("삭제할 번호 : ");int no =sc.nextInt();sc.close();
데이터를 설정할 구문과 배열을 준비한다.
String sql="DELETE STUDENT WHERE NO = ?";Object[] param= {no};
JdbcTemplate에게 구문과 배열을 전달하며 실행을 명령한다. 실행 후 실제로 삭제된 개수를 알아야 사용자에게 성공과 실패를 알려줄 수 있으므로 반환값을 int 형태의 변수에 저장한다.
int result =jdbcTemplate.update(sql, param);
결과에 따라 사용자에게 성공/실패 여부를 출력한다.
if(result >0){System.out.println("삭제 완료");}else {System.out.println("올바르지 않은 번호");}
완성 코드
//데이터 준비Scanner sc =newScanner(System.in);System.out.print("삭제할 번호 : ");int no =sc.nextInt();sc.close();//연결 도구 생성 DriverManagerDataSource dataSource =newDriverManagerDataSource();dataSource.setDriverClassName("oracle.jdbc.OracleDriver");dataSource.setUrl("jdbc:oracle:thin:@localhost:1521:xe");dataSource.setUsername("계정이름");dataSource.setPassword("비밀번호");//구문 실행 도구 생성JdbcTemplate jdbcTemplate =newJdbcTemplate(dataSource);//구문 및 데이터 배열 준비String sql ="DELETE STUDENT WHERE NO = ?";Object[] param = {no};//실행int result =jdbcTemplate.update(sql, param); //결과에 따른 출력if(result >0){System.out.println("삭제 완료");}else {System.out.println("올바르지 않은 번호");}
조회(SELECT)
조회는 등록, 수정, 삭제와 구문의 목적과 명령이 다르다. 조회의 목적은 데이터베이스 테이블의 데이터를 프로그램으로 가져오는 것이다. 하지만 데이터베이스 테이블은 표 형태를 가지고 있고, 자바에서는 객체 형태로 표현해야 하기 때문에 변환이 필요하다. 예를 들어서 다음과 같은 테이블이 있을 경우 자바에서는 다섯 개의 객체가 있다고 본다.
데이터베이스 테이블
NO
NAME
KOREAN
ENGLISH
MATH
1
피카츄
73
79
78
2
라이츄
57
69
80
3
파이리
93
82
80
4
꼬부기
99
51
74
5
버터플
85
98
67
자바(객체 지향) 관점
1번 학생(no=1,name=피카츄,korean=73,english=79,math=78)
2번 학생(no=2,name=라이츄,korean=57,english=69,math=80)
3번 학생(no=3,name=파이리,korean=93,english=82,math=80)
4번 학생(no=4,name=꼬부기,korean=99,english=51,math=74)
5번 학생(no=5,name=버터플,korean=85,english=98,math=67)
따라서 데이터베이스를 객체로 변환하고 List에 저장하여 순서를 유지하도록 관리하는 것이 자바에서 의미 있는 데이터로 사용하는 방법이라고 볼 수 있다.
이를 위해서 데이터베이스의 한 줄을 저장하기 위한 클래스를 설계한다. 이를 DTO(Data Transfer Object)라 부른다.
StudentDto.java
publicclassStudentDto {privateint no;privateString name;privateint korean;privateint english;privateint math;//setter, getter, toString() 등을 추가로 생성}
그리고 조회 결과를 StudentDto에 어떻게 복사할 것인지 알려주기 위한 클래스가 필요하며 이를 RowMapper<T> 라고 부른다.