Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

기록 저장소

JDBC 본문

kitri 노트/java

JDBC

resault 2019. 4. 9. 21:10

- java.sql : JDBC 1.0 / javax.sql : JDBC 2.0

 

 

* JDBC 작업순서

1. Driver Looading : 각 DB 벤더에서 만든 class들을 압축해놓은 jar 파일(driver)을 load

2. DB연결 → Connection : ip, port, sID, id, password를 통해 DB에 접속

3. SQL 실행 준비 → Statment / PreparedStatment

4. SQL 실행

    4-1. DML

    4-2. Select → ResultSet

5. DB 접속 종료 : 연결의 역순으로 종료 (R, S, C)

 

* jdbc driver 종류 : 4가지   (but, Type4인 thin을 가장 많이 사용함)

 

 

* jdbc driver 설정 3가지 방법

- ext 폴더 안에 jar파일 넣기 : 

- classpath에 추가

- 이클립스에서 buildpath설정

 

* odbc driver를 사용할때는 id, password없음

 

 

 

 

 

* JDBC(Java DataBase Connectivity)

: 자바와 DBMS를 연결하는 자바 API로서, 대부분이 인터페이스로 구성되어있다.

 

* JDBC Driver

: 각 DB벤더에서 위의 JDBC를 구현해놓은 클래스이며, 이를 로드하기 위하여 Class의 static method인 forName(String className)를 사용한다.

이때 argument로 각 driverName을 입력하며, Oracle의 경우 "oracle.jdbc.driver.OracleDriver"로 지정되어 있다.

 

 

 

 

 

 

 

* driver 로드 및 DB연결 예제

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JdbcTest1 {
    
    Connection connection;
    Statement statement;
    ResultSet resultSet;
    
    String driverName = "oracle.jdbc.driver.OracleDriver"; //드라이버명
    String url = "jdbc:oracle:thin:@localhost:1521:orcl"; //Oracle 접속경로
    String user = "kitri";
    String pw = "kitri";
    
    public JdbcTest1() {
    
        try {
            //------------------------------------------------------------로드
            Class.forName(driverName);

            //------------------------------------------------------------연결
            connection = DriverManager.getConnection(url, user, pw); //getConnectio() : DriverManager의 static method. Connection을 반환.
            System.out.println("연결");
        } catch (ClassNotFoundException e) {
            System.out.println("[로드 오류]\n" + e.getStackTrace());
        } catch (SQLException e) {
            System.out.println("[연결 오류]\n" + e.getStackTrace());
        }
    }
   
    public void close() {
            try {
                if(resultSet != null)
                    resultSet.close();
                if(statement != null)
                    statement.close();
                if(connection != null)
                    connection.close();
            } catch (SQLException e) {
                System.out.println("[닫기 오류]\n" + e.getStackTrace());
            }
    }
    
    public static void main(String[] args) {
        JdbcTest1 j = new JdbcTest1();
        j.close();        
    }
}

 

 

* Statment 예제

 

- insert, update, delete : Statement의 executeUpdate() 메소드 활용

