DBMS
: MariaDBJavac
: JDK version: 11JDBC
: mariadb-java-client-2.7.3.jarIDE
: Eclipse Version: 2022-03 (4.23.0)Java DataBase Connectivity
자바에서 데이터베이스와 관련된 작업을 처리할때 사용하는 API.
자바는 DBMS의 종류와 상관없이 하나의 JDBC API를 사용해 데이터베이스 작업(SQL 구문)을 처리할 수 있다.
JDBC API
는 드라이버를 거쳐 데이터베이스와 통신을 한다.
이때 드라이버는 사용하는 DBMS의 제작사에서 개발하여 배포한다.
아래 사진을 보자.
자바는 기본적으로 JDBC API를 제공해준다.
API는 java.sql.* 이다.
JDBC 드라이버는 사용하려는 DB 업체가 제공하는 것을 사용해야 한다.
사유는 프로그램 최적화 때문이라고 한다.
(Java의 Exception
을 throws
로 처리하는 것이 아니라, try
~ catch
구문으로 처리하는 것과 비슷한 이유인듯함)
나는 현재 MariaDB를 사용 중이다.
MariaDB Download Site를 들어가보자.
좌측의 메뉴항목은 아래 사진과 같다.
이중 Connector/J
를 클릭해보자.
그럼 MariaDB JDBC 드라이버의 버전이 나온다.
작성일2022-04-22
기준으로 가장 최신 버전은 Release date 2021-05-05 / 3.0.0 버전이지만, 안정화가 되지 않은 Alpha 상태이다.
따라서 Stable 상태인 2.7.3 버전을 사용하고자 한다.
다음 7가지의 단계를 거쳐 코딩을 진행한다.
JDBC
드라이버 로딩Database
연결Query
실행을 위한 Statement
객체 생성Query
실행Query
실행 결과 사용Statement
종료Database
연결 해제대략적인 순서는 이렇게 진행된다.
이제 하나하나 알아보도록 하자.
Class.forName("org.mariadb.jdbc.Driver");
try {
Class.forName("org.mariadb.jdbc.Driver");
} catch(ClassNotFoundException e) {
// 지정 클래스가 존재하지 않을 경우 Exeption 처리
}
"jdbc:mysql://아이피(도메인):(포트):/(데이터베이스명)"
Connection conn = DriverManager.getConnection(url,user,password);
JDBC
를 통해 root
권한으로 접속하면 보안문제가 발생할 가능성이 높아지니 조심하자.
사유 : 아래와 코드와 같이 포트 및 비밀번호가 그대로 노출된다.(보호 X)
현재는 예제라서 편의상 이렇게 진행한다.
보통 현장에서는 작업하려는 Database에만 접근 권한을 가진 사용자를 추가하고,
해당 사용자로 접속한다고 한다.
String url = "jdbc:mysql://localhost:3306/sample";
// 접속할 아이피, 포트, 데이터베이스명(생략가능) 지정
String user = "root";
// 접속할 사용자 지정
String password = "!123456";
// 비밀번호 입력
Connection conn = null;
System.out.println();
try {
conn = DriverManager.getConnection(url,user,password);
} catch (SQLException e) {
// 접속 실패시 SQL Exception 처리
}
Statement stmt = Connection.createStatement();
Statement stmt = null;
try {
stmt = conn.createStatement();
} catch (SQLException e) {
// 객체 생성 실패시 SQL Exception 처리
}
Statement.excuteUpdate( "SQL구문" ); int row = Statement.excuteUpdate( "SQL구문" );
INSERT
/ UPDATE
/ DELETE
사용시 사용한다.
DATABASE
의 DATA
를 변경할 시 사용.
int row = Statement.excuteUpdate( "SQL구문" );
위의 구문으로 사용해도 실행 결과는 동일하게 DATABASE
의 DATA
가 변경된다.
재밌는 점은 Return
이 int
자료형이라는 점이다.
int
자료형으로 받으면 해당 SQL 구문으로 몇 개의 행(row)이 변경되었는지 알려준다.
System.out.println("Query Complete : "+row+" row");
위의 Return 받은 row를 가지고 출력을 해보았다.
이렇게 작성하면 몇개의 row가 변경되었는지 console창으로 출력되어 쉽게 확인할 수 있다.
ResultSet = Statement.excuteQuery( "SQL구문" );
// SELECT
사용시 사용한다.
// DATABASE
의 DATA
를 읽을 시 사용.
Statement stmt = null;
ResultSet rs = null;
try {
stmt = conn.createStatement();
if (select 사용시) {
rs = stmt.executeQuery( SQL );
} else (select 제외 나머지) {
rs = stmt.executeQuery( SQL );
}
} catch (SQLException e) {
}
ResultSet 클래스의 Method를 이용해 결과를 출력할 수 있다.
관련 Document Site를 공유한다.
영어가 약해서 일단은 한글이 조금이라도 더 포함된 사이트로 공유함.
Statement.close();
Statement stmt = null;
ResultSet rs = null;
try {
stmt = conn.createStatement();
rs = stmt.executeQuery( SQL );
} catch (SQLException e) {
} finally {
if(rs!=null) try {rs.close();} catch (SQLException e) {}
if(stmt!=null) try {stmt.close();} catch (SQLException e) {}
// 구문 완료 후 statement 닫아줘야 한다
}
Connection.close();
Connection conn = null;
System.out.println();
try {
conn = DriverManager.getConnection(url,user,password);
} catch (SQLException e) {
} finally {
if(conn!=null) try {conn.close();} catch (SQLException e) {}
// 구문 완료 후 Connection 닫아줘야 한다
}