Database

[Database] JDBC를 이용해 Java와 MySQL 연동하기

Sue 2022. 2. 23. 22:31

API (Application Programming Interface) 활용

1. 역할

  • 프로그램과 데이터베이스 서버를 연결하기 위해 사용된다.
  • SQL 명령문을 데이터베이스 서버에 전송한다.
  • 결과 튜플을 하나씩 프로그램 변수로 가져온다.

 

2. 종류

  • ODBC (Open Database Connectivity) : C, C++, C#, Visual Basic과 DB를 연동할 때 사용한다.
  • JDBC (Java Database Connectivity) : Java와 연동할 때 사용한다.

※ Oracle, MySQL 등 DBMS 종류에 따라 제공되는 API가 다르다.

 

연동을 위한 환경 설정

1. SQL문을 MySQL에서 수행하여 테이블을 생성한다.

script.txt

더보기

drop database mydb;
create database mydb;
use mydb;

create table instructor (
    ID              char(5),
    name            varchar(20) not null,
    dept_name       varchar(20),     
    salary          numeric(8,2),
    primary key (ID));
    
    
create table teaches (
    ID               varchar(5),
    course_id        varchar(8),
    sec_id           varchar(8),
    semester         varchar(6),
    year             numeric(4,0),
    primary key  (ID, course_id, sec_id, semester, year));
    
    
insert into instructor values ('10101', 'Srinivasan', 'Comp. Sci.', 65000);
insert into instructor values ('12121', 'Wu',         'Finance',    90000);
insert into instructor values ('15151', 'Mozart',     'Music',      40000);
insert into instructor values ('22222', 'Einstein',   'Physics',    95000);
insert into instructor values ('32343', 'El Said',    'History',    60000);
insert into instructor values ('33456', 'Gold',       'Physics',    87000);
insert into instructor values ('45565', 'Katz',       'Comp. Sci.', 75000);
insert into instructor values ('58583', 'Califieri',  'History',    62000);
insert into instructor values ('76543', 'Singh',      'Finance',    80000);
insert into instructor values ('76766', 'Crick',      'Biology',    72000);
insert into instructor values ('83821', 'Brandt',     'Comp. Sci.', 80000);    
insert into instructor values ('98345', 'Kim',        'Elec. Eng.', 80000);

insert into teaches values ('10101', 'CS-101',  1, 'Fall',   2009);
insert into teaches values ('10101', 'CS-315',  1, 'Spring', 2010);
insert into teaches values ('10101', 'CS-347',  1, 'Fall',   2009);
insert into teaches values ('12121', 'FIN-201', 1, 'Spring', 2010);
insert into teaches values ('15151', 'MU-199',  1, 'Spring', 2010);
insert into teaches values ('22222', 'PHY-101', 1, 'Fall',   2009);
insert into teaches values ('32343', 'HIS-351', 1, 'Spring', 2010);
insert into teaches values ('45565', 'CS-101',  1, 'Spring', 2010);
insert into teaches values ('45565', 'CS-319',  1, 'Spring', 2010);
insert into teaches values ('76766', 'BIO-101', 1, 'Summer', 2009);
insert into teaches values ('76766', 'BIO-301', 1, 'Summer', 2010);
insert into teaches values ('83821', 'CS-190',  1, 'Spring', 2009);
insert into teaches values ('83821', 'CS-190',  2, 'Spring', 2009);
insert into teaches values ('83821', 'CS-319',  2, 'Spring', 2010);
insert into teaches values ('98345', 'EE-181',  1, 'Spring', 2009);

 

2. MySQL 홈페이지에서 JDBC를 다운로드 받는다. 

 

MySQL :: Download Connector/J

MySQL Connector/J 8.0 is highly recommended for use with MySQL Server 8.0, 5.7 and 5.6. Please upgrade to MySQL Connector/J 8.0.

dev.mysql.com

 

Operating System을 Platform Indpendent로 설정한 후 zip 파일을 download 한다.

 

zip 파일 안에 있는 jar파일이 MySQL에서 제공되는 JDBC이다.

 

