반응형
JDBC란
자바 언어로 다양한 종류의 관계형 데이터베이스에 접속하고 SQL문을 수행하여 처리하고자 할 때 사용되는 표준 SQL 인터페이스 API이다. 접속하려는 DBMS 서버에 따라서 알맞는 JDBC 드라이버가 필요하다.
소개를 시작하기에 앞서,
1) MySQL 사용에 필수적인 mysql-connector-java-버전-bin.jar 파일을 (인텔리제이 기준) 프로젝트 구조 - 라이브러리 - +자바 를 통해 코딩할 모듈에 추가시켜준다.
2) MySQL에, 테이블을 삽입할 데이터베이스와 계정(id, password)을 등록해준다. : 본 포스팅에서는 DB 이름 : dev, id : dev, pw : dev로 사용할 예정
JDBC 기본적인 연결 후 사용하기
JDBC를 본격적으로 사용하기 위해 반드시 거쳐야 하는 단계들을 먼저 언급하겠다.
1) import java.sql.*;
2) JDBC 드라이버 로딩
JDBC 프로그래밍을 위해 가장 먼저 해야할 일로, 데이터베이스 작업을 위해 준비된 JDBC드라이버 파일을 사용할 수 있도록 메모리에 로드시킨다.
Class.forName("com.mysql.jdbc.Driver"); 코드로 구현하며, Oracle의 경우는 구글링을 통해 서치하면 충분히 찾을 수 있고 Class.forName()의 인자값만 바꿔주면 되는 아주 간단한 사안이다.
Class.forName()으로 인해 JDBC 드라이버 파일 내의 com.mysql.jdbc.Driver 클래스가 동적으로 로딩될 때 자동으로 JDBC 드라이버 객체가 생성되어 DriverManager에 등록되어 준비가 완료된다. com.mysql.jdbc.Driver 클래스는 드라이버 인터페이스를 구현한 클래스이다.
이 코드는 프로그램 구현 시 한 번만 필요하다.
3) DBMS 서버(MySQL)와의 연결 작업을 위한 Connection 객체 생성
JDBC 드라이버가 사용할 준비가 되었다면 첫번째 DB작업으로 DB서버와의 연결을 시켜준다. 아래 코드를 통해 구현한다.
Connection conn = DriverManager.getConnection(url, id, password);
이 코드로 하여금 mysql과의 연결 작업을 완료할 수 있다.
getConnection 메소드의 파라미터 값은 다음과 같다.
- String url : 접속할 서버의 URL이며 맨 마지막에 DB이름을 넣어준다.
- String id : DB서버에 로그인할 계정
- String password : DB 서버에 로그인할 비밀번호
DriverManager.getConnection(url, id, password); 은 실제 자바 프로그램과 데이터베이스를 네트워크상에서 연결시켜주는 역할을 하며, 연결에 성공했을 시 DB와 연결된 상태를 Connection 객체 conn으로 표현하여 반환한다.
바로 밑에서 이 객체를 통해 쿼리를 날리는 statement를 작성할 수 있다.
4) Statement 객체를 생성하여 질의 수행
Statement 객체는 자바프로그램이 DB쪽으로 SQL query문을 전송하고, DB가 처리된 결과를 다시 자바프로그램쪽으로 전달할 수 있도록 돕는 객체이다.
Statement stmt = conn.createStatement(); 코드를 통해 생성한다.
5) SQL문 실행 및 결과 반환
SQL 쿼리 실행은 코드를 통해 보이겠으며, 결과 반환은 ResultSet 객체를 통한다.
이 객체는 주로 조회 기능에 사용되며, SQL 쿼리의 실행 결과를 ResultSet으로 받아서 정보를 저장할 오브젝트(JavaBean, DTO)에 옮겨준다.
6) 자원해제 : DB 관련 처리 작업을 하며 사용한 리소스들을 메모리에서 해제시켜주기. -> 최근 사용했던 객체부터
이제 아래 코드로 하여금 JDBC 연결을 테스트해보겠다.
필자는 WARN: Establishing SSL connection without server's identity verification is not recommended. 라는 경고문이 나왔기 때문에 String url = "jdbc:mysql://localhost/dev?useSSL=false"; 코드를 덧붙여 해결하였다.
혹시,
conn = DriverManager.getConnection(url, "dev", "dev"); 코드로 인해 SQLException이 발생하였다면, MySQL에서 서버가 제대로 작동하고 있는지, 올바른 DB이름과 id, password를 기입하였는지를 체크해보자.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class DBConnection { public static void main(String args[]){ Connection conn = null; try{ //1. 드라이버 로딩 : mysql 드라이버 로딩 Class.forName("com.mysql.jdbc.Driver"); //드라이버들이 읽히기만 하면 자동 객체가 생성되고 DriverManager에 등록된다. //2. mysql과 연결시키기 String url = "jdbc:mysql://localhost/dev?useSSL=false"; conn = DriverManager.getConnection(url, "dev", "dev"); System.out.println("Successfully Connection!"); } catch(ClassNotFoundException e){ System.out.println("Failed because of not loading driver"); } catch(SQLException e){ System.out.println("error : " + e); } finally{ try{ if(conn != null && !conn.isClosed()){ conn.close(); } } catch(SQLException e){ e.printStackTrace(); } } } } | cs |
테이블을 생성하는 Query 보내기
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 | import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; //**student 테이블 생성하기** //create table student( // id int, // name varchar(20), // grade int //); public class TableCreating { public static void main(String[] args){ Connection conn = null; Statement stmt = null; String url = "jdbc:mysql://localhost/dev?useSSL=false"; String id = "dev"; String pw = "dev"; try{ Class.forName("com.mysql.jdbc.Driver"); conn = DriverManager.getConnection(url, id, pw); System.out.println("Successfully Connected!"); //DB와 연결된 conn 객체로부터 Statement 객체 획득. stmt = conn.createStatement(); //query 만들기 StringBuilder sb = new StringBuilder(); String sql = sb.append("create table if not exists student(") .append("id int,") .append("name varchar(20),") .append("grade int") .append(");").toString(); //query문 날리기 stmt.execute(sql); } catch(ClassNotFoundException e){ e.printStackTrace(); } catch(SQLException e){ e.printStackTrace(); } finally{ try{ //자원 해제 if(conn != null && !conn.isClosed()) conn.close(); } catch(SQLException e){ e.printStackTrace(); } } } } |
위에서는 JDBC API가 만들어내는 예외에 대해 일일이 예외처리를 해주었지만, 코드가 길어지고 요구되는 기능이 많아질수록 불필요한 코드를 잡아내는 것이 중요하기 때문에, 예외를 던져주는 방법을 사용하는 것도 나쁘지 않다.
위 코드에서는 Statement 객체를 던지는 방법으로 stmt.execute(sql); 을 사용하였다.
Statement 객체를 던지는 방법에는 3가지가 있다.
- stmt.execute() : 테이블 생성, 수정, 삭제 등 DB 관리 명령어에 주로 사용.
- stmt.executeUpdate() : 레코드 삽입, 수정, 삭제 등 데이터 관리 명령어에 주로 사용하며, SQL문이 실행된 후 그에 영향을 받은 레코드의 갯수를 int형으로 반환하는 메소드.
- stmt.executeQuery() : Select한 결과 값들을 ResultSet 객체에 담아 반환하며, 레코드나 테이블 조회 류의 명령에 사용.
위 코드를 실행한 뒤 MySQL을 확인해 보면 다음과 같이 테이블이 생성되어있다.
반응형
'Programming > Java' 카테고리의 다른 글
[Java 자료구조] 이중연결리스트(Double LinkedList) 구현 (0) | 2019.01.24 |
---|---|
[백준 11654번] 자바로 주어진 글자의 아스키코드 출력하기 (1) | 2019.01.21 |
Java Collection Framework :: 자바의 자료구조 (List, Set, Map) (2) | 2018.11.27 |
명품 java programming 실습문제 : 인터페이스(3번), 추상클래스(6번) (2) | 2018.11.20 |
명품 java programming open challenging : 상속 관계의 클래스 작성(ProductInfo) (0) | 2018.11.18 |