728x90
JDBC 라이브러리
- 자바는 데이터베이스(DB)와 연결해서 데이터 입출력 작업을 할 수있도록 JDBC 라이브러리(java.sql 패키지)를 제공합니다.
- JDBC는 데이터베이스 관리 시스템(DBMS)의 종류와 상관없이 동일하게 사용할 수 있는 클래스와 인터페이스로 구성되어 있습니다.

JDBC Driver
- JDBC 인터페이스를 구현한 것으로, DBMS마다 별도로 다운로드 받아 사용합니다.
- DriverManager 클래스 : JDBC Driver를 관리하며 DB와 연결해서 Connection 구현 객체를 생성
- Connection 인터페이스 : Statement, PreparedStatement, CallableStatement 구현 객체를 생성하며, 트랜잭션 처리 및 DB 연결을 끊을때 사용합니다.
DB의 트랜잭션 = 데이터베이스의 상태를 변화시키기 위해 수행하는 작업단위 = TCL => commit , rollback, savepoint...
- Statement 인터페이스 : SQL의 DDL과 DML 실행시 사용합니다.
- PreparedStatement : SQL의 DDL, DML문 실행시 사용하고, 매개변수화된 SQL문을 써서 편리성과 보안성이 유리합니다.
- CallableStatement : DB에 저장된 프로시저와 함수를 호출합니다.
- ResurltSet : DB에서 가져온 데이터를 읽습니다.

데이터베이스 연결
- 클라이언트 프로그램에서 DB와 연결하려면 DBMS의 JDBC DRIVER가 필요합니다.
- DBMS가 설치된 컴퓨터의 IP 주소
- DBMS가 허용하는 포트(PORT) 번호
- 사용자(DB 계정) 및 비밀번호
- 사용하고자 하는 DB 이름 필요

JDBC Driver 설치
- 로컬 PC에 Oracle을 설치하면 JDBC Driver 파일을 찾을수 있습니다.
-
(C:\Oracle\WINDOWS.X64_193000_db_home\jdbc\lib\ojdbc8.jar)
-
- 원격 PC에 Oracle을 설치하면 JDBC Driver만 별도로 다운로드
DB연결
- 필요한 라이브러리 파일을 해당 프로젝트에 lib 폴더 생성후 넣어주고, BuildPath를 사용해서 경로를 활성화 시켜줍니다.
- 추후 추가된 라이브러리 파일을 import해 주어야 합니다.
- Class.forName() 메소드는 문자열로 주어진 JDBC Driver 클래스를 BuildPath에서 찾고, JDBC Driver를 메모리로 로딩합니다.
Class.forName("oracle.jdbc.OracleDriver");
Connection conn = DriverManager.getConnection("연결 문자열", "사용자", "비밀번호");