3. 다운받은 jar 파일을 Java Project 하위에 라이브러리로 넣어준다.

  • Project 우클릭 → Build Path → Add Library 하면 위와 같은 화면이 뜬다.
  • User Library 선택 후 next 클릭

 

  • New 버튼을 클릭해 사용할 라이브러리의 이름을 입력한다.
  • JDBC를 추가해줄 것이기 때문에 라이브러리의 이름은 JDBC로 입력

 

  • 생성한 라이브러리 클릭 후 Add External JARs를 클릭해 다운받은 jar 파일을 넣어준다.

 

연동 과정

크게 네 단계로 나누어 볼 수 있다.

  1. Connection 객체를 이용해 DB와 연결한다.
  2. Statement 객체를 생성한다.
  3. Statement 객체를 이용해 query를 DB 서버로 보내고 결과를 가져온다(fetch).
  4. 프로그램과 연결된 Statement 객체와 Connection 객체를 연결 해제한다. (close)

 

1) Connection 객체를 이용해 DB와 연결

try{

    //Register JDBC driver
    Class.forName("com.mysql.jdbc.Driver");

    //Open a connection
    System.out.println("Connecting to database...");
    conn = DriverManager.getConnection("jdbc:mysql://localhost/mydb?serverTimezone=UTC", "root", "root");

...
}
  • Class.forName()을 이용해서 MySQL의 JDBC Driver Class를 로딩하면 객체가 생성되고 DriverManager에 등록됨
  • Driver 클래스를 찾지 못할 경우 ClassNotFoundException 예외가 발생할 수 있다.
  • DriverManager 클래스의 getConnection() 메서드를 이용해 connection을 open한다.
  • 첫번째 매개변수 : IP Address 또는 DB 서버의 도메인 이름
  • 프로그램과 DB 서버가 한 컴퓨터에서 돌아가는 경우 도메인 이름은 "localhost"
  • 도메인 이름 뒤에는 MySQL에 생성한 DB의 이름을 적어주고 '?'뒤에 옵션을 추가해준다.
  • 두번째 매개변수 : MySQL 접속시 사용하는 UserID
  • 세번째 매개변 : MySQL 접속시 사용하는 Password

 

2) Statement 객체 생성 후 SQL문장을 DBMS로 전송

stmt = conn.createStatement();
rs = stmt.executeQuery("SELECT * FROM instructor");

// 또는

stmt = conn.createStatement();
rs = stmt.executeUpdate("DELETE FROM instructor");
  • Statement 객체를 생성하여 프로그램에서 SQL 문장을 DBMS로 전달하도록 한다.
  • Connection 객체인 conn의 createStatement() 메서드를 이용하여 Statmement의 객체를 생성한다.
  • Statement 객체의 메서드 executeQuery()와 executeUpdate() 메서드를 이용해서 SQL문을 전달한다.
  • SQLException 예외에 대한 예외처리를 해줘야 한다.
  • executeQuery() : select문을 수행한 조회 수행시 사용한다.                                                                                                  → 결과를 객체에 저장 (ResultSet 객체에 저장)
  • executeUpdate() : update, insert, delete, crreate table, drop table 등 테이블 변경이 발생할 시 사용한다.                                    → DB 안에서 데이터가 변경되는 것이므로 따로 결과 저장 x

 

3) 결과 가져오기

while(rs.next()) {
    System.out.println(rs.getString("dept_name") + "|" + rs.getString(2) + "|" + rs.getString(3) + "|" + rs.getDouble("salary"));

}
  • SQL문의 결과는 ResultSet 객체에 relation으로 저장됨. 그 안에는 여러개의 튜플이 존재할 수 있다.
  • while(rs.next()) : 커서를 한 튜플씩 이동한다.
  • 마지막 튜플에서 rs.next()를 호출하면 false를 반환하여 while문을 빠져나온다.
  • DB의 각 속성이 가지는 자료형에 따라 getString(), getDouble() 등 호출한다.
  • 매개변수로 문자열로 입력하면 문자열과 일치하는 릴레이션 속성에 해당하는 값을 출력한다.
  • ex) rs.getString("dept_name") → 속성의 이름이 dept_name인 컬럼 출력
  • 숫자를 입력하면 테이블 정의할 때 입력된 속성의 순서에 해당하는 속성의 값을 출력한다.
  • ex) rs.getString(2) → 두번째로 정의된 속성의 값 출력(name)

 

4) Connection 닫기 (close)

stmt.close();
conn.close();
  • statement를 먼저 close 하고나서 connection을 close해야함
  • 각각 딱 한번씩만 호출됨