Devlog
article thumbnail
Published 2022. 3. 23. 22:09
[Oracle] JDBC , DAO (Day13~14) 강의/KOSTA

위 글은 해당 카테고리의 수업 강의 자료를 정리한 것입니다. 

 

 

 

 

1. JDBC

 

1.1 개요

  • JDBC (Java Database Connectivity) 정의
    • 자바를 이용한 데이터베이스 접속과 SQL 문장의 실행, 실행 결과로 얻어진 데이터의 핸들링을 제공하는 방법과 절차에 관한 규약
    • 자바 프로그램 내에서 SQL 문을 실행하기 위한 자바 API
    • SQL과 프로그래밍 언어의 통합 접근 중 한 형태
  • 개발자를 위한 표준 인터페이스인 JDBC API와 데이터베이스 벤더 또는 기타 써드파티에서 제공하는 드라이버 (driver)

 

1.2 환경 구성

자바 프로젝트 생성시 JRE를 JavaSE-1.8로 설정해줘야 함

이클립스에서 프로젝트 우측 클릭 > properties > Java Build Path > Libraries (탭) > Add External JARs > ojdbc6.jar 선택

ojdbc6.jar
2.61MB
ojdbc6.jar 적용된 모습

 

 

1.3 활용 (Try-Catch문으로 작성해야함)

  • JDBC를 이용한 데이터베이스 연결 방법
    • import java.sql.*;
    • JDBC 드라이버 (Oracle) 로딩
    • Connection 얻어오기
    • SQL문 준비 / 바인딩 / 실행
    • 결과 처리
    • 자원 정리
// 0. import java.sql.*;

Connection conn = null; 
PreparedStatement pstmt = null; 
ResultSet rs = null;
try {
// 1. JDBC 드라이버 (Oracle) 로딩 

// 2. Connection 얻어오기

// 3. SQL문 준비 / 바인딩 / 실행 

// 4.결과처리

} catch (ClassNotFoundException e) { 
	System.out.println("error: 드라이버 로딩 실패 - " + e);
} catch (SQLException e) { 
	System.out.println("error:" + e);
} finally {

// 5. 자원정리

	try {
		if (rs != null) {
			rs.close(); 
        }
		if (pstmt != null) { 
        	pstmt.close();
        } 
		if (conn != null) {
			conn.close(); 
        }
	} catch (SQLException e) {
		System.out.println("error:" + e); 
   }
}

 

 

    • import
      • control + shift + o 로 자동 import
      • 붙여주기
        • import java.sql.Connection;
        • import java.sql.DriverManager;
        • import java.sql.PreparedStatement;
        • import java.sql.ResultSet;
        • import java.sql.SQLException;
    • JDBC 드라이버 (Oracle) 로딩
      • Class.forName("oracle.jdbc.driver.OracleDriver");
    • Connection 얻어오기
      • 예시 (로컬일 경우)
        • String url = "jdbc:oracle:thin:@localhost:1521:xe";
        • conn = DriverManager.getConnection(url, "webdb", "webdb")
      • 만약 로컬이 아니라면 Oracle ip와 포트번호, 서비스 아이디를 알아야함
    • SQL문 준비 / 바인딩 / 실행
      • INSERT / UPDATE / DELETE인 경우
        • int count = pstmt.executeUpdate();
      • SELECT인 경우
        • ResultSet rs = pstmt.executeQuery();
      • 상기 메소드가 다르기 때문에 유의해야 함
    • 결과 처리

rs.next()

 

  • 자원 정리
    • 역순으로 제거
if (rs != null) {
	rs.close();
}if (pstmt != null) {
	pstmt.close();
}if (conn != null) {
	conn.close();
}

 

 

 

 

 

 

 

2. DAO

 

앞으로 DAO를 별도로 만들고 어플리케이션을 분리할 예정

  • DAO (Data Access Object)
    • DB를 사용해 데이터를 조회하거나 조작하는 기능을 전담하도록 만든 오브젝트

