JDBC(Java Database Connectvity)
- 자바 프로그램 내에서 데이터베이스 시스템의 종류에 구애 받지 않고 질의문(SQL)을 실행하기 위한
표준 데이터베이스 인터페이스
- 데이터베이스 및 어플리케이션 개발자들을 위한 표준 API 제공하는 라이브러리
- MySQL의 JDBC는 자바를 이용해서 MySQL 서버에 연결하고 SQL을 처리하기 위한 API 제공.
데이터베이스 접속, 해제 처리 절차
접속정보 설정 -> 접속 -> 접속실패 여부 검사 -> 접속 해제
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class Main01 {
public static void main(String[] args) {
// 데이터베이스에 접속하기 위한 정보 정의하기
String db_hostname = "DB서버 접속 주소";
int db_portnumber = 포트번호;
String db_database = "데이터베이스이름";
String db_charset = "케릭터 셋";
String db_username = "계정이름";
String db_password = "계정비밀번호";
// null로 초기화 한다.
Connection conn = null;
/** 데이터베이스 접속 처리 */
// 사용하려는 데이터베이스명을 포함한 URL기술
// -> jdbc:mysql://localhost:3306/myschool?characterEncoding=urf8&serverTimezone=UTC
String urlFormat = "jdbc:mysql://%s:%d/%s?characterEncoding=%s&serverTimezone=UTC";
String url = String.format(urlFormat, db_hostname, db_portnumber, db_database, db_charset);
// MySQL JDBC의 드라이버 클래스를 로딩해서 DriverManager클래스에 등록한다.
try {
Class.forName("com.mysql.cj.jdbc.Driver");
// DriverManager 객체를 사용하여 DB에 접속한다.
// -> 접속 URL, 아이디, 비밀번호를 전달
// -> DriverManager에 등록된 Driver 객체를 사용하여 DB에 접속 후,
// Connection 객체를 리턴받는다
// -> import java.sql.DriverManager 필요함
conn = DriverManager.getConnection(url, db_username, db_password);
// 성공시 메시지 출력
System.out.println("=== DATABASE Connerct Success ===");
} catch (ClassNotFoundException e) {
// 실패시 메시지와 에러 내용 출력
System.out.println("=== DATABASE Connerct Fail ===");
System.out.println(e.getMessage());
} catch (SQLException e) {
// 실패시 메시지와 에러 내용 출력
System.out.println("=== DATABASE Connect Fail ===");
System.out.println(e.getMessage());
}
/** 데이터베이스 접속 해제 처리 */
try {
conn.close();
System.out.println(" === DATABASE Disconnect Success ===");
} catch (Exception e) {
System.out.println(" === DATABASE Disconnect Fail ===");
System.out.println(e.getMessage());
}
conn =null;
}
}
접속, 해제 처리의 모듈화
반복적으로 나타나는 코드
- 거의 대부분의 프로그램들은 데이터베이스와의 연동을 필요로 하기 때문에 모든 프로그램의 시작과 끝에서는 데이터베이스 접속/해제 처리가 적용되어야 한다.
재사용을 필요로 하는 코드의 재사용
- 프로그램을 개발하는 과정에서 같은 코드가 두 번 이상 반복된다면, 해당 내용을 별도의 파일에 SingleTon 클래스로 묶어 호출하는 형태로 코드를 재사용 가능.
DBHelper 제작
package study.java.helper;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBHelper {
private static final String db_hostname = "DB서버 접속주소";
private static final int db_portnumber = 포트번호;
private static final String db_database = "데이터베이스이름";
private static final String db_charset = "케릭터 셋";
private static final String db_username = "계정이름";
private static final String db_password = "계정비밀번호";
private Connection conn = null;
// ----- 싱글톤 객체 생성을 위한 준비 시작 -----
// 싱글톤 객체
private static DBHelper current;
public static DBHelper getInstance() {
if (current == null) {
current = new DBHelper();
}
return current;
}
public static void freeInstance() {
current = null;
}
private DBHelper() {}
// ----- 싱글톤 객체 생성을 위한 준비 끝 -----
/** 데이터베이스에 접속 후, 접속 객체 리턴 */
public Connection open() {
// 중복 실행될 경우 발생될 문제를 방지하기 위해
// Connection 객체가 null인 경우만 처리하도록 if문으로 구성
if (conn == null) {
/** 데이터베이스 접속 처리 */
// 사용하려는 데이터베이스명을 포함한 URL기술
// -> jdbc:mysql://localhost:3306/myschool?characterEncoding=urf8&serverTimezone=UTC
String urlFormat = "jdbc:mysql://%s:%d/%s?characterEncoding=%s&serverTimezone=UTC";
String url = String.format(urlFormat, db_hostname, db_portnumber, db_database, db_charset);
// MySQL JDBC의 드라이버 클래스를 로딩해서 DriverManager클래스에 등록한다.
try {
Class.forName("com.mysql.cj.jdbc.Driver");
// DriverManager 객체를 사용하여 DB에 접속한다.
// -> 접속 URL, 아이디, 비밀번호를 전달
// -> DriverManager에 등록된 Driver 객체를 사용하여 DB에 접속 후,
// Connection 객체를 리턴받는다
// -> import java.sql.DriverManager 필요함
conn = DriverManager.getConnection(url, db_username, db_password);
// 성공시 메시지 출력
System.out.println("=== DATABASE Connerct Success ===");
} catch (ClassNotFoundException e) {
// 실패시 메시지와 에러 내용 출력
System.out.println("=== DATABASE Connerct Fail ===");
System.out.println(e.getMessage());
} catch (SQLException e) {
// 실패시 메시지와 에러 내용 출력
System.out.println("=== DATABASE Connect Fail ===");
System.out.println(e.getMessage());
}
}
return conn;
}
/** 데이터베이스의 접속을 해제 */
public void close() {
if (conn != null) {
/** 데이터베이스 접속 해제 처리*/
try {
conn.close();
System.out.println(" === DATABASE Disconnect Success ===");
} catch (Exception e) {
System.out.println(" === DATABASE Disconnect Fail ===");
System.out.println(e.getMessage());
}
conn =null;
}
}
}
데이터 입력, 수정, 삭제
데이터 입력, 수정, 삭제 처리 절차
- 접속 및 결과 검사
- DBHelper활용
- open()메서드의 리턴값에 따라서 접속 성공/실패 여부 검사.
- 접속에 실패한 경우 사용자에게 페이지에서 에러가 발생했음을 알림.
- SQL구분 작성 및 실행
- insert, update, delete SQL문을 변수에 저장
- SQL 구문 실행
- 결과 에러 검사
- SQL 구문을 실행하는 과정에서 적용된 예외처리 구문을 통해 에러 감지.
- 이 과정에서 에러가 발생하면 대부분 SQL문 에러.
- 결과값 추출
- insert, update, delete의 결과 행이 몇 건인지를 추출 가능.
- 접속 해제
- DBHelper의 close()함수 활용.
예제 1)
department 테이블에 학과번호 300, 학과이름 컴퓨터정보과, 위치 5호관 내용 추가
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;
import study.java.helper.DBHelper;
public class Main02 {
public static void main(String\[\] args) {
// 수정, 삭제는 SQL문을 수정, 삭제하는 SQL문으로 수정하면 된다.
// 'department' 테이블에 '컴퓨터정보과'추가를 위한 SQL문
String sql = "insert into department (deptno, dname, loc) values (300, '컴퓨터정보과', '5호관')";
/** DBHelper를 통한 DB 접속 처리 */
DBHelper db = DBHelper.getInstance();
Connection conn = db.open();
/** SQL 구문 실행하기 */
// SQL문을 실행할 수 있는 객체
Statement stmt = null;
// 결과값 (저장된 데이터의 수)
int result = 0;
try {
// SQL문을 실행할 수 있는 객체 생성 (예외처리 요구됨)
stmt = conn.createStatement();
// SQL문 실행하기 --> 결과 행 리턴된 (예외처리 요구됨)
result = stmt.executeUpdate(sql);
} catch (SQLException e) {
System.out.println("MySQL SQL Fail: " + e.getMessage());
} finally {
// SQL구문의 에러여부에 상관없이 stmt 객체를 닫기 위해 finally 블록 사용.
// --> 객체의 유효범위 설정을 위해 stmt 객체는 try 블록 밖에 선언됨.
if (stmt != null) {
// 객체 닫기
try {
stmt.close();
} catch (SQLException e) { }
}
}
// 결과출력
System.out.println(result + " Record Insert");
/** DB 접속 해제 */
db.close();
}
}
단일행, 다중행 데이터 조회
단일행 조회 처리 절차
- 접속 및 결과 검사
- DBHelper활용
- open()메서드의 리턴값에 따라서 접속 성공/실패 여부 검사.
- 접속에 실패한 경우 사용자에게 페이지에서 에러가 발생했음을 알림.
- SQL구분 작성 및 실행
- insert, update, delete SQL문을 변수에 저장
- SQL 구문 실행
- 결과 에러 검사
- SQL 구문을 실행하는 과정에서 적용된 예외처리 구문을 통해 에러 감지.
- 이 과정에서 에러가 발생하면 대부분 SQL문 에러.
- 결과 처리
- 조회된 데이터를 읽기 위해 ResultSet의 커서를 이동시킨다.
- 결과값 추출
- insert, update, delete의 결과 행이 몇 건인지를 추출 가능.
- 접속 해제
- DBHelper의 close()함수 활용.
예제
'JAVA' 카테고리의 다른 글
JAVA(이것저것) (0) | 2021.01.12 |
---|---|
JAVA(DAO패턴) (0) | 2020.06.24 |
JAVA(fileIO, JSONObject) (0) | 2020.06.16 |
JAVA(예외처리, 날짜처리, 컬렉션) (0) | 2020.06.15 |
JAVA (Static, 익명클래스) (0) | 2020.06.11 |
댓글