[Java] JDBC를 통한 database 접근(MariaDB)
Java는 정말 다양한 기능을 수행할 수 있다는 장점이 있는데 JDBC도 그 중 하나다. JDBC(Java Database Connectivity)는 자바가 DB에 접근해서 데이터를 처리할 수 있도록 연결해주는 인터페이스라고 할 수 있다. 정확히는 자바에서 인터페이스만 제공하고 MS-SQL, MySQL, MariaDB, DB2 등 각 DB에서 자바 인터페이스에 따라 JDBC 드라이버를 만든 것이다. 우리는 각 DB를 선택해서 해당하는 드라이버를 사용해 JDBC를 이용하기만 하면 된다.
연결 방법
본인은 MariaDB를 연동할 것이기 때문에 MariaDB driver를 이용해야 한다.
1. MariaDB JDBC driver 다운 받기
https://mariadb.com/downloads/#connectors
Download – MariaDB.com | MariaDB
Official downloads for MariaDB. Select versions / OS.
mariadb.com
2. jar 파일 Java Project에 연동
위의 링크를 타서 다운로드를 완료하면 mariadb-java-client-2.4.4.jar 파일이 생길 것이다. 이를 Java Project에 연동해야 한다.

- JDBC를 사용하려는 Java Project에 마우스 오른쪽 클릭해서 Build Path > Configure Build Path.. 를 클릭한다.

- Libraries에서 Add External JARs.. 버튼 클릭해서 아까 받았던 mariadb-java-client-2.4.4.jar 파일을 집어 넣는다.

