JUINTINATION

JDBC 프로그래밍 본문

자바프로그래밍및실습

JDBC 프로그래밍

DEOKJAE KWON 2023. 1. 8. 20:58
반응형

데이터베이스란?

  • 여러 응용 시스템들의 통합된 정보들을 저장하여 운영할 수 있는 공용 데이터들의 집합
  • 데이터의 저장, 검색, 갱신을 효율적으로 수행할 수 있도록 데이터를 고도로 조직화하여 저장

DBMS

  • 데이터베이스 관리 시스템(DataBase Management System)
  • 오라클(Oracle), 마이크로소프트의 SQL Server, MySQL, IBM의 DB2 등

데이터베이스 종류

  • 관계형 데이터베이스
    • 키(key)와 값(value)들의 관계를 테이블로 표현한 데이터베이스 모델
    • 키는 테이블의 열(column)이 되며 테이블의 각 행(row)은 하나의 레코드(record)를 표  현
    • 현재 사용되는 대부분의 데이터베이스는 관계형 데이터베이스
  • 객체 지향 데이터베이스
    • 객체 지향 프로그래밍에 쓰이는 것으로, 정보를 객체의 형태로 표현하는 데이터베이스 모델
    • 오브젝트 데이터베이스(object database)라고도 부른다.

SQLJDBC

  • SQL(Structured Query Language)
    • 관계형 데이터베이스 관리 시스템에서 사용
    • 데이터베이스 스키마 생성, 자료의 검색, 관리, 수정, 그리고 데이터베이스 객체 접근 관리를 위해 고안된 언어
    • 데이터베이스로부터 정보를 추출하거나 갱신하기 위한 표준 대화식 프로그래밍 언어
    • 다수의 데이터베이스 관련 프로그램들이 SQL을 표준으로 채택
  • JDBC (Java DataBase Connectivity)
    • 관계형 데이터베이스에 저장된 데이터를 접근 및 조작할 수 있게  하는 API
    • 다양한 DBMS에 대해 일관된 API로 데이터베이스 연결, 검색, 수정, 관리 등을 할 수 있게 함

JDBC 구조

  • JDBC 드라이버 매니저
    • 자바 API에서 지원하며 DBMS를 접근할 수 있는 JDBC 드라이버 로드
  • JDBC 드라이버
    • DBMS마다 고유한 JDBC 드라이버 제공, JDBC 드라이버와 DBMS는 전용 프로토콜로 데이터베이스 처리
  • DBMS
    • 데이터베이스 관리 시스템. 데이터베이스 생성·삭제, 데이터 생성·검색·삭제 등 전담 소프트웨어 시스템

MySQL 명령어

  • 레코드 추가
    • insert into usertable (Name, ClassNumber, NickName, ID, Pwd) values ('권덕재', 'B989003', '닉네임', 'juintin', '1234');
      • insert into 다음에 테이블 이름 지정
      • 테이블 이름 다음 괄호 안에 열 이름을 ‘,’로 구분하여 나열
      • values 다음 괄호 안에 열의 값들을 ‘,’로 구분하여 나열
      • 문자 타입의 데이터는 단일 인용 부호로 묶어서 표시함에 유의
  • 데이터 검색
    • search ID from usertable where Name='권덕재';
      • select 다음에는 데이터를 추출할 열 이름을 ‘,’로 분리하여 나열
      • 모든 열에 대해 데이터를 추출할 때는 *를 열 이름 대신 사용
      • from 다음에 테이블 이름을 지정
      • where 다음에 검색 조건 지정.
      • 위의 예에서 Name 값이 ‘권덕재’인 레코드 검색
      • where는 생략 가능
  • 데이터 수정
    • update usertable set NickName='닉네임변경' where Name='권덕재';
      • update 다음에는 테이블 이름 지정
      • set 다음에 수정할 열의 이름과 값을 ‘,’로 분리하여 나열
      • where 다음에는 검색 조건을 지정.
      • 위의 예에서는 Name 값이 ‘권덕재’인 레코드의 데이터 수정
      • where는 생략 가능
  • 레코드 삭제
    • delete from usertable where Name='권덕재';
      • delete from 다음에는 테이블 이름 지정
      • where 다음에는 검색 조건을 지정. 
      • 위의 예에서는 Name 값이 ‘권덕재’  인 레코드 삭제
      • where는 생략 가능

JDBC 프로그래밍

MySQL 서버의 JDBC 드라이버 로드

