코딩 노트

데이터베이스5 - JDBC 본문

Database

데이터베이스5 - JDBC

newbyeol 2023. 7. 21. 11:09

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("게시글 수정 실패");

}