JAVA/Java 기초

데이터베이스 입출력(Database I/O).Java

john_ 2023. 2. 13. 20:08
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가 필요합니다.
    1. DBMS가 설치된 컴퓨터의 IP 주소
    2. DBMS가 허용하는 포트(PORT) 번호
    3. 사용자(DB 계정) 및 비밀번호
    4. 사용하고자 하는 DB 이름 필요

 


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