위 글은 해당 카테고리의 수업 강의 자료를 정리한 것입니다.
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
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();
- 상기 메소드가 다르기 때문에 유의해야 함
- INSERT / UPDATE / DELETE인 경우
- 결과 처리
- 자원 정리
- 역순으로 제거
if (rs != null) {
rs.close();
}if (pstmt != null) {
pstmt.close();
}if (conn != null) {
conn.close();
}
2. DAO
앞으로 DAO를 별도로 만들고 어플리케이션을 분리할 예정
- DAO (Data Access Object)
- DB를 사용해 데이터를 조회하거나 조작하는 기능을 전담하도록 만든 오브젝트
어플리케이션 (흐름처리)
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 |