- 이렇게 jar 파일이 추가가 되어있으면 연동 성공한 것이다!!
여기까지 하면 이제 본격적으로 JDBC를 이용할 준비가 된 것이다.
JDBC 사용해서 DB에 쿼리를 날려보자!
SQL 중에서 기본 CRUD인 INSERT, SELECT, UPDATE, DELETE를 가지고 DB에 날려볼 것이다. 우선 INSERT를 가지고 어떤 과정을 거쳐 SQL이 DB로 전송이 되는지 알아보자.
1. Driver 로드
1
2
3
4
5
6
7
8
9
10
|
try {
// 1. Drive 클래스를 로드해준다.
Class.forName("org.mariadb.jdbc.Driver");
System.out.println("드라이브로드 성공");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
|
Class.forName 메서드를 이용해서 Driver 클래스를 메모리에 로딩시켜주자. 이와 관련된 내용은 앞선 static에 관한 게시글을 참조하면 좋을 것 같다. Driver 로드를 완료하면 이제 DB연결을 할 수가 있다.
2. Connection 객체를 생성해 DataBase 연결하기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
Connection con = null;
PreparedStatement pstmt = null;
try {
con = DriverManager.getConnection(
"jdbc:mysql://localhost/acorn?autoReconnect=true",
"acorn12", // user name
"acorn12"); // password
// 2. 데이터 베이스와 연결을 시도한다.
System.out.println("데이터 베이스 연결 성공");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
|
DriverManager.getConnection 메서드를 이용해서 Connection 객체를 생성한다. 필요한 인자는 연결하려는 데이터베이스 주소, 등록한 user name과 password다. SQLException 예외처리 해야하는 것도 잊지말아야 한다.
3. Connection 객체를 생성해 DataBase 연결하기
1
2
3
4
5
6
7
8
9
10
|
PreparedStatement pstmt = null;
StringBuffer sql = new StringBuffer();
// 이런식으로 사용하자
// 쿼리에서 먼저 실험해보고 확실히 성공했을 때 넣기.
// ? : binding 변수 - 값(value)에만 사용할 수 있다.
sql.append("INSERT INTO dept(deptno, dname, loc) VALUES(?,?,?)");
// 3. SQL문을 전송할 수 있는 PreparedStatement 객체를 생성한다.
pstmt = con.prepareStatement(sql.toString());
|
DB와 연결을 성공했으면 그 다음은 SQL문을 전송할 준비를 해야 한다. 여기서 PreparedStatement 객체를 이용한다.
StringBuffer를 이용해 원하는 sql문을 String으로 이어서 만들고 완성된 sql 문자열을 PreparedStatement 객체 생성하면서 연결한다. 여기까지는 아직 sql문을 전송한 것이 아니다.
4. 바인딩 변수 설정 후 쿼리 전송하기
1
2
3
4
5
6
7
8
9
|
// 4. 바인딩 변수(?)를 설정한다.
// ?,?,?에 각각에 맞는 index에 맞는 type을 집어넣으면 된다.
pstmt.setString(2, "ANALYSIS");
pstmt.setString(3, "LA");
// 5. SQL문을 전송한다.
int result = pstmt.executeUpdate();
// insert, update, delete(DML)일 때 사용
|
바인딩 변수는 위에 sql 문자열 만들 때 보았던 '?' 변수이다. 여기에 따로 PreparedStatement 객체를 이용해 원하는 값을 집어 넣을 수 있다. 아래가 INSERT하려는 dept table이다. deptno=5, dname=ANALYSIS, loc="LA"를 INSERT 해보려 한다.

생성된 PreparedStatement 객체를 통해 executeUpdate 메서드로 쿼리를 전송한다. 여기서 INSERT, UPDATE, DELETE 3개의 쿼리를 묶어 DML이라 하는데 DML쿼리는 executeUpdate 메소드를 이용하고, SELECT는 DQL쿼리로 executeQuery 메소드를 사용해야 함을 잊으면 안된다. (근데 사실 DML에서도 executeQuery 메소드를 사용해도 실행은 된다고 합니다. 이에 대한 내용을 까먹었는데 혹시 정확히 아시는 분 계시면 댓글로 알려주시면 감사하겠습니다~)
executeUpdate 메소드 결과값으로 갱신된 행(데이터)의 개수를 리턴해준다.


성공적으로 쿼리가 수행됐음을 알 수 있다!
(추가) 5. SELECT 쿼리 보내기
SELECT 쿼리는 위의 3개의 DML쿼리와 다르게 executeQuery 메서드를 통해 쿼리를 보내고 특별히 중요한 것이 ResultSet 객체를 이용해서 executeQuery의 결과값을 받는다는 것이다.
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
|
Connection con = null;
PreparedStatement pstmt = null;
ResultSet rs = null;
try {
con = DriverManager.getConnection(
"jdbc:mysql://localhost/acorn",
"acorn12",
"acorn12");
StringBuffer sql = new StringBuffer();
sql.append("SELECT deptno, dname, loc ");
sql.append("FROM dept ");
sql.append("ORDER BY deptno");
pstmt = con.prepareStatement(sql.toString());
// SELECT 수행시 executeQuery() 사용
// INSERT 때에도 사실 executeQuery로도 실행은 가능하다.
rs = pstmt.executeQuery();
// ResultSet을 이용해서 결과 출력
while (rs.next()) {
// 중간에 어느하나가 누락되었다 해도 알아서 고쳐줌
int index = 1;
String dname = rs.getString(index++);
String loc = rs.getString(index++);
System.out.printf("%d, %s, %s\n", deptno, dname, loc);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
|
ResultSet은 executeQuery 메서드의 결과값을 받아내고 SELECT의 결과테이블 각 행을 기준으로 나타낸다.
이를 출력하기 위해 next() 메서드를통해서 다음 데이터가 존재하는지 유무를 판단하게 만들고 존재할 경우 계속 반복문이 돌아가도록 해서 출력코드를 작성하면 된다.
※정리
1. org.mariadb.jdbc.Driver 클래스를 메모리에 로딩 (Class.forName 메서드를 이용한다.)
2. Connection 객체를 생성해 DataBase 연결하기 (DriverManager.getConnection(DB주소, username, pwd)를 이용해서 연결)
3. Connection 객체를 생성해 DataBase 연결하기
(sql문을 StringBuffer를 이용해 하나의 문자열로 만들어서 PreparedStatement 객체 생성하는데 보낸다.)
4. 바인딩 변수 설정 후 쿼리 전송하기
('?' 처리한 곳에 PreparedStatement 객체를 이용해 원하는 값을 넣고 executeUpdate (or executeQurey) 메서드를 이용해 DB에 쿼리를 보낸다.)
5. DB에 가서 성공 유무를 확인한다. 끝!
(다음에는 JDBC를 이용해 쿼리를 보낼 때 DAO, DTO를 사용하는 방법과 의미에 대해서 정리해보겠습니다.)
'Java' 카테고리의 다른 글
[Collection] ArrayList 특징 (add할 때의 내부동작) (0) | 2021.07.25 |
---|---|
[Java] JDBC - DAO와 DTO에 대한 내용 (0) | 2019.12.18 |
[Java] Static과 관련해서 더 자세히 알아보자 (0) | 2019.12.10 |
[Java] IO 입출력(Stream)에 대한 공부 (0) | 2019.12.05 |
[Java] Thread에 대한 공부 (0) | 2019.12.05 |
댓글
댓글(Github)
다른 글
-
[Collection] ArrayList 특징 (add할 때의 내부동작)
[Collection] ArrayList 특징 (add할 때의 내부동작)
2021.07.25Overview ArrayList의 add 과정 DEFAULT_CAPACITY를 넘겼을 때 ArrayList는 copy의 문제를 가지고 있다. ArrayList는 어떻게 사용해야될까 정리 📌 Overview ArrayList하면 코딩테스트나 실제 개발에 가장 많이 쓰이는 Collection Framework이지 않을까 생각합니다.그만큼 가장 기본적이면서도 아주아주 중요한 클래스이기 때문에 ArrayList의 내부 동작을 중점으로 특징을 한번 정리해보고자 합니다. ArrayList에 대한 메서드나 어떤 클래스 계층구조를 가졌는지에 대해서는 잘 정리된 블로그 글들이 많기 때문에 이에 대한 설명은 줄이고 내부적으로 어떤 동작을 하는지에 초점을 맞추었습니다. 📌 ArrayList의 add 과정 public vo… -
[Java] JDBC - DAO와 DTO에 대한 내용
[Java] JDBC - DAO와 DTO에 대한 내용
2019.12.18지난번에는 JDBC 연결과 함께 기본적인 SQL문을 날리는 방법에 대해서 정리해보았습니다. 지난 시간에 이어서 이번에는 JDBC를 더욱 효율적으로 작동하게 만드는 DAO와 DTO에 대해서 정리해보고자 합니다. 혹시 지난 JDBC의 기본에 대한 정리글을 아직 못보신 분들이라면 [Java] JDBC를 통한 database 접근(MariaDB) 링크를 클릭하셔서 먼저 보시고 이번 게시글을 보시는 것을 추천합니다! 한번 시작해볼까요? [Java] JDBC를 통한 database 접근(MariaDB) Java는 정말 다양한 기능을 수행할 수 있다는 장점이 있는데 JDBC도 그 중 하나다. JDBC(Java Database Connectivity)는 자바가 DB에 접근해서 데이터를 처리할 수 있도록 연결해주는 인터… -
[Java] Static과 관련해서 더 자세히 알아보자
[Java] Static과 관련해서 더 자세히 알아보자
2019.12.10지난번에 접근한정자 파트에서 Static과 관련한 내용을 다룬적이 있었다. - 다시한번 정리하자면1) 클래스 내에 static 변수(메서드)를 사용하면 클래스 변수(메서드)라 하고 클래스를 통해 생성되는 모든 객체들이 이 변수값을 공유한다.2) 모든 객체들이 공유하는 만큼 객체이름을 통해 해당 static 변수(메서드)에 접근가능하지만 클래스 이름을 통해서 접근할 것을 권장한다.3) static 초기화는 단 한번만 작동하며, static 블럭 안에는 static 변수(메서드)만 가능하며 객체가 생성되기도 전에 가장 먼저 실행된다. 혹시 이해가 안가는 부분이 있으면 [Java] Access Modifier - 접근한정자에 대한 공부를 참고하면 좋을 것 같다. 이번 시간에는 Static에 대해 좀 더 자세히… -
[Java] IO 입출력(Stream)에 대한 공부
[Java] IO 입출력(Stream)에 대한 공부
2019.12.05Java에서 중요한 부분중에 하나인 IO 입출력 관련해서 공부한 내용을 정리해보고자 한다. 자바에서 입력, 출력으로 나눠서 설명하자면 ≫ 입력 : 파일, 키보드, 네트워크 (소스 / Source라고도 한다.) ≫ 출력 : 파일, 모니터, 네트워크 (목적지 / Destination이라고도 한다.) 이렇게 나눌 수 있다. 각각에 대해 입출력을 작동시키기 위해 알맞는 Stream을 사용해 수행해야 한다. Stream은 자바 애플리케이션이 입력과 출력을 수행하도록 도와준다. 소스에서 자바 애플리케이션으로 데이터를 읽어 들이는 것을 InputStream이라고 하고, 자바 애플리케이션에서 목적지로 데이터를 출력시키는 작업을 OutputStream이라고 한다. 이것들이 어떤 용도로 어떻게 쓰이는지 알아보자. 여러가지…
댓글을 사용할 수 없습니다.