package thisisjava;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class BoardWithFileInsertExam {
public static void main(String[] args) {
Connection conn = null;
try {
//JDBC Driver 등록
Class.forName("oracle.jdbc.OracleDriver");
//연결하기
conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.111.220:1521/orcl",
"java", "oracle");
//매개 변수화된 SQL문 작성
String sql = ""+
"INSERT INTO boards (bno, btitle, bcontent, bwriter, bdate,"
+ "bfilename, bfiledata)" + "values(SEQ_BNO.NEXTVAL, ?, ?, ?, SYSDATE, ?, ?)";
// PreparedStatement 얻기 및 값 지정
PreparedStatement pstmt = conn.prepareStatement(sql, new String[] {"bno"});
pstmt.setString(1, "눈 오는날");
pstmt.setString(2, "함박눈이 내려요");
pstmt.setString(3, "winter");
pstmt.setString(4, "snow.jpg");
pstmt.setBlob(5, new FileInputStream("src/thisisjava/image/snow.jpg"));
// SQL 문 실행
int rows = pstmt.executeUpdate(); //pstmt 실행하고 DB에 반영한 행의 개수를 반환
System.out.println("저장된 행 수 : " + rows);
// bno 값 얻기
if(rows == 1) {
ResultSet rs = pstmt.getGeneratedKeys();
if (rs.next()) {
int bno = rs.getInt(1);
System.out.println("저장된 bno: " + bno);
}
rs.close();
}
//PreparedStatement 닫기
pstmt.close();
}catch(Exception e){
e.printStackTrace();
}finally {
if(conn != null) {
try {
// 연결 끊기
conn.close();
}catch (SQLException e) {}
}
}
}
}
Insert를 이용해 user 테이블에 값 입력
package thisisjava;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.PreparedStatement;
public class UserInsertExam {
public static void main(String[] args) {
Connection conn = null;
try {
// JDBC Driver 등록
Class.forName("oracle.jdbc.OracleDriver");
// 연결하기
conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.111.220:1521/orcl"
+ "", "java", "oracle");
// 매개변수화된 SQL 문 작성
String sql = "" + "INSERT INTO users (userid, username, userpassword, userage,"
+ "useremail)" + "values(?, ?, ?, ?, ?)";
// PreparedStatment 얻기 및 값 지정
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "winter");
pstmt.setString(2, "한겨울");
pstmt.setString(3, "12345");
pstmt.setInt(4, 25);
pstmt.setString(5, "winter@mycompany.com");
//SQL 문 실행
int rows = pstmt.executeUpdate(); // pstmt 실행하고 DB에 반영한 행의 개수를 반환
System.out.println("저장된 행 수 : " + rows);
pstmt.close();
}catch(ClassNotFoundException e){
e.printStackTrace();
}catch(SQLException e){
e.printStackTrace();
}finally {
if(conn != null) {
try {
conn.close();
System.out.println("연결 끊기");
}catch(SQLException e) {}
}
}
}
}
Insert를 이용해 board에 파일 입력
package thisisjava;
import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class BoardWithFileInsertExam {
public static void main(String[] args) {
Connection conn = null;
try {
//JDBC Driver 등록
Class.forName("oracle.jdbc.OracleDriver");
//연결하기
conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.111.220:1521/orcl",
"java", "oracle");
//매개 변수화된 SQL문 작성
String sql = ""+
"INSERT INTO boards (bno, btitle, bcontent, bwriter, bdate,"
+ "bfilename, bfiledata)" + "values(SEQ_BNO.NEXTVAL, ?, ?, ?, SYSDATE, ?, ?)";
// PreparedStatement 얻기 및 값 지정
PreparedStatement pstmt = conn.prepareStatement(sql, new String[] {"bno"});
pstmt.setString(1, "눈 오는날");
pstmt.setString(2, "함박눈이 내려요");
pstmt.setString(3, "winter");
pstmt.setString(4, "snow.jpg");
pstmt.setBlob(5, new FileInputStream("src/thisisjava/image/snow.jpg"));
// SQL 문 실행
int rows = pstmt.executeUpdate(); //pstmt 실행하고 DB에 반영한 행의 개수를 반환
System.out.println("저장된 행 수 : " + rows);
// bno 값 얻기
if(rows == 1) {
ResultSet rs = pstmt.getGeneratedKeys();
if (rs.next()) {
int bno = rs.getInt(1);
System.out.println("저장된 bno: " + bno);
}
rs.close();
}
//PreparedStatement 닫기
pstmt.close();
}catch(Exception e){
e.printStackTrace();
}finally {
if(conn != null) {
try {
// 연결 끊기
conn.close();
}catch (SQLException e) {}
}
}
}
}
DELETE를 이용한 boards내용 삭제
package thisisjava;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class BoardDeleteExam {
public static void main(String[] args) {
Connection conn = null;
try {
// JDBC Driver 등록
Class.forName("oracle.jdbc.OracleDriver");
// 연결하기
conn = DriverManager.getConnection(
"jdbc:oracle:thin:@192.168.111.220:1521/orcl",
"java",
"oracle");
String sql = "DELETE FROM boards WHERE bwriter=?";
// PreparedStatement 열기 및 값 지정
PreparedStatement psmt = conn.prepareStatement(sql);
psmt.setString(1, "winter");
//SQL 실행
int rows = psmt.executeUpdate();
System.out.println("삭제된 행 수 : " + rows);
}catch(Exception e) {
e.printStackTrace();
}finally {
if(conn != null) {
try {
// 연결 끊기
conn.close();
}catch(SQLException e) {}
}
}
}
}
User 클래스 생성후 UserSelect를 해서 해당 튜플을 출력
package thisisjava;
import lombok.Data;
@Data // Constructor, Getter, Setter, hashoCode(), equals(), toString() 자동 생성
public class User {
private String userId;
private String userName;
private String userPassword;
private int userAge;
private String userEmail;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPassword() {
return userPassword;
}
public void setUserPassword(String userPassword) {
this.userPassword = userPassword;
}
public int getUserAge() {
return userAge;
}
public void setUserAge(int userAge) {
this.userAge = userAge;
}
public String getUserEmail() {
return userEmail;
}
public void setUserEmail(String userEmail) {
this.userEmail = userEmail;
}
@Override
public String toString() {
return "User [userId=" + userId + ", userName=" + userName + ", userPassword=" + userPassword + ", userAge="
+ userAge + ", userEmail=" + userEmail + "]";
}
}
package thisisjava;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class UserSelectExam{
public static void main(String[] args) {
Connection conn = null;
try {
Class.forName("oracle.jdbc.OracleDriver");
String url = "jdbc:oracle:thin:@192.168.111.220:1521/orcl";
String user1 = "java";
String passwd = "oracle";
//연결하기
conn = DriverManager.getConnection(url, user1, passwd);
// SQL 문 작성 : 1개의 값만 가져오기 (select)
String sql = "" +
"SELECT userid, username, userpassword, userage, useremail " +
"FROM users " +
"WHERE userid=?";
// PreparedStatement 열기 및 값 지정
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "winter");
// SQL 문 실행 후, ResultSet을 통해 데이터를 읽어 들이기
ResultSet rs = pstmt.executeQuery(); // 쿼리 실행후 결과 값을 resultset에 담아두기
if(rs.next()) { //결과값이 1개행이라 if : 결과값이 여러개 일경우 while문
User user = new User();
user.setUserId(rs.getString("userid"));
user.setUserName(rs.getString("username"));
user.setUserPassword(rs.getString("userpassword"));
user.setUserAge(rs.getInt(4)); // 컬럼 순번을 이용 4번째 컬럼을 가져와라
user.setUserEmail(rs.getString(5)); // 컬럼 순번을 이용 5번째 컬럼을 가져와라
System.out.println(user);
} else {
System.out.println("사용자 아이디가 존재하지 않음.");
}
rs.close();
pstmt.close();
} catch(Exception e) {
e.printStackTrace();
}finally {
if(conn != null) {
try {
//연결 끊기
conn.close();
}catch (SQLException e) {}
}
}
}
}
User [userId=winter, userName=한겨울, userPassword=12345, userAge=25, userEmail=winter@mycompany.com]
Board 클래스의 생성후 BoardSelect 클래스에서 여러 튜플을 불러오기
package thisisjava;
import java.sql.Blob;
import java.util.Date;
import lombok.Data;
@Data
public class Board {
private int bno;
private String btitle;
private String bcontent;
private String bwriter;
private Date bdate;
private String bfilename;
private Blob bfiledata;
public int getBno() {
return bno;
}
public void setBno(int bno) {
this.bno = bno;
}
public String getBtitle() {
return btitle;
}
public void setBtitle(String btitle) {
this.btitle = btitle;
}
public String getBcontent() {
return bcontent;
}
public void setBcontent(String bcontent) {
this.bcontent = bcontent;
}
public String getBwriter() {
return bwriter;
}
public void setBwriter(String bwriter) {
this.bwriter = bwriter;
}
public Date getBdate() {
return bdate;
}
public void setBdate(Date bdate) {
this.bdate = bdate;
}
public String getBfilename() {
return bfilename;
}
public void setBfilename(String bfilename) {
this.bfilename = bfilename;
}
public Blob getBfiledata() {
return bfiledata;
}
public void setBfiledata(Blob bfiledata) {
this.bfiledata = bfiledata;
}
@Override
public String toString() {
return "Board [bno=" + bno + ", btitle=" + btitle + ", bcontent=" + bcontent + ", bwriter=" + bwriter
+ ", bdate=" + bdate + ", bfilename=" + bfilename + ", bfiledata=" + bfiledata + "]";
}
}
package thisisjava;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class BoardSelectExam {
public static void main(String[] args) {
Connection conn = null;
try {
Class.forName("oracle.jdbc.OracleDriver");
String url = "jdbc:oracle:thin:@192.168.111.220:1521/orcl";
String user1 = "java";
String passwd = "oracle";
//연결하기
conn = DriverManager.getConnection(url, user1, passwd);
// SQL 문 작성 : 여러개의 결과값 가져오기 (select)
String sql = "" +
"SELECT bno, btitle, bcontent, bwriter, bdate, bfilename, bfiledata " +
"FROM boards " +
"WHERE bwriter=?";
// PreparedStatement 열기 및 값 지정
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, "winter");
// SQL 문 실행 후, ResultSet을 통해 데이터를 읽어 들이기
ResultSet rs = pstmt.executeQuery(); // 쿼리 실행후 결과 값을 resultset에 담아두기
// 쿼리결과를 board 클래스 객체에 넣어서 출력
while(rs.next()) {
Board board = new Board();
board.setBno(rs.getInt("bno"));
board.setBtitle(rs.getString("btitle"));
board.setBcontent(rs.getString("bcontent"));
board.setBwriter(rs.getString("bwriter"));
board.setBdate(rs.getDate("bdate"));
board.setBfilename(rs.getString("bfilename"));
board.setBfiledata(rs.getBlob("bfiledata"));
// 7개 항목을 출력
System.out.println(board);
// 데이터베이스의 파일을 객체 Board에 blob 형으로 저장된 것을 사용자 pc에 저장
Blob blob = board.getBfiledata(); /// board 객체에 있는 blob 파일을 Blob 객체로 변환
if(blob != null) {
InputStream is = blob.getBinaryStream();
OutputStream os = new FileOutputStream("C:/Temp/" + board.getBfilename());
is.transferTo(os);
os.flush();
os.close();
is.close();
}
}
rs.close();
pstmt.close();
} catch(Exception e) {
e.printStackTrace();
}finally {
if(conn != null) {
try {
//연결 끊기
conn.close();
}catch (SQLException e) {}
}
}
}
}
Board [bno=6, btitle=눈 오는 날, bcontent=함박눈이 내려요, bwriter=winter, bdate=2023-02-14, bfilename=snow.jpg, bfiledata=oracle.sql.BLOB@350aac89]
Board [bno=7, btitle=크리스마스, bcontent=메리 크리스마스, bwriter=winter, bdate=2023-02-14, bfilename=chrismas.jpg, bfiledata=oracle.sql.BLOB@196a42c3]728x90
'JAVA > Java 기초' 카테고리의 다른 글
| [도서후기] "나도 코딩의 자바 입문" - 간편하게 보기 좋은 개념서! (0) | 2025.11.21 |
|---|---|
| 데이터베이스 입출력-2(프로시저와 함수 호출).Java (0) | 2023.02.14 |
| TCP 채팅 프로그램.java (0) | 2023.02.01 |
| JSON 데이터형식.java (0) | 2023.02.01 |
| 서버의 동시 요청 처리.java (0) | 2023.02.01 |