어플리케이션 (흐름처리)

DAO (데이터 처리) 쿼리문 등등..

 

가운데 부분이 DAO 역할 (대상 테이블과 구조가 비슷함)

AuthorDao: 인터페이스 (마치 부모 클래스 같음), imprements가 구현됨

DB: 어떤 컬럼이 있는지 파악이 먼저, 컬럼과 같이 클래스와 변수 작성, 클래스명을 구분하기 위해 이름을 다르게 명명하길 권장

 

 

 

 

예제 코드 파악하기 (Author)

  • AuthorVo: getter, setter, 생성자 작성
  • AuthorDao: 인터페이스 작성
  • AuthorDaoImpl: 오라클 연결 및 sql문 작성, 메소드 작성
  • AuthorApp: 객체 생성, 메소드 호출

 

package author.dao;

public class AuthorVo {
	  private int author_id;
	  private String author_name;
	  private String author_desc;
	  
	  public int getAuthor_id() {
	    return author_id;
	  }
	  public void setAuthor_id(int author_id) {
	    this.author_id = author_id;
	  }
	  public String getAuthor_name() {
	    return author_name;
	  }
	  public void setAuthor_name(String author_name) {
	    this.author_name = author_name;
	  }
	  public String getAuthor_desc() {
	    return author_desc;
	  }
	  public void setAuthor_desc(String author_desc) {
	    this.author_desc = author_desc;
	  }
	  @Override
	  public String toString() {
	    return "AuthorVo [author_id=" + author_id + ", author_name=" + author_name + ", author_desc=" + author_desc + "]";
	  }
	  
	  public AuthorVo(int author_id, String author_name,String author_desc) {
	    super();
	    this.author_id = author_id;
	    this.author_name = author_name;
	    this.author_desc = author_desc;
	  }
	  public AuthorVo() {
	    // TODO Auto-generated constructor stub
	  }
	  
}

 

package author.dao;

import java.util.List;

import author.dao.AuthorVo;
import author.dao.BookVo;

public interface AuthorDao {
  public List<AuthorVo> select() ;

  public List<AuthorVo> getList();
  public AuthorVo get(String id);
  public boolean insert(AuthorVo authorVo);
  public boolean delete(Long id);
  public boolean update(AuthorVo authorVo);

}
package author.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import author.dao.AuthorVo;
import author.dao.BookVo;

public class AuthorDaoImpl implements AuthorDao{
  
  private Connection getConnection() throws SQLException {
    Connection conn = null;
    try {
      Class.forName("oracle.jdbc.driver.OracleDriver");
      String dburl = "jdbc:oracle:thin:@localhost:1521:xe";
      conn = DriverManager.getConnection(dburl, "webdb", "1234");
    } catch (ClassNotFoundException e) {
      System.err.println("JDBC 드라이버 로드 실패!");
    }
    return conn;
  }
  
  @Override
  public List<AuthorVo> getList() {
    Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null;
    //  데이터 전송을 위한 리스트
    List<AuthorVo> list = new ArrayList<>();
    
    try {
      conn = getConnection();
      stmt = conn.createStatement();
      String sql = " SELECT author_id, author_name, author_desc " 
                 + " FROM author "
                 + " order by author_id ";
      
      rs = stmt.executeQuery(sql);
      
      while(rs.next()) {
        AuthorVo authorVO = new AuthorVo(
            rs.getInt(1),
            rs.getString(2),
            rs.getString(3)
            );
        list.add(authorVO);
      }
    } catch (SQLException e) {
      System.err.println("ERROR:" + e.getMessage());
    }
    
    return list;
  }