try {
    Class.forName("com.mysql.cj.jdbc.Driver");
    System.out.println("JDBC 드라이버 로드 성공");
} catch (ClassNotFoundException e) {
    System.out.println("JDBC 드라이버 로드 에러");
}
  • Class.forName()은 동적으로 자바 클래스 로딩
  • MySQL의 JDBC 드라이버 클래스인 com.mysql.cj.jdbc.Driver 로드
  • 드라이버의 클래스 이름은 DB의 드라이버마다 다를 수 있으므로 JDBC 드라이버 문서 참조할 것
  • 자동으로 드라이버 인스턴스를 생성하여 DriverManager에 등록
  • 해당 드라이버가 없으면 ClassNotFoundException 발생

자바 응용프로그램과 JDBC 연결

try {
    Class.forName("com.mysql.cj.jdbc.Driver");
    Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/usersDB", "id", "pwd");
    System.out.println("DB 연결 성공");
    Statement stmt = conn.createStatement(); // SQL문 처리용 Statement 객체 생성
    ResultSet srs = stmt.executeQuery("select * from usertable;");
} catch (ClassNotFoundException e) {
    System.out.println("JDBC 드라이버 로드 에러");
} catch (SQLException e) {
    System.out.println("DB 연결 에러");
}
  • DriverManager는 자바 어플리케이션을 JDBC 드라이버에 연결시켜주는 클래스로서 getConnection() 메소드로 DB에 연결하여 Connection  객체 반환
  • getConnection에서 jdbc: 이후에 지정되는 URL의 형식은 DB에 따라  다르므로 JDBC 문서를 참조
    • MySQL 서버가 같은 컴퓨터에서 동작하므로 서버 주소를 localhost로 지정
    • MySQL의 경우 디폴트로 3306 포트를 사용
    • usersDB는 사용할 DB의 이름
  • "id"는 DB에 로그인할 계정 이름이며, "pwd"는 계정 패스워드

데이터베이스 사용

  • Stetement 클래스
    • SQL문을 실행하기 위해서는 Statement 클래스를 이용
    • 데이터 검색을 위해 executeQuery() 메소드 사용
    • 추가, 수정, 삭제와 같은 데이터 변경은 executeUpdate() 메소드 사용

  • ResultSet 클래스
  • SQL문 실행 결과를 얻어오기 위해서는 ResultSet 클래스를 이용
  • 커서의 초기 값은 첫 번째 행 이전을 가리킴
  • 현재 데이터의 행(레코드 위치)을 가리키는 커서(cursor)를 관리

테이블의 모든 데이터 검색

Statement stmt = conn.createStatement();
ResultSet srs = stmt.executeQuery("select * from usertable;");
  • Statement의 executeQuery()는 SQL문의 실행하여 실행 결과를 넘겨줌
  • 위의 SQL문의 student 테이블에서 모든 행의 모든 열을 읽어 결과를 rs에 저장

특정 열만 검색

ResultSet srs = stmt.executeQuery("select Name, ID from usertable;");
  • 특정 열만 읽을 경우는 select문을 이용하여 특정 열의 이름 지정

조건 검색

ResultSet srs = stmt.executeQuery("select Name, ID from usertable" where Name='권덕재';);
  • select문에서 where절을 이용하여 조건에 맞는 데이터 검색

레코드 추가

stmt.executeUpdate("insert into usertable (Name, ClassNumber, NickName, ID, Pwd) values ('권덕재', 'B989003', '닉네임', 'juintin', '1234');");
  • DB에 변경을 가하는 조작은 executeUpdate() 메소드 사용
  • SQL문 수행으로 영향을 받은 행의 개수 반환

레코드 수정

stmt.executeUpdate("update usertable set NickName='닉네임변경' where Name='권덕재';");

레코드 삭제

stmt.executeUpdate("delete from usertable where Name='권덕재';");

내 생각

수업 시간에 DB에 대해 배우면서 채팅 프로그램을 만들어야 하는 기말 프로젝트 과제에서 회원 정보를 어떻게 저장해야 할지 생각하게 되었습니다. 그 전에는 임시로 HashMap을 만들어서 로그인 관련 테스트를 진행했지만 서버가 실행될 때마다 초기화되는 문제가 있었습니다. 물론 외부에 있는 서버에 접속하는 방법에 대해서는 따로 공부를 해야 하지만 적어도 같은 wifi를 사용한다면 위의 내용을 활용하면 제 노트북 서버에 저장되어있는 회원 정보는 초기화되지 않습니다. 프로젝트가 끝나도 추후에 외부 서버에 접속하는 방법을 공부해서 제대로 동작하는 웹 애플리케이션을 만들고 싶다는 생각을 하게 되었습니다.

728x90

'자바프로그래밍및실습' 카테고리의 다른 글

소켓 프로그래밍  (0) 2023.01.06
스레드와 멀티태스킹  (0) 2023.01.03
제네릭과 컬렉션  (0) 2022.12.22
Comments