프로그래밍 언어/데이터베이스
데이터베이스 Day5 - Java + DB 연동(1)
by Hyeon_
2021. 11. 24.
Java + DB 연동
JDBC(Java Database Connectivity)
- 다양한 종류의 관계형 데이터베이스에 접근할 때 사용되는 자바 표준 SQL 인터페이스
- 자바 프로그램이 DBMS에 접근하여 작업할 수 있게 해주는 API를 제공하는 클래스 모음
- 모든 DBMS에서 공통적으로 사용할 수 있는 인터페이스와 클래스로 구성
- 실제 구현 클래스는 각 DBMS 벤더가 구현했기 때문에 거의 모든 벤더가 JDBC 드라이버 제공
- 각 DBMS에 맞는 JDBC 드라이버 사용
JDBC 드라이버
- JDBC 인터페이스를 구현한 클래스 파일 모음(jar 파일)
- 각 DBMS 벤더에서 제공되는 구현 클래스
JDBC의 역할
- 응용프로그램과 DBMS 사이에서 연결역할
- SQL문을 DBMS에 전달하고 그 결과값을 응용프로그램에 전달하는 역할
JDBC 사용 시의 장점
- 사용하는 RDBMS에 독립적인 프로그래밍 가능
- 쉽게 RDBMS의 교체가 가능
- 자바에서는 단순히 문자열로 쿼리 전달, 해석은 각 벤더가 구현한 드라이버가 담당
- 표준 SQL 뿐만 아니라 각 JDBC Driver를 제공하는 DBMS 벤더별로 최적의 성능 발휘 가능
- 벤더 종속적인 SQL도 처리 가능
MySQL JDBC 드라이버 다운로드
- MySQL Communitiy Download : Connector/J
- Platform Independent 선택
- mysql-connector-java-8.0.27.zip [Download]
MySQL JDBC 드라이버 사용하기 위한 작업
- 압축 해제하고 jar 파일 복사해서 lib 폴더에 저장
- mysql-connector-java-8.0.27.zip 압축해제
- mysql-connector-java-8.0.27.jar 복사해서 D:\hyeonji\JAVA\lib폴더에 저장
- 이클립스 자바 프로젝트 생성하고 Java Build Path에 라이브러리 추가
- 이클립스에 JavaProject 생성: DBTest
- Properties
- Java Build Path
- Libraries 탭
- ModulePath에서 [Add External JARS..] 선택
- mysql-connector-java-8.0.27.jar 찾아서 선택
JDBC를 이용한 연결 과정
- 드라이버 로드
- Connection 객체 생성
- Statement 또는 PreparedStatement 생성
- 쿼리 수행 (sql문 실행)
- SQL 문에 결과 반환이 있는 경우 ResultSet 객체 생성(결과 받아옴)
- 모든 객체 close() : 반환 순서
- ResultSet
- Statement
- Connection (접속 종료)
패키지 import
- JDBC는 java.sql 패키지에 포함되어 ㅣㅇㅆ음
- import는 java.sql.DriverManager;
- import java.sql.Connection; ....
- JDBC는 데이터베이서 접속 위해 한 개의 클래스 java.sql.DriverManager와 두 개의 인터페이스(java.sql.Driver / java.sql.Connection) 사용
1. JDBC 드라이버 로드
- Java에서 MySQL Driver 사용하기 위해 드라이버를 JVM에 로딩하는 과정
- Class.forName("com.mysql.cj.jdbc.Driver");
2. Connection 객체 생성
- DriverManager 클래스의 static 메서드인 getConnection( )메서드를 이용해서 Connection 객체 얻어옴
- MySQL 서버 실제 연결
- Connection 객체가 생성되면 DBMS 접속 성공
- DriverManager.getConnection(String url, String user, String password)
// 연결 주소, 사용자 계정, 패스워드 문자열로 설정
String url = "jdbc:mysql://localhost:3306/sqldb6?serverTimezone=UTC";
String user = "root";
String pwd = "1234";
Connection con = DriverManager.getConnection(url,uwer,pwd);
- jdbcLmysql: JDBC 드라이버
- jdbc: JDBC URL의 프로토콜 이름
- mysql: MySQL JDBC 드라이버
- localhost: MySQL이 설치된 IP(호스트 이름)
- localhost 또는 127.0.0.1: 내 컴퓨터
- 192.168.172.1: 서버IP (현재 내 컴퓨터의 Workbench에서 서버 접속해서 사용)
- 3306: MySQL 접속 포트
- sqldb6: 사용하는 데이터베이스 이름
- serverTimezone = UTC
3. Ststement 객체 생성
- 쿼리문 전송을 위한 Statement 객체 생성
- 또는 PreparedStatement
- Connection 인터페이스의 createStatement( ) 메서드를 사용해서 객체 생성
- PreparedStatement pstmt = con.preparedStatement(sql);
- PreparedStatement 객체를 통해 SQL 전송 가능
4. 쿼리 수행
- SQL 전송에 사용되는 메서드
- excuteQuery( ) / excuteUpdate( )
- 2가지로 구분하는 이유: sql 문 실행 결과가 다르기 때문
- excuteUpdate()
- 쿼리문이 insert / update / delete 구문인 경우 사용
- 영향을 받은 행의 수 반환
- excuteQuery( )
- select 구문의 경우
- ResultSet 객체로 변환(select문 결과에 해당되는 여러 행 반환)
- ResultSet에서 데이터 추출
- next( ) 메서드를 이용해서 논리적 커서를 이동해가며 각 열의 데이터를 바인딩해옴
- rs.next( ) 호출 결과 true이면 반복해서 다음 행 데이터 가져옴
- cursor: 다음 열로 이동
- next( ): 다음 행으로 이동
- 정수: getInt("bookPrice");
- 문자: getString("bookName");
6. 모든 객체 close( ): 자원 반납
- ResultSet
- Statement
- Connection(접속 종료)
실습
- DBProject
- DBConnect.java : DB 연결
- BookSelectEx.java : DB 연결+ 해당 작업 수행
- BookInsertEx.java : DB 연결+ 해당 작업 수행
- BookInputInsert.java : DB 연결+ 해당 작업 수행
- BookUpdateEx.java : DB 연결+ 해당 작업 수행
- BookDeleteEx.java : DB 연결+ 해당 작업 수행
- 프로젝트명: DBTest
- 패키지명: db1
- 클래스
- DBConnecton.java
- BookInsertEX.java
package db1;
import java.sql.Connection;
import java.sql.DriverManager;
public class DBConnet {
public static void main(String[] args) {
try {
//JDBC Driver 클래스의 객체 생성 런타임시 로드
Class.forName("com.mysql.cj.jdbc.Driver");
// 연결 주소, 사용자 계정, 패스워드 문자열 설정
String url = "jdbc:mysql://localhost:3306/sqldb3?serverTimezone=UTC";
String user = "root";
String pwd = "1234";
// DB 연결하기 위한 객체 생성
// DriverManager를 통해 Connection 객체 생성
// MySQL 서버 연결 : 주소, 사용자 계정, 패스워드 전송
Connection con = DriverManager.getConnection(url, user, pwd);
// Connection 객체가 생성되면 DB 연결 성공
if(con != null) {
System.out.println("DB 연결 성공!");
}
} catch (Exception e) {
System.out.println("오류 발생!");
e.printStackTrace();
}
}
}
package db1;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Date;
public class BookSelectEx {
public static void main(String[] args) {
try {
//JDBC Driver 클래스의 객체 생성 런타임시 로드
Class.forName("com.mysql.cj.jdbc.Driver");
// 연결 주소, 사용자 계정, 패스워드 문자열 설정
String url = "jdbc:mysql://localhost:3306/sqldb3?serverTimezone=UTC";
String user = "root";
String pwd = "1234";
// DB 연결하기 위한 객체 생성
// DriverManager를 통해 Connection 객체 생성
// MySQL 서버 연결 : 주소, 사용자 계정, 패스워드 전송
Connection con = DriverManager.getConnection(url, user, pwd);
// Connection 객체가 생성되면 DB 연결 성공
if(con != null) {
System.out.println("DB 연결 성공!");
}
// DB 연결 성공 후 SELECT 작업
// SELECT 쿼리문 문자열 생성
String sql = "select * from book order by bookNo";
// 쿼리문 전송을 위한 PreparedStatement 객체 생성
// Connection 인터페이스의 prepareStatement() 메소드를 사용하여 객체 생성
PreparedStatement pstmt = con.prepareStatement(sql);
// 쿼리문 실행시키고 결과 받아옴
// select 구문이므로 excuteQuery() 메소드 사용
// 반환되는 결과는 ResultSet 객체가 받음
ResultSet rs = pstmt.executeQuery(sql);
// 제목 출력
System.out.println("\n도서 정보 조회");
System.out.println("도서번호 \t\t\t 도서명 \t\t\t\t\t\t 저자 \t\t 가격 \t\t 발행일 \t 재고 \t 출판사번호");
// executeQuery() 실행 결과 받아온 ResultSet에서 데이터 추출
// ResultSet의 next() 메서드를 이용해서 논맂거 커서를 이동해 각 열의 데이터 바인딩해옴
// next(): 커서를 이동하면 다ㅡㅇㅁ 행 지정
// 다음 행이 있으면 true, 없으면 false 반환
while(rs.next()) {
// (1) 한 행씩 next 하면서 데이터를 가져와 변수에 저장
String bookNo = rs.getString(1);
String bookName = rs.getString(2);
String bookAuthor = rs.getString(3);
int bookPrice = rs.getInt(4);
Date bookData = rs.getDate(5);
int bookStock = rs.getInt(6);
String pubNo = rs.getString(7);
// (2) 한 행씩 변수 출력
System.out.format("%-10s\t %-25s\t %-5s %10d %13s \t%3d %10s\n",
bookNo, bookName, bookAuthor, bookPrice, bookData, bookStock, pubNo);
}
// 모든 객체 close
rs.close();
pstmt.close();
con.close();
} catch (Exception e) {
System.out.println("오류 발생!");
e.printStackTrace();
}
}
}