  @Override
  public AuthorVo get(String id) {
    Connection conn = null;
    PreparedStatement pstmt = null;
    AuthorVo authorVo = null;
    ResultSet rs = null;
    
    try {
      conn = getConnection();
      String sql = " SELECT author_id, " +
                   " author_name, author_desc " +
                   " FROM author " +
                   " WHERE author_id=?";
      pstmt = conn.prepareStatement(sql);
      pstmt.setInt(1, Integer.parseInt(id)); // 바인딩
      
      rs = pstmt.executeQuery();
      
      if (rs.next()) {
        authorVo = new AuthorVo(
            rs.getInt(1),
            rs.getString(2),
            rs.getString(3)
            );
      }
    } catch (SQLException e) {
      System.err.println("ERROR:" + e.getMessage());
    } finally {
      try {
        if (rs != null) rs.close();
        if (pstmt != null) pstmt.close();
        if (conn != null) conn.close();
      } catch (Exception e) {
        System.err.println("ERROR:" + e.getMessage());
      }
    }
    return authorVo;
  }

  @Override
  public boolean insert(AuthorVo authorVo) {
    Connection conn = null;
    PreparedStatement pstmt = null;
    int insertedCount = 0;
    
    try {
      conn = getConnection();
      String sql = "INSERT INTO author " +
          "VALUES(SEQ_AUTHOR_ID.NEXTVAL, " +
          "?, ?)";
      pstmt = conn.prepareStatement(sql);
      pstmt.setString(1, authorVo.getAuthor_name());
      pstmt.setString(2, authorVo.getAuthor_desc());
      
      insertedCount = pstmt.executeUpdate();
    } catch (SQLException e) {
      System.err.println("ERROR:" + e.getMessage());
    } finally {
      try {
        if (pstmt != null) pstmt.close();
        if (conn != null) conn.close();
      } catch (Exception e) {
        System.err.println("ERROR:" + e.getMessage());
      }
    }
    return insertedCount == 1;
  }

  @Override
  public boolean delete(Long id) {
    Connection conn = null;
    PreparedStatement pstmt = null;
    int deletedCount = 0;
    
    try {
      conn = getConnection();
      String sql = "DELETE FROM author WHERE author_id=?";
      pstmt = conn.prepareStatement(sql);
      pstmt.setLong(1, id);
      
      deletedCount = pstmt.executeUpdate();
    } catch (SQLException e) {
      System.err.println("ERROR:" + e.getMessage());
    } finally {
      try {
        if (pstmt != null) pstmt.close();
        if (conn != null) conn.close();
      } catch (Exception e) {
        System.err.println("ERROR:" + e.getMessage());
      }
    }
    return deletedCount == 1;
  }

  @Override
  public boolean update(AuthorVo authorVo) {
    Connection conn = null;
    PreparedStatement pstmt = null;
    int updatedCount = 0;
    
    try {
      conn = getConnection();
      String sql = "UPDATE AUTHOR SET " +
          "author_name=?, author_desc=? " +
          "WHERE author_id=?";
      pstmt = conn.prepareStatement(sql);
      pstmt.setString(1, authorVo.getAuthor_name());
      pstmt.setString(2, authorVo.getAuthor_desc());
      pstmt.setInt(3, authorVo.getAuthor_id());
      
      updatedCount = pstmt.executeUpdate();
    } catch (SQLException e) {
      System.err.println("ERROR:" + e.getMessage());
    } finally {
      try {
        if (pstmt != null) pstmt.close();
        if (conn != null) conn.close();
      } catch (Exception e) {
        System.err.println("ERROR:" + e.getMessage());
      }
    }
    return 1 == updatedCount;
  }

  @Override
  public List<AuthorVo> select() {
    // TODO Auto-generated method stub
    return getList();
  }
}
package author.dao;

import java.util.List;

public class AuthorApp {

