코딩 노트
데이터베이스5 - JDBC 본문
SQL (Structure 구조화된 / Query 질의 / Language 언어)
JDBC(Java DataBase Connectivity)
- 자바를 이용해서 데이터베이스 작업을 하는 것
- 데이터베이스 구문을 프로그램에 작성하여 처리하도록 중계
(Q) 포켓몬스터 테이블에 데이터를 등록하는 작업
- DB가 어떤 건지... 계정은 뭔지... 비밀번호는 뭔지... 정보가 없다.
그러므로 통신을 내가 구현할 것이 아니라면 도구를 찾아야 한다.
Crate 작업
//[1] 구문을 세미콜론 제외하고 준비
String sql = "insert into pocketmon(no, name, type) values(43, '뚜벅초', '풀')";
//[2] 연결 도구 생성 및 연결에 필요한 정보를 설정
DriverManagerDataSource dataSoruce = new DriverManagerDataSource();
dataSoruce.setUsername("C##KH");
dataSoruce.setPassword("KH");
dataSoruce.setDriverClassName("oracle.jdbc.OracleDriver"); //DB 종류를 알려주는 구문
dataSoruce.setUrl("jdbc:oracle:thin:@localhost:1521:xe");//주소
//[3] 구문 전송 도구 생성 및 전송
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSoruce); //필요한 도구 넣어주기
jdbcTemplate.update(sql);
System.out.println("임무완료");
//구문 준비, 연결 도구 준비, 명령 실행하는 구문
▶ 변수로 치고 있는 데이터를 기반으로 명령을 생성하여 전송하는 방법
int no = 50;
String name = "테스트";
//String name = "테'스'트";
//String name = "'||(select name from pocketmon where no=43)||'";
String type = "무속성";
정적 SQL 구문 방식
- 구문을 개발자가 직접 완성하는 방식이다. (사전에 완성해서 전송하는 방식)
- 구문을 만들기가 매우 까다롭다.
- 등록이 불가능한 글자가 있다.
- SQL Injection 공격의 대상이 된다.
String sql = "insert into pocketmon(no, name, type) "
+ "values(" + no + ", '" + name + "', '" +type+"')";
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("oracle.jdbc.OracleDriver"); //DB종류
dataSource.setUrl("jdbc:oracle:thin:@localhost:1521:xe"); //DB위치+연결방식
dataSource.setUsername("C##KH");
dataSource.setPassword("KH");
JdbcTemplate jdbcTemple = new JdbcTemplate(dataSource);
jdbcTemple.update(sql);
System.out.println("임무완료!");
동적 SQL 구문 방식
- 구문과 값을 분리해서 처리한 뒤 합성하는 방식이다.
- 데이터 자리를 홀더(?)로 표기한다.
- 구문과 합쳐져야 하는 데이터를 따로 준비해야 한다.
- 자료형에 맞게 알아서 변환되어 처리된다.(ex: 따옴표 등)
String sql = "insert into pocketmon(no, name, type) values(?, ?, ?)"; //데이터 3개 넣을 거야!
//Object[] data = new Object[] { no, name, type };
Object[] data = {no, name, type}; //배열의 약식 표현(From C언어)
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("oracle.jdbc.OracleDriver"); //DB종류
dataSource.setUrl("jdbc:oracle:thin:@localhost:1521:xe"); //DB위치+연결방식
dataSource.setUsername("C##KH");
dataSource.setPassword("KH");
JdbcTemplate jdbcTemple = new JdbcTemplate(dataSource);
jdbcTemple.update(sql, data);
System.out.println("임무완료!");
(Q1) 계좌 개설 프로그램 - 동적 SQL 구문 실습
//게좌 개설 프로그램
//= 계좌를 개설한다는 것은 Account 테이블에 데이터를 Insert하는 것이다.
Scanner sc = new Scanner(System.in);
//데이터 준비
System.out.print("예금주: ");
String accountOwner = sc.next();
System.out.print("예금기간(년): ");
int accountPeriod = sc.nextInt();
//int accountCount = accountPeriod * 12 + 1;
int accountCount = 0;
System.out.print("1회 예금액: ");
int accountPayment = sc.nextInt();
int accountBalance = 0;
sc.close();
//DB처리
String sql =
"insert into account(account_owner, account_period, account_count, account_payment, account_balance) "
+ "values(?, ?, ?, ?, ?)";
Object[] data = {accountOwner, accountPeriod, accountCount, accountPayment, accountBalance};
//달라지지 않는 구문
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("oracle.jdbc.OracleDriver");
dataSource.setUrl("jdbc:oracle:thin:@localhost:1521:xe");
dataSource.setUsername("C##KH");
dataSource.setPassword("KH");
JdbcTemplate jdbcTemple = new JdbcTemplate(dataSource);
jdbcTemple.update(sql, data);
System.out.println("계좌가 개설되었습니다.");
(Q2) 신규 도서 등록 프로그램(시퀀스가 있는)
//신규 도서 등록 프로그램(ex: 도서관, 책방, ...)
//데이터 - book id는 준비하지 않는다(시퀀스 활용)
System.out.print("책 제목: ");
String bookTitle = sc.next();
System.out.print("책 저자: ");
String bookAuthor = sc.next();
System.out.print("출판일: ");
String bookPublicationDate = sc.next();
System.out.print("책 판매가: ");
double bookPrice = sc.nextDouble();
System.out.print("책 출판사: ");
String bookPublisher = sc.next();
System.out.print("책 페이지 수: ");
int bookPageCount = sc.nextInt();
System.out.print("책 장르: ");
String bookGenre = sc.next();
sc.close();
String sql =
"insert into book(book_id, book_title, book_author, book_publication_date, book_price,"
+ "book_publisher, book_page_count, book_genre) values(book_seq.nextval, ?, ?, ?, ?, ?, ?, ?)";
Object[] data = {bookTitle, bookAuthor, bookPublicationDate, bookPrice, bookPublisher,
bookPageCount, bookGenre};
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("oracle.jdbc.OracleDriver");
dataSource.setUrl("jdbc:oracle:thin:@localhost:1521:xe");
dataSource.setUsername("C##KH");
dataSource.setPassword("KH");
JdbcTemplate jdbcTemple = new JdbcTemplate(dataSource);
jdbcTemple.update(sql,data);
System.out.println("책 정보가 저장되었습니다.");
(Q3) 신규 회원 가입 프로그램 예제
//회원 가입 프로그램
//데이터 - 6개(아이디, 비밀번호, 닉네임, 생년월일, 이메일, 연락처)
//(TIP) 오라클에 추가하는 문자열이든 null이든 ""이든 모두 null로 추가됨.
Scanner sc = new Scanner(System.in);
System.out.print("아이디: ");
String memberId = sc.next();
System.out.print("비밀번호: ");
String memberPw = sc.next();
System.out.print("닉네임: ");
String memberNickname = sc.next();
System.out.print("생년월일: ");
String memberBirth = sc.next();
System.out.print("이메일: ");
String memberEmail = sc.next();
System.out.print("전화번호: ");
String memberContact = sc.next();
sc.close();
// String sql = "insert into member(member_id, member_pw, member_nickname, member_birth,"
// + "member_email, member_contact, member_level, member_point, member_join) "
// + "values(?, ?, ?, ?, ?, ?, '일반', 0, sysdate)";
String sql = "insert into member(member_id, member_pw, member_nickname, member_birth,"
+ "member_email, member_contact, member_level, member_point, member_join) "
+ "values(?, ?, ?, ?, ?, ?)";
Object[] data = {memberId, memberPw, memberNickname, memberBirth, memberEmail,
memberContact};
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("oracle.jdbc.OracleDriver");
dataSource.setUrl("jdbc:oracle:thin:@localhost:1521:xe");
dataSource.setUsername("C##KH");
dataSource.setPassword("KH");
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.update(sql, data);
System.out.println("회원이 생성되었습니다.");
DB에서 문제가 있는 경우 드래그 한 위치의 코드처럼 뜬다.
// 포켓몬스터 정보 수정(update)
//= 포켓몬스터 항목은 총 3가지(no, name, type)
//= 개별 항목만 변경할 수도 있고 다 바꿀 수도 있다.
//= 반드시 한 개의 항목은 바꾸지 말아야 하며 일반적으로 PK가 불변
//데이터 준비
int no = 1;
String name = "바꾼 이름";
String type = "테스트";
//생성될 구문은 다음과 같다.
//set은 변화가 가능하나 where은 바뀌지 않는다.
//데이터 베이스에서 다 수정하는 경우는 없다.
//set이랑 where 사이에 콤마를 쓰지 않도록 주의해야 한다.
String sql = "update pocketmon set name=?, type=? where no=?"; //수정의 가장 기본적인 구문
Object[] data = {name, type, no};
//실행 명령도 Insert와 동일하다.
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("oracle.jdbc.OracleDriver");
dataSource.setUrl("jdbc:oracle:thin:@localhost:1521:xe");
dataSource.setUsername("C##KH");
dataSource.setPassword("KH");
JdbcTemplate jdbcTemple = new JdbcTemplate(dataSource);
jdbcTemple.update(sql, data);
//진짜 완료가 되었는지 아닌지 알 수 없다.(바뀐 대상이 있는지...)
//- update는 실행이 되었다고 반드시 바뀌었다고 볼 수 없다.
//- 실제로 적용된 행의 개수를 알아내야 한다.
//- update의 결과를 저장하여 확인 후 판정한다.
int result = jdbcTemple.update(sql, data);
System.out.println("result = " + result);
if(result > 0) {
System.out.println("임무 완료");
} else {
System.out.println("없는 번호");
}
자바는 자동 commit 모드를 사용한다.
(Q)과제1 - 도서 정보 수정 프로그램
//데이터
int no = 41;
System.out.print("수정할 책 제목 입력: ");
String title = sc.nextLine();
System.out.print("수정할 책 가격 입력: ");
double price = sc.nextDouble();
//DB처리 "update book set 변경내용 where 조건";
//자바는 자동 commit 모드를 사용한다.
String sql = "update book set BOOK_TITLE=?, BOOK_PRICE=? where BOOK_ID=?";
Object[] data = {title, price, no};
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("oracle.jdbc.OracleDriver");
dataSource.setUrl("jdbc:oracle:thin:@localhost:1521:xe");
dataSource.setUsername("C##KH");
dataSource.setPassword("KH");
JdbcTemplate jdbcTemple = new JdbcTemplate(dataSource);
jdbcTemple.update(sql, data);
int result = jdbcTemple.update(sql,data);
if(result > 0) {
System.out.println("성공");
} else {
System.out.println("실패");
(Q)과제2 - 게시글 정보 수정 프로그램
//데이터
int boardNo = 1;
System.out.print("게시글 제목 수정: ");
String boardTitle = sc.next();
System.out.print("게시글 내용 수정: ");
String boardCotent = sc.next();
sc.close();
//DB처리 "update board set 변경내용 where board_no=?
String sql = "update board set board_title=?, board_content=? "
+ "where board_no=?";
Object[] data = {boardTitle, boardCotent, boardNo};
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("oracle.jdbc.OracleDriver");
dataSource.setUrl("jdbc:oracle:thin:@localhost:1521:xe");
dataSource.setUsername("C##KH");
dataSource.setPassword("KH");
JdbcTemplate jdbcTemple = new JdbcTemplate(dataSource);
jdbcTemple.update(sql, data);
int result = jdbcTemple.update(sql,data);
if(result > 0) {
System.out.println("게시글 수정 완료");
} else {
System.out.println("게시글 수정 실패");
}
'Database' 카테고리의 다른 글
데이터베이스 조회 최종 형태1(member) (0) | 2023.07.24 |
---|---|
데이터베이스6 - 모듈화 (0) | 2023.07.24 |
데이터베이스4 - Top N Query (0) | 2023.07.20 |
데이터베이스3 - CRUD (0) | 2023.07.20 |
데이터베이스2 - 테이블 제약 조건, 시퀀스 (0) | 2023.07.19 |