ㅅㅇ
[JDBC] 개요 & Java - mysql 연동 절차 및 문법 본문
플레이데이터 빅데이터캠프 공부 내용
[JDBC] 개요 & Java - mysql 연동 절차 및 문법
1. 개요
1. JDBC(Java Database Connectivity)란 ?
자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API이다.
JDBC는 데이터베이스에서 자료를 쿼리하거나 업데이트하는 방법을 제공
(1) db 연동 표준 API
- 표준의 의미
- 누군나가 어떤 제품이든 동일
- DB 제품과 무관하게 개발자가 누구든 DB 연동 코드는 같은 것. 이는 강제적이며 건들 수 없는 부분.
=> orcle 에서 API 를 제공 하여,
이 API 는 특정 벤더사에 종속적인 코드를 제시하지 않으며,
오로지 스펙(주석)과 API 이름(상수, 메소드 선언구) 만 제시된 interface 구조로 제공한다.
실제 구현은 벤더사에 위임하는 것이며, 이는 자바 개발자들에게 편의성을 제공한다.
- 상수 - 값 불변인 final 변수 - public static final
- 미완성 메소드 - abstract 메소드, {} 자체가 없음. - public abstract
(미완성 로직으로 생성자 자체가 없으므로 상속 관계의 하위 클래스에
미완성 메소드를 재정의하여 객체 생성해 사용한다.)
- 주석 (설명 즉 스펙) }
= > db 벤더사가 db에 접속 가능하게 각 회사에 맞게 내부를 구현하는 것.
친화적인 구조로 설계해서 driver 로 제공함.
= > 자바 개발자가 driver 만 설치한 후 활용하기에 로직에만 집중해서 개발할 수 있다.
2. Java - mysql 연동 절차 및 문법
- 예외 처리 필수 !!
- 연동 시 발생할 모든 에러에 대해 생각하여
try - catch 로 구현하여 e.printStackTrace() 받는다. - > catch (Exception e)
- 모든 예외 발생에서도 반드시 실행되어야 할 close() 접속 해제를 위해 이는 finally 로 작성한다.
- close 에서 발생할 에러도 고려하여
이 또한 try-catch 로 구현하여 e.printStackTrace() 받는다. - > catch (SQLException e)
0. 기본 셋팅
*** Maven mysql JDBC Drivers 사용 MySQL Connector/J
https://mvnrepository.com/artifact/mysql/mysql-connector-java
=> maven project 로 진행 할 것이기 때문에 pom.xml 에 해당 dependecy 꼭꼭 추가해주기
1. driver 로딩
2. Connection 객체 생성 : Connection API(ip,id, pw, database)
- > 접속 성공
=> 3 ~ 6 단계로
- > 접속 실패 - 값들 수정해서 재접속 시도.
=> 예외 처리 필수.
3. Statement 객체 생성
- 해당 db에 접속된 Connection 객체로부터 sql 문장 실행객체 생성
stmt = conn.createStatement();
4. sql 문장 실행 .executeXxx()
- DQL(Query(select)) : 검색 구조의 table가 출력
ex) 실행 문장 - 실행객체.executeQuery("select"){}
=> ResultSet 반환
import java.sql.ResultSet;
ResultSet rset = stmt.executeQuery(sql);
- DML(insert/update/delete) : 존재하는 table 내용 수정한 행 수 가 출력
ex) 실행 문장 - 실행객체.executeUpdate("dml"){}
=> int 반환
int i = stmt.executeUpdate(sql);
5. 결과 사용
- sql 문장 실행 결과가 무엇인지(몇 개의 row 인지 등,,,) 생각하여 적절하게 코드 작성하여야 한다.
- 문장에 따라, int 또는 ResultSet 을 반환
1) DQL(Query(select)) : 검색 구조의 table가 출력 => ResultSet 반환
- resultSet 객체 사용
import java.sql.ResultSet;
ResultSet rset.getXxx(컬럼명 또는 컬럼index) Xxx: 해당 컬럼의 타입
2) DML(insert/update/delete) : 존재하는 table 내용 수정한 행 수 가 출력
실행 결과로 실행이 적용된 행 수가 int 값으로 출력된다.
이를 int 타입 으로 선언된 변수에 받아 내가 실행한 문장의 결과에 맞게 반환된 것을 확인할 수 있다.
// 연동 코드의 한 부분이며, 만약 연동 작업이 제대로 되지 않았다면 false를 반환할 것이다.
int i = pstmt.executeUpdate();
if(i == 1) {
return true;
}
return false;
6. 자원 반환 : 접속 해제 close()
- (ResultSet) - > Statement - > Connection 순으로 close 하기
sql 문장에 따라 ResultSet 이 필요없는 경우가 있다.
** 코드 예시 - 기본적인 문법 설명을 위한 코드이며, 현업에선 아래와 같은 코드를 사용하지 않는다. **
package step01;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DeptDAO {
public static void selectAll() {
// 가급적 def 값으로 초기화 해주기
Connection conn = null;
Statement stmt = null;
ResultSet rset = null;
try {
// driver 로딩
Class.forName("com.mysql.cj.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost/playdata?characterEncoding=UTF-8&serverTimezone=UTC", "-", "-");
// 연결 됐는지 확인
//System.out.println(conn);
// Statement 객체 생성
stmt = conn.createStatement();
// sql 문장 실행
// rset이라는 객체 ResultSet 에 초기화
// sql 문장 결과는 데이터가 있는 수만큼의 row 들로 이뤄져있다. 이 결과를 사용하기 위해 반복문으로 받으면 됨.
rset = stmt.executeQuery("select * from dept"); // sql 문자 실행
// 결과 사용 : 컬럼명 또는 컬럼 index 값으로 처리하여 값 받음.
while(rset.next()) {// 검색된 table의 다음 row 이동하면서 존재 여부 확인
//System.out.println(rset.getInt("deptno") + " " + rset.getString("dname") + " " + rset.getString("loc"));
System.out.println(rset.getInt(1) + " " + rset.getString(2) + " " + rset.getString(3));
}
} catch (Exception e) {
e.printStackTrace();
} finally {//자원 반환
try {
if(rset != null) {
rset.close();
rset = null;
}
if(stmt != null) {
stmt.close();
stmt = null;
}
if(conn != null) {
conn.close();
conn = null;
}
}
catch (SQLException e) { //close() throws SQLException{} 처리 문장 필수
e.printStackTrace();
}
}
}
public static void main(String[] args) {
selectAll();
}
}
3. Java - mysql 연동 절차 - 현업에서는
1) 중복 코드는 분리하여 Util.java 에 따로 작성되어야 하며,
- driver loading, connection, close
- close 의 경우 DQL 은 ResultSet close() 가 필요하지만, DML 의 경우 필요없기에
둘을 각각의 메소드로 만들어줌.
2) db 의 설정 정보는 별도의 properties 파일에 작성되어야 한다.
- db 의 설정 정보 수정으로 코드 재 컴파일, 서버에 재 배포단계를 생략한다.
- 보안의 이유로 코드 상에서 db 정보 분리
- spring boot & jpa framework들의 설정 정보들로도 사용
- DBUtil 예시 - 중복 코드 분리한 코드
/** 1 예시 코드 - 모든 db 연동 클래스의 각각의 메소드들의 공통된 코드를 분리한 코드**/
package Util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class DBUtil {
/** driver loading **/
static {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (Exception e) {
e.printStackTrace();
}
}
/** connection
* @throws SQLException **/
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection("jdbc:mysql://localhost/-?characterEncoding=UTF-8&serverTimezone=UTC", "-", "-");
}
/** close - DQL **/
public static void close(Connection conn, Statement stmt, ResultSet rset) {
try {
if(rset != null) {
rset.close();
rset = null;
}
if(stmt != null) {
stmt.close();
stmt = null;
}
if(conn != null) {
conn.close();
conn = null;
}
}catch (SQLException e) {
e.printStackTrace();
}
}
/** close - DML **/
public static void close(Connection conn, Statement stmt) {
try {
if(stmt != null) {
stmt.close();
stmt = null;
}
if(conn != null) {
conn.close();
conn = null;
}
}catch (SQLException e) {
e.printStackTrace();
}
}
}
https://github.com/cso6005/JavaReview/tree/master/step03_JDBC
'SW_STUDY > JDBC&JPA' 카테고리의 다른 글
[JPA] JPA 구현 및 예제 (0) | 2022.08.18 |
---|