  public static void main(String[] args) {
    // 인터페이스 레퍼런스 변수에 구현클래스의 객체 만들기
    AuthorDao dao = new AuthorDaoImpl();
    
    AuthorVo in_vo = new AuthorVo();
    AuthorVo up_vo = new AuthorVo();
    
    long author_id = 0;
    
    // 1. 만들어진 객체의 select() 호출
    List<AuthorVo> list = dao.select();
    
    // for each 문으로 모든 데이터 출력
    for(AuthorVo p_vo : list) {
      System.out.println(p_vo);
    }
    
    // 2. 만들어진 객체의 insert() 호출
    in_vo.setAuthor_id(25);
    in_vo.setAuthor_name("test");
    in_vo.setAuthor_desc("testtt");
    
    dao.insert(in_vo);
    
    
    // 3. 만들어진 객체의 update() 호출
    up_vo.setAuthor_name("test");
    up_vo.setAuthor_desc("test");
    up_vo.setAuthor_id(25);
    
    dao.update(up_vo);
    
    // 4. 만들어진 객체의 delete() 호출
    author_id = 25;
    
    dao.delete(author_id);
    

  }

}

 

 

 

예제를 참고하며 작성해보기 (Book)

  • BookVo
  • BookDao
  • BookDaoImpl
  • BookApp
package author.dao;

public class BookVo {

	private int book_id;
	private String title;
	private String pubs;
	private String pub_date;
	private int author_id;
	private String author_name;
	
	public int getBook_id() {
		return book_id;
	}
	public void setBook_id(int book_id) {
		this.book_id = book_id;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getPubs() {
		return pubs;
	}
	public void setPubs(String pubs) {
		this.pubs = pubs;
	}
	public String getPub_date() {
		return pub_date;
	}
	public void setPub_date(String pub_date) {
		this.pub_date = pub_date;
	}
	public int getAuthor_id() {
		return author_id;
	}
	public void setAuthor_id(int author_id) {
		this.author_id = author_id;
	}
	
	
	public String getAuthor_name() {
		return author_name;
	}
	public void setAuthor_name(String author_name) {
		this.author_name = author_name;
	}
	
	@Override
	public String toString() {
		return "BookVo [book_id=" + book_id + ", title=" + title + ", pubs=" + pubs + ", pub_date=" + pub_date
				+ ", author_id=" + author_id + ", author_name=" + author_name + "]";
	}
	
	
	public BookVo(int book_id, String title, String pubs, String pub_date, int author_id) {
		super();
		this.book_id = book_id;
		this.title = title;
		this.pubs = pubs;
		this.pub_date = pub_date;
		this.author_id = author_id;
	}
	
	public BookVo() {
		
	}
	public BookVo(int book_id, String title, String pubs, String pub_date, int author_id, String author_name) {
		// TODO Auto-generated constructor stub
		super();
		this.book_id = book_id;
		this.title = title;
		this.pubs = pubs;
		this.pub_date = pub_date;
		this.author_id = author_id;
		this.author_name = author_name;
		
	}

	
}

 

package author.dao;

import java.util.List;

import author.dao.AuthorVo;
import author.dao.BookVo;

public interface BookDao {
  public List<BookVo> select() ;
  
  List<BookVo> getList();
  public List<BookVo> getList(String text);
  public BookVo get(String id);
  public boolean insert(BookVo authorVo);
  public boolean delete(Long id);
  public boolean update(BookVo authorVo);

}

 

package author.dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import author.dao.AuthorVo;
import author.dao.BookVo;

public class BookDaoImpl implements BookDao{
  
  private Connection getConnection() throws SQLException {
    Connection conn = null;
    try {
      Class.forName("oracle.jdbc.driver.OracleDriver");
      String dburl = "jdbc:oracle:thin:@localhost:1521:xe";
      conn = DriverManager.getConnection(dburl, "webdb", "1234");
    } catch (ClassNotFoundException e) {
      System.err.println("JDBC 드라이버 로드 실패!");
    }
    return conn;
  }
  
  @Override
  public List<BookVo> getList() {
    Connection conn = null;
    Statement stmt = null;
    ResultSet rs = null;
    //  데이터 전송을 위한 리스트
    List<BookVo> list = new ArrayList<>();
    
    try {
      conn = getConnection();
      stmt = conn.createStatement();
      String sql = " SELECT book_id, title, pubs, pub_date, author_id " 
                 + " FROM book "
                 + " order by book_id ";
      
      rs = stmt.executeQuery(sql);
      
      while(rs.next()) {
        BookVo bookVO = new BookVo(
            rs.getInt(1),
            rs.getString(2),
            rs.getString(3),
            rs.getString(4),
            rs.getInt(5)
            );
        list.add(bookVO);
      }
    } catch (SQLException e) {
      System.err.println("ERROR:" + e.getMessage());
    }
    
    return list;
  }

