Java DataBase Connectivity의 약자로 JDBC는 자바 언어로 데이터베이스 프로그래밍을 하기 위한 라이브러리이다.
JDBC는 DBMS에 종속되지 않는 관련 API를 제공한다. JDBC API는 JDK에서 제공하며 JDBC 프로그래밍을 위해서는 JDBC드라이버가 필요하다.
JDBC 드라이버는 각 DBMS 회사에서 제공하는 라이브러리 압축파일이다. MySQL을 사용할 경우, MySQL 데이터베이스 관리 시스템(DBMS)을 사용하지만 오라클을 사용한다면 오라클용 JDBC 드라이버가 필요하다.
JDBC는 다양한 클래스와 인터페이스로 구성된 패키지 java.sql과 javax.sql로 구성되어 있다.
전체적인 구조는 다음 그림과 같다.
Class.forName("com.mysql.jdbc.Driver");
Class.forName() 메서드를 호출하여, mysql에서 제공하는 Driver 클래스를 JVM method area에 로딩시킨다.
String jdbc_url = "jdbc:mysql://localhost:3306/database?serverTimezone=UTC";
Connection con = DriverManager.getConnection(URL, "user', "password");
이제 Connection 객체를 만들어 사용하게 되는데, 방법은 DriverManager 클래스의 static 메서드인 getConnection() 메서드를 호출해서 mysql에 연결하기 위한 커넥션 정보(url, user, password)를 입력한다.
getConnection() 메서드의 수행 결과로 Connection 객체를 반환하는데, 이 객체를 통해 쿼리를 날리는 statement를 작성할 수 있다.
SELECT 쿼리에서는 createStatement(), INSERT에서는 preparedStatement()를 호출한다.
Statement stmt = con.createStatement();
String sql = "select * from student";
ResultSet rs = stmt.executeQuery(sql);
select 문장은 테이블 형태의 결과를 반환한다. 그러므로 select 문장을 실행하기 위해 Statement의 메소드 executeQuery()를 사용한다. 메소드 executeQuery()는 질의 결과로 테이블 형태의 결과를 반환하는데, 이 반환형이 인터페이스 ResultSet이다.
while(result.next()){
String name = result.getString(1);
String owner = result.getString(2);
String date = result.getString(3);
}
ResultSet 인터페이스에는 질의 결과의 현재 행(row)을 가리키는 커서(cursor)라는 개념이 있으며, 이 커서를 다음 행으로 이동시키는 메소드가 next()이다.
ResultSet의 커서가 있는 행에서 컬럼 자료를 참조하기 위해 ResultSet이 제공하는 메소드 getString()을 이용한다.
getString()의 인자는 컬럼 이름을 문자열로 직접 쓰거나 또는 컬럼 번호를 이용할 수 있다. 컬럼 값의 자료 유형에 따라 메소드 getString()뿐만 아니라 getInt(), getDouble(), getDate() 등 다양한 컬럼 반환 메소드를 제공한다.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class Example {
public static void main(String[] args) {
String jdbc_driver = "com.mysql.cj.jdbc.Driver";
String jdbc_url = "jdbc:mysql://localhost:3306/board?serverTimezone=UTC";
try {
Class.forName(jdbc_driver).newInstance();
Connection con = Driver.Manager.getConnection(jdbc_url, "root", "root");
Statement st = con.createStatement();
String sql = "SELECT * FROM member";
ResultSet rs = st.executeQuery(sql);
while(rs.next()) {
String name = rs.getString(1);
String owner = rs.getString(2);
String date = rs.getString(3);
Ststem.out.println(name + "" + owner + "" + date);
}
rs.close();
st.close();
con.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException
public class InsertTest {
public static void main(String[] args) {
// user 테이블에는 이름/지역/부서/성별/출생일 컬럼이 있다.
}
public static void insert(String name, String area, String department,
String gender, String birth) {
Connection conn = null;
PreparedStatement pstmt = null;
try {
// 1. 드라이버 로딩
Class.forName("com.mysql.jdbc.Driver");
// 2. 연결하기
String url = "jdbc:mysql://localhost/dev";
conn = DriverManager.getConnection(url, "dev", "dev");
// 3. SQL 쿼리 준비
// 추가하려는 데이터의 값은 전달된 인자를 통해 동적으로 할당되는 값이다.
// 즉, 어떤 값이 전달될 지 모르기 때문에
// select 할 때와 달리 stmt = conn.createStatement(); 대신
// pstmt = conn.prepareStatement(sql);로 작성하여 데이터를 추가할 것임을 알려준다.
String sql = "INSERT INTO user VALUES (?,?,?,?,?)";
pstmt = conn.prepareStatement(sql);
// 4. 데이터 Binding
pstmt.setString(1, name);
pstmt.setString(2, area);
pstmt.setString(3, department);
pstmt.setString(4, gender);
pstmt.setString(5, birth);
// 5. 쿼리 실행 및 결과 처리
// SELECT와 달리 INSERT는 반환되는 데이터들이 없으므로
// ResultSet 객체가 필요 없고, 바로 pstmt.executeUpdate() 메서드를 호출하면 된다.
// INSERT, UPDATE, DELETE 쿼리는 이와 같이 메서드를 호출하며
// SELECT에서는 stmt.executeQuery(sql); 메서드를 사용한다.
int count = pstmt.executeUpdate();
if(count == 0) {
System.out.println("데이터 입력 실패");
}
else {
System.out.println("데이터 입력 성공");
}
}
catch(ClassNotFoundException e) {
System.out.println("드라이버 로딩 실패");
}
catch(SQLException e) {
System.out.println("에러 "+ e);
}
finally {
try {
if(conn != null && !conn.isClosed()) {
conn.close();
}
if(pstmt != null && !pstmt.isClosed()) {
pstmt.close();
}
}
catch(SQLException e) {
e.printStackTrace();
}
}
}
}
java에서 데이터베이스를 사용하기 위해서는 드라이버를 설치해야 한다.
먼저 MySQL 홈페이지에서 드라이버를 설치한다. (링크)
설치가 완료되면 mysql-connector-java-버전-bin.jar 파일이 생성된다.
여러 클래스들을 모아 놓은 파일을 jar 파일이라고 하는데, 해당 파일이 있어야 MySQL을 사용할 수 있다.
마무리
- 쿼리를 수행할 때 동적으로 할당해야 하는 값이 있으면 PreparedStatement 객체를 사용하고, 동적으로 할당할 필요가 없으면 Statement 객체를 사용한다.
- 쿼리의 결과가 있으면 executeQuery() 메서드를 호출하여 ResultSet 객체에 담고,
쿼리의 결과가 없으면 executeUpdate() 메서드를 호출하여 int형 변수에 결과 값을 할당한다.