JDBC
JDBC(Java Database Connectivity)
JAVA 프로그래밍 언어를 통해, DB에 데이터를 저장, 수정, 삭제, 조회 등 쿼리를 실행할 수 있도록 하는 API(Application Interface) 입니다. 다양한 DB 제공 벤더사에서 DB에 접속하도록 자체 드라이버를 제작해서 제공합니다.
참고로, JDBC 드라이버는 TYPE1 ~ 4까지 버전이 있습니다. 그 중 순수 자바(자바 네이티브)로 구성된 TYPE4를 사용합니다. 이 TYPE4 드라이버는 자바로 작성해서 타 네이티브 라이브러리, 추가 미들웨어 없이 DB에 접속할 수 있습니다. 적은 용량과 높은 성능을 가집니다.
- ORACLE : Oracle JDBC Thin Driver(ojdbc)
- MySQL : Connector/J
- PostgreSQL : PostgreSQL JDBC driver
여기서, OJDBC를 사용해보겠습니다. 아래 페이지에서 다운로드를 합니다.
https://www.oracle.com/kr/database/technologies/appdev/jdbc-downloads.html
추가로 21c 버전 외에 최근 23c 버전이 나왔습니다. 여기서는 21c 버전을 사용하겠으며, ojdbc8.jar 파일을 다운로드해서 간단한 작업을 수행해보겠습니다.
다운로드를 받고나서, 압축을 풀지 않고 먼저 이클립스를 열어서, src에서 우클릭하면 나오는 최하단 옵션인 Properties(alt+enter)로 이동합니다. 아래와 같이 Java Build Path > Libraries > Add External JARS... 를 누르고, 다운로드 받은 ojdbc8.jar 파일을 등록합니다.
등록하게 되면, 위그림처럼 Classpath에도 ojdbc8.jar 파일과 경로가 등록되고, 왼쪽 최하단 Referenced Libraries에도 함께 등록된 것을 확인할 수 있습니다.
이 jar파일을 확장해보면 다양한 클래스 파일이 있지만, 그 중에서 위쪽의 OracleDriver.class 파일을 활용할 것입니다.
간단하게, DML에 해당하는 SELECT, INSERT, UPDATE, DELETE 구문을 사용해보겠습니다.
SELECT
코드를 살펴보겠습니다. 먼저, final로 JDBC_DRIVER 파일 경로를 설정해줍니다. 그 다음 접속할 데이터 베이스 url을 지정해주는데 두 가지 방식이 있습니다.
본인 컴퓨터는 jdbc:oracle:thin:@localhost:1521:xe 로 입력해주고, 다른 곳에서 접속한다면 IP주소를 localhost 자리에 입력해줍니다. jdbc:oracle:thin:@IP주소:1521:xe 이렇게 됩니다.
계정 정보도 final 문을 사용해서 입력하고, 커넥션 변수와 쿼리 구문을 위한 변수(statement)를 선언 및 초기화해줍니다.
final String JDBC_DRIVER = "oracle.jdbc.driver.OracleDriver";
// 접속할 데이터 베이스 url 지정
final String DB_URL = "jdbc:oracle:thin:@localhost:1521:xe";
//다른 곳에서 접속하려면 IP주소를 입력해준다.
//final String DB_URL = "jdbc:oracle:thin:@IP주소:1521:xe";
//접속할 계정 정보
final String USER = "c##아이디";
final String PASSWORD = "비밀번호";
//커넥션 변수
Connection conn = null;
//쿼리 구문 변수 선언
Statement statement = null;
다음은 try~catch~finally 구문을 사용해서 SQL 문을 입력하게 됩니다. 핵심은 executeQuery(sql)을 통해 select를 수행할 수 있고, 그 외에 insert, update, delete는 executeUpdate(Sql) 문으로 수행합니다.
try {
//SQL 작성 해야 저 아래 SQLException 정상 작동
//jdbc 드라이버 클래스 로드
Class.forName(JDBC_DRIVER);
//데이터베이스 연결
conn = DriverManager.getConnection(DB_URL, USER, PASSWORD);
//SQL 쿼리 생성
statement = conn.createStatement();
//INSERT에서 추가한 8003번 임꺽정 학생 출력
String sql = "SELECT * FROM STUDENT WHERE SNO = '8003'";
//결과를 담아줄 ResultSet 변수 선언.
//select => executeQuery(sql);
//insert, update, delete => executeUpdate(sql);
ResultSet resultSet = statement.executeQuery(sql);
//결과 출력
while(resultSet.next()) {
String sno = resultSet.getString("sno");
String sname = resultSet.getString("sname");
System.out.println("학번 : " + sno + ", 이름 : " + sname);
}
//다 쓴 객체들 해제
resultSet.close();
statement.close();
conn.close();
} catch (SQLException se) {
System.out.println(se.getMessage());
} catch (Exception e) {
System.out.println(e.getMessage());
} finally {
if(statement != null){
try {
conn.close();
} catch (SQLException se) {
System.out.println(se.getMessage());
}
}
if(conn != null) {
try {
conn.close();
} catch (SQLException se) {
System.out.println(se.getMessage());
}
}
}
위 코드를 통해, sql에 쿼리문을 입력해서 쿼리를 실행하고, 나아가 위에서 언급한 executeQuery/Update 함수를 통해 영향받은 행의 수를 반환하고 정상 작동했는지 확인할 수 있습니다.
INSERT
이번에는 입력을 해보겠습니다. INSERT INTO table VALUES 구문을 사용할 수 있습니다. 차이가 나는 부분만 살펴보겠습니다. 입력을 할 때 중요한 점은 PreparedStatement라는 객체를 사용하는 것입니다. 준비된 선언이라는 뜻으로 들어갈 파라미터를 요구하며, 코드를 통해 자세히 살펴보겠습니다.
String sql = "INSERT INTO STUDENT "
+ " VALUES(?, ?, ?, ?, ?, ?)";
//PreparedStatement 객체 생성
pstmt = conn.prepareStatement(sql);
//들어갈 파라미터들 세팅
//파라미터 세팅은 물음표의 개수와 동일하게 설정
pstmt.setString(1, "8003");
pstmt.setString(2, "임꺽정");
pstmt.setString(3, "남");
pstmt.setInt(4, 1); //각 Type에 맞게 조정한다.
pstmt.setString(5, "생물");
pstmt.setDouble(6, 3.35);
//insert, delete, update는 결과로 영향받은 행의 개수를 리턴
int result = pstmt.executeUpdate(); //result 개수 나옴
if(result == 1) {
System.out.println("저장되었습니다.");
} else {
System.out.println("저장에 실패하였습니다.");
}
//다 쓴 객체들 해제
pstmt.close();
conn.close();
위 코드 중에서 눈에 띄는 부분이 ?가 들어간 INSERT INTO 구문입니다.
String sql = "INSERT INTO STUDENT VALUES(?, ?, ?, ?, ?, ?)"; 여기서 VALUES에 총 6개의 ?가 있으며 여기에 각각 하나씩 총 6개의 대응하는 파라미터를 입력해줍니다.
여기서는 pstmt.set타입(1 순서, values); 문구가 입력해주는 문장이 입력에 해당합니다. 또한, 이렇게 입력이 되었다면, 해당 insert 등의 결과로 영향을 받은 행의 수를 executeUpdate() 메소드로 구할 수 있으며 이것이 하나 이상이면 성공이고 아니면 실패했다는 것을 알리는 것이 좋습니다.
마지막으로 객체를 사용 완료하면 해제해주는 센스를 가집시다.
UPDATE
UPDATE도 INSERT와 동일하게 prepareStatement를 사용하며 ?의 개수만큼 파라미터를 입력해주면 됩니다.
//update sql 쿼리문
String sql = "UPDATE STUDENT"
+ " SET"
+ " AVR = ?"
+ " WHERE SNO = ?";
//PreparedStatement 객체 생성
pstmt = conn.prepareStatement(sql);
//들어갈 파라미터들 세팅
//파라미터 세팅은 물음표의 개수와 동일하게 설정
pstmt.setDouble(1, 1.45);
pstmt.setString(2, "8003");
DELETE
DELETE 역시 INSERT, UPDATE와 동일하게 파라미터를 입력하여 수행하면 됩니다. 사용 완료 후에 객체를 해제(close()) 해주면 완성입니다.
//DELETE sql 쿼리문
String sql = "DELETE FROM STUDENT WHERE SNO = ?";
//PreparedStatement 객체 생성
pstmt = conn.prepareStatement(sql);
//들어갈 파라미터들 세팅
//파라미터 세팅은 물음표의 개수와 동일하게 설정
pstmt.setString(1, "8003");
간단하게 SELECT, INSERT, UPDATE, DELETE 문을 OJDBC로 수행해보았습니다 .실제로 많이 사용하는 방식은 아니지만 고전적으로 사용했다고 하니 알아둬서 나쁠 것은 없어보입니다.
'네이버 클라우드 캠프 > Java' 카테고리의 다른 글
[Java] 스트림 (Stream) (0) | 2023.04.06 |
---|---|
[Java] 멀티스레드 (0) | 2023.04.06 |
[Java] 상수의 할당 (0) | 2023.03.29 |
[Java] enum 열거형 정리 (0) | 2023.03.29 |
[Java] Collections (0) | 2023.03.29 |