  @Override
  public BookVo get(String id) {
    Connection conn = null;
    PreparedStatement pstmt = null;
    BookVo bookVo = null;
    ResultSet rs = null;
    
    try {
      conn = getConnection();
      String sql = " SELECT book_id, title, pubs" +
                   " pub_dateauthor_desc, author_id " +
                   " FROM book " +
                   " WHERE author_id=?";
      pstmt = conn.prepareStatement(sql);
      pstmt.setInt(1, Integer.parseInt(id)); // 바인딩
      
      rs = pstmt.executeQuery();
      
      if (rs.next()) {
        bookVo = new BookVo(
            rs.getInt(1),
            rs.getString(2),
            rs.getString(3),
            rs.getString(4),
            rs.getInt(5)
            );
      }
    } catch (SQLException e) {
      System.err.println("ERROR:" + e.getMessage());
    } finally {
      try {
        if (rs != null) rs.close();
        if (pstmt != null) pstmt.close();
        if (conn != null) conn.close();
      } catch (Exception e) {
        System.err.println("ERROR:" + e.getMessage());
      }
    }
    return bookVo;
  }

  @Override
  public boolean insert(BookVo bookVo) {
    Connection conn = null;
    PreparedStatement pstmt = null;
    int insertedCount = 0;
    
    try {
      conn = getConnection();
      String sql = "INSERT INTO book " +
          "VALUES(SEQ_BOOK_ID.NEXTVAL, " +
          "?, ?, ?, ?)";
      pstmt = conn.prepareStatement(sql);
      pstmt.setString(1, bookVo.getTitle());
      pstmt.setString(2, bookVo.getPubs());
      pstmt.setString(3, bookVo.getPub_date());
      pstmt.setInt(4, bookVo.getAuthor_id());
      
      insertedCount = pstmt.executeUpdate();
    } catch (SQLException e) {
      System.err.println("ERROR:" + e.getMessage());
    } finally {
      try {
        if (pstmt != null) pstmt.close();
        if (conn != null) conn.close();
      } catch (Exception e) {
        System.err.println("ERROR:" + e.getMessage());
      }
    }
    return insertedCount == 1;
  }

  @Override
  public boolean delete(Long id) {
    Connection conn = null;
    PreparedStatement pstmt = null;
    int deletedCount = 0;
    
    try {
      conn = getConnection();
      String sql = "DELETE FROM book WHERE author_id=?";
      pstmt = conn.prepareStatement(sql);
      pstmt.setLong(1, id);
      
      deletedCount = pstmt.executeUpdate();
    } catch (SQLException e) {
      System.err.println("ERROR:" + e.getMessage());
    } finally {
      try {
        if (pstmt != null) pstmt.close();
        if (conn != null) conn.close();
      } catch (Exception e) {
        System.err.println("ERROR:" + e.getMessage());
      }
    }
    return deletedCount == 1;
  }

  @Override
  public boolean update(BookVo bookVo) {
    Connection conn = null;
    PreparedStatement pstmt = null;
    int updatedCount = 0;
    
    try {
      conn = getConnection();
      String sql = "UPDATE BOOK SET " +
          "title=?, pubs=? " +
          "WHERE author_id=?";
      pstmt = conn.prepareStatement(sql);
      pstmt.setString(1, bookVo.getTitle());
      pstmt.setString(2, bookVo.getPubs());
      pstmt.setInt(3, bookVo.getAuthor_id());
      
      updatedCount = pstmt.executeUpdate();
    } catch (SQLException e) {
      System.err.println("ERROR:" + e.getMessage());
    } finally {
      try {
        if (pstmt != null) pstmt.close();
        if (conn != null) conn.close();
      } catch (Exception e) {
        System.err.println("ERROR:" + e.getMessage());
      }
    }
    return 1 == updatedCount;
  }