public static void main(String[] args) {
	String name = "홍길동";
	String id = "hong";
	Connection conn = null;
	Statement stmt = null;
	int cnt = 0;
	try {
	
		conn = it.makeConnection();
		String sql = "";
		sql += "insert into jdbctest (no, name, id, joindate) \n";
		sql += "values (jdbctest_no_seq.nextval, '" + name + "', '" + id + "', sysdate)";
		stmt = conn.createStatement();
		cnt = stmt.executeUpdate(sql); // 실행된 row수를 int로 반환함
		
	} catch (SQLException e) {
		e.printStackTrace();
	} finally {
		try {
			if(stmt != null)
				stmt.close();
			if(conn != null)
				conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
		
	}
}

 

- select : Statement의 executeQuery() 메소드 활용  (ResultSet을 반환함)

- ResultSet 경우의 수 3가지

  1. 무조건 1개의 결과 : rs.next()
  2. 0 또는 1개의 결과 : if(rs.next())
  3. 0개 이상의 결과 : while(rs.next())
public List<MemberDto> memberList(String searchName) {
	List<MemberDto> list = new ArrayList<MemberDto>();
	Connection conn = null;
	Statement stmt = null;
	ResultSet rs = null;
	try {
		conn = makeConnection();
		String sql = "";
		sql += "select no, name, id, joindate \n";//쿼리문이 여러줄일때는 고치기 어려우므로 항상 개행할 것
		sql += "from jdbctest \n";
		if(searchName != null)
			sql += "where name = '" + searchName + "'\n";
		
		stmt = conn.createStatement();
		rs = stmt.executeQuery(sql);
//			MemberDto memberDto = new MemberDto();
		while(rs.next()) { //최초로 호출된 ResultSet의 next()는 first()의 성격을 가짐
			MemberDto memberDto = new MemberDto(); 
//			memberDto.setNo(rs.getInt(1)); 
			memberDto.setNo(rs.getInt("no"));
			memberDto.setId(rs.getString("id"));
			memberDto.setName(rs.getString("name"));
			memberDto.setJoindate(rs.getString("joindate"));
			
			list.add(memberDto);
			
		}
	} catch (SQLException e) {
		e.printStackTrace();
	} finally {
		try { //원칙적으로는 아래 if문을 각각 try하는게 맞지만, close에서 에러가 발생할지라도 할 수 있는 방법이 없으므로 같이 쓴거임
			if(rs!=null)
				rs.close();
			if(stmt!=null)
				stmt.close();
			if(conn!=null)
				conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
	return list;
}

 

 

* PreparedStatement 예제

 

- Statement와 달리 Connection의 prepareStatement() 메소드 실행시에 sql문을 가져감

- insert, delete, update : executeUpdate() / select : executeQuery()    (Statement와 동일)

try {
	conn = DriverManager.getConnection("jdbc:oracle:thin:@192.168.14.52:1521:orcl", "kitri", "kitri");
	StringBuffer sql = new StringBuffer();
	sql.append("insert all\n");
	sql.append("	into member (id, name, pass, emailid, emaildomain, joindate)\n");
	sql.append("	values (?, ?, ?, ?, ?, sysdate)\n");
	sql.append("	into member_detail (id, zipcode, address, address_detail, tel1, tel2, tel3)\n");
	sql.append("	values (?, ?, ?, ?, ?, ?, ?)\n");
	sql.append("select * from dual\n");
	pstmt = conn.prepareStatement(sql.toString());	// 메모리에 있는지 검사함
	
	int idx = 0;	// insert문의 values 값을 추가하거나 삭제하는 경우 인덱스를 자동으로 잡아주게 됨
	pstmt.setString(++idx, id);
	pstmt.setString(++idx, name);
	pstmt.setString(++idx, pass);
	pstmt.setString(++idx, emailid);
	pstmt.setString(++idx, emaildomain);
	pstmt.setString(++idx, id);
	pstmt.setString(++idx, zipcode);
	pstmt.setString(++idx, address);
	pstmt.setString(++idx, addressDetail);
	pstmt.setString(++idx, tel1);
	pstmt.setString(++idx, tel2);
	pstmt.setString(++idx, tel3);
	
	cnt = pstmt.executeUpdate();	// cf. stmt는 executeUpdate에서 sql가져감 
} catch (SQLException e) {
	e.printStackTrace();
} finally {
		try {
			if(pstmt != null)
				pstmt.close();
			if(conn != null)
				conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
}

 

 

 

 

 

* 참고자료

 

https://diaryofgreen.tistory.com/123

 

JDBC :: 드라이버 종류

JDBC 드라이버 종류에는 4가지가 있는데, 변천사로 구분된다. 1. Type 1 JDBC - OJDBC Bridge Driver 표준 드라이버 호출들을 대응되는 ODBC 호출로 변환하고, 운영 시스템이 ODBC(Open Database Connectivity) 라..

diaryofgreen.tistory.com

 

'kitri 노트 > java' 카테고리의 다른 글

정적 멤버  (0) 2019.05.11
JTable - DefaultTableModel 사용  (0) 2019.04.08
[Java #22] util package  (0) 2019.03.27
[Java #21] lang package_StringBuffer Class  (0) 2019.03.27
[Java #20] lang package_String Class  (0) 2019.03.25