기록 저장소
JDBC 본문
- 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개의 결과 : rs.next()
- 0 또는 1개의 결과 : if(rs.next())
- 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 |