  public List<BookVo> getList(String text) {
    Connection conn = null;
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    //  데이터 전송을 위한 리스트
    List<BookVo> list = new ArrayList<>();
    
    try {
      conn = getConnection();
      
      String sql = 
          " SELECT b.book_id, \r\n" + 
          "        b.title, \r\n" + 
          "        b.pubs, \r\n" + 
          "        to_char( b.pub_date,'YYYY-MM-DD'), \r\n" + 
          "        a.author_id,\r\n" + 
          "        a.author_name\r\n"+
          " FROM author a, book b\r\n" + 
          " where a.author_id = b.author_id\r\n" + 
          " and (b.title || b.pubs || a.author_name) LIKE '%'|| ? ||'%' ";
      pstmt = conn.prepareStatement(sql);
      pstmt.setString(1, text);// 바인딩
      rs = pstmt.executeQuery();
      
      while(rs.next()) {
        BookVo vo = new BookVo(
        		rs.getInt(1),
                rs.getString(2),
                rs.getString(3),
                rs.getString(4),
                rs.getInt(5),
                rs.getString(6)
                );
        list.add(vo);
      }
    } catch (SQLException e) {
      System.err.println("ERROR:" + e.getMessage());
    }
    
    return list;
  }

  @Override
  public List<BookVo> select() {
    // TODO Auto-generated method stub
    return getList();
  }
}

 

package author.dao;

import java.util.List;
import java.util.Scanner;

public class BookApp {

  public static void main(String[] args) {
    // 인터페이스 레퍼런스 변수에 구현클래스의 객체 만들기
	BookDao dao = new BookDaoImpl();
    
    BookVo in_vo = new BookVo();
    BookVo up_vo = new BookVo();
    
//    long author_id = 0;
    
    Scanner sc = new Scanner(System.in);
    
    // 1. 만들어진 객체의 select() 호출
    
    List<BookVo> list = dao.select();
    
    // for each 문으로 모든 데이터 출력
    System.out.println("보유하고 있는 책 목록");
    for(BookVo p_vo : list) {
      System.out.println(p_vo);
    }
    
   
    
    // 2. 만들어진 객체의 insert() 호출
    in_vo.setTitle("test");
    in_vo.setPubs("test");
    in_vo.setPub_date("20220305");
    in_vo.setAuthor_id(1);
    
    dao.insert(in_vo);
    
    System.out.println("insert");
    for(AuthorVo p_vo : list) {
        System.out.println(p_vo);
      }
    
    // 3. 만들어진 객체의 update() 호출
    up_vo.setTitle("test22");
    up_vo.setPubs("test22");
    up_vo.setAuthor_id(1);
    
    dao.update(up_vo);
    
    System.out.println("update");
    for(AuthorVo p_vo : list) {
        System.out.println(p_vo);
      }
    
    // 4. 만들어진 객체의 delete() 호출
    author_id = 1;
    
    dao.delete(author_id);
    
    System.out.println("delete");
    for(AuthorVo p_vo : list) {
        System.out.println(p_vo);
      }
    
    // 검색하기
    System.out.print("키워드를 입력해주세요: ");
    String input = sc.nextLine();
    for(BookVo p_vo : dao.getList(input)) {
        System.out.println(p_vo);
      }
    
    
  }

}

'강의 > KOSTA' 카테고리의 다른 글

[Web] JavaScript (Day16~17)  (0) 2022.03.27
[Web] Web programming outline (Day15)  (0) 2022.03.27
[Oracle] DCL / DDL / DML (Day12)  (0) 2022.03.21
[Oracle] SubQuery & rownum (Day12)  (0) 2022.03.21
[Oracle] Group Function & JOIN (Day10)  (0) 2022.03.20
profile

Devlog

@덩이

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!

검색 태그