[Database] JDBC를 이용해 Java와 MySQL 연동하기
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 파일을 넣어준다.
연동 과정
크게 네 단계로 나누어 볼 수 있다.
- Connection 객체를 이용해 DB와 연결한다.
- Statement 객체를 생성한다.
- Statement 객체를 이용해 query를 DB 서버로 보내고 결과를 가져온다(fetch).
- 프로그램과 연결된 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해야함
- 각각 딱 한번씩만 호출됨