📌ConnectionFactory이용하여 JDBC연동해보기
[간결하고 유지보수의 효율성이 좋아진다.]
하나의 con을 가져와서 메소드를 따로따로 만들기때문에 서버가 바뀌면 제일 상위에있는 클래스만 바뀌면 된다.
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
//Connection 인스턴스를 생성하여 반환하거나 제거하는 기능을 선언된 클래스
//=> JDBC프로그램 작성에 필요한 공통적인 명령들을 메소드 제공
//=> 프로그램의 생산성이 향상 및 유지보수 효율성 증가
public class ConnectionFactory {
public static Connection getConnection() {
Connection con = null;
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
String url = "jdbc:oracle:thin:@localhost:1521:xe";
String user = "scott";
String password = "tiger";
con = DriverManager.getConnection(url, user, password);
} catch (Exception e) {
System.out.println("Connection인스턴스를 생성할 수 없습니다.");
}
return con;
}
public static void close(Connection con, Statement stmt, ResultSet rs) {
try {
if (stmt != null)
stmt.close();
if (rs != null)
rs.close();
if (con != null)
con.close();
} catch (SQLException e) {
}
}
}
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
//dept테이블에 저장된 모든 부서정보를 검색하여 출력하는 jdbc프로그램
public class ConnectionFactoryApp {
public static void main(String[] args) {
Connection con= null;
Statement stmt = null;
ResultSet rs = null;
try {
con = ConnectionFactory.getConnection();
stmt = con.createStatement();
String sql = "select * from dept order by deptno";
rs = stmt.executeQuery(sql);
while(rs.next()) {
System.out.println("부서번호 = " + rs.getString("deptno"));
System.out.println("부서이름 = " + rs.getString("dname"));
System.out.println("부서위치 = " + rs.getString("loc"));
}
}catch(SQLException e){
System.out.println("[error] sql오류");
}finally {
ConnectionFactory.close(con, stmt, rs);
}
}
}
📌다양한 ResultSet커서 이용방법
[statement에 따라 rs처리방법이 달라진다]
- result.Setnext() : ResultSet커서를 다음행으로 이동하는 메소드
- =>커서 위치에 행이 없는 경우 false반환 , 행이 있는 경우 true를 반환
Connection.createStatement(int resultSetType, int resultSetConcurrency)
- Statement 인스턴스를 생성하여 반환하는 메소드
- SELECT 명령을 전달하여 반환되는 ResultSet 인스턴스의 속성 변경
- resultSetType : ResultSet 커서 이동 관련 속성 변경
1) ResultSet.TYPE_FORWARD_ONLY : ResultSet 커서를 다음행으로만 이동(기본)
2) ResultSet.TYPE_SCROLL_INSENSITIVE : ResultSet 커서를 원하는 행으로 이동 - 조작행 미반영
3) ResultSet.TYPE_SCROLL_SENSITIVE : ResultSet 커서를 원하는 행으로 이동 - 조작행 반영 - resultSetConcurrency : ResultSet 커서 위치의 처리행 조작 관련 속성 변경
1) ResultSet.CONCUR_READ_ONLY : 처리행의 조작 불가능
2) ResultSet.CONCUR_UPDATABLE : 처리행의 조작 가능
stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY); 이용 |
1) ResultSet.first() : ResultSet커서를 첫번째 검색행으로 이동하는 메소드
2) ResultSet .last() : ResultSet 커서를 마지막 검색행으로 이동하는 메소드
3) ResultSet .absolute(int index) : ResultSet 커서를 원하는 위치(Index)의 검색행으로 이동하는 메소드
4) ResultSet .beforeFirst() : ResultSet 커서를 BOF 위치로 이동하는 메소드
5) ResultSet.afterLast() : ResultSet 커서를 EOF 위치로 이동하는 메소드
6) ResultSet.previous() : ResultSet 커서를 이전행으로 이동하는 메소드
stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); 를 이용해보기 |
1) ResultSet.absolute(2); : 2번째 위치에 새로운 행을 삽입하여 테이블에 적용 >> INSERT
2) ResultSet.moveToInsertRow() : 커서 위치에 새로운 행을 생성하는 메소드
3) ResultSet.updateXXX(String columnLabel, XXX value) : 커서 위치의 행에 컬럼값을 변경하는 메소드
4) ResultSet.insertRow() : 커서 위치의 행을 테이블의 행으로 삽입하는 메소드
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
//student 테이블에 저장된 모든 학생정보를 검색하여 출력하는 jdbc프로그램
//=>ResultSet 커서의 위치 변경 및 커서 위치의 처리행의 조작이 가능
public class ResultSetApp {
public static void main(String[] args) throws SQLException {
Connection con = ConnectionFactory.getConnection();
// Connection.createStatement() : 인스턴스를 생성하여
// statement : sql명령을 전달하기 기능을 제공하는 인스턴스
// statement.excuteQuery(String sql) : select 명령을 전달하여 resultSet인스턴스를 반환하는 메소드
// reSultSet : select 명령의 검색결과를 저장하기 위한 인스턴스
// => resultSet커서를 이동하여 행단위를 처리한다
// => 이 커서는 다음행으로만 이동하며 커서 위치를 조작이 불가능하다
Statement stmt = con.createStatement();
String sql = "select * from student order by no";
ResultSet rs = stmt.executeQuery(sql);
// result.Setnext() : ResultSet커서를 다음행으로 이동하는 메소드
// =>커서 위치에 행이 없는 경우 false반환
// => 행이 있는 경우 true를 반환
while (rs.next()) {
// ResultSet.getRow() : ResultSet인스턴스에 저장된
// 검색행의 행번호를 반환하는 메소드
System.out.print(rs.getRow() + "행 : ");
System.out.print("학번 = " + rs.getInt("no") + " ");
System.out.println("이름 = " + rs.getString("name"));
}
System.out.println("=====================================");
ConnectionFactory.close(con, stmt, rs);
con = ConnectionFactory.getConnection();
// Connection.createStatement(int resultSetType, int resultSetConcurrency)
// => Statement 인스턴스를 생성하여 반환하는 메소드
// => SELECT 명령을 전달하여 반환되는 ResultSet 인스턴스의 속성 변경
// resultSetType : ResultSet 커서 이동 관련 속성 변경
// => ResultSet.TYPE_FORWARD_ONLY : ResultSet 커서를 다음행으로만 이동(기본)
// => ResultSet.TYPE_SCROLL_INSENSITIVE : ResultSet 커서를 원하는 행으로 이동 - 조작행 미반영
// => ResultSet.TYPE_SCROLL_SENSITIVE : ResultSet 커서를 원하는 행으로 이동 - 조작행 반영
// resultSetConcurrency : ResultSet 커서 위치의 처리행 조작 관련 속성 변경
// => ResultSet.CONCUR_READ_ONLY : 처리행의 조작 불가능
// => ResultSet.CONCUR_UPDATABLE : 처리행의 조작 가능
stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
String sql2 = "select * from student order by no";
// 커서의 최초위치 : BOF
rs = stmt.executeQuery(sql2);
rs.first(); // ResultSet.first() : ResultSet커서를 첫번째 검색행으로 이동하는 메소드
System.out.print(rs.getRow() + "행 : ");
System.out.print("학번 = " + rs.getInt("no") + " ");
System.out.println("이름 = " + rs.getString("name"));
System.out.println("=====================================");
rs.last();// ResultSet.last() : ResultSet 커서를 마지막 검색행으로 이동하는 메소드
System.out.print("학번 = " + rs.getInt("no") + " ");
System.out.println("이름 = " + rs.getString("name"));
System.out.println("=====================================");
// ResultSet.absolute(int index) : ResultSet 커서를 원하는 위치(Index)의 검색행으로 이동하는 메소드
rs.absolute(2);
System.out.println(rs.getRow() + "행 : 학번 = " + rs.getInt("no") + ", 이름 = " + rs.getString("name"));
System.out.println("=====================================================");
rs.beforeFirst();// ResultSet.beforeFirst() : ResultSet 커서를 BOF 위치로 이동하는 메소드
while (rs.next()) {
System.out.println(rs.getRow() + "행 : 학번 = " + rs.getInt("no") + ", 이름 = " + rs.getString("name"));
}
System.out.println("=====================================================");
rs.afterLast();// ResultSet.previous() : ResultSet 커서를 이전행으로 이동하는 메소드
while (rs.previous()) {
System.out.println(rs.getRow() + "행 : 학번 = " + rs.getInt("no") + ", 이름 = " + rs.getString("name"));
}
ConnectionFactory.close(con, stmt, rs);
con = ConnectionFactory.getConnection();
System.out.println("=============================updatable==================================");
con = ConnectionFactory.getConnection();
stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
// 커서 위치의 행을 조작하고자 할 경우 SELECT 명령에서 검색대상으로 * 사용 불가능
sql = "select no,name,phone,address,BIRHDAY from student order by no";
rs = stmt.executeQuery(sql);
// 2번째 위치에 새로운 행을 삽입하여 테이블에 적용 >> INSERT
rs.absolute(2);
// ResultSet.moveToInsertRow() : 커서 위치에 새로운 행을 생성하는 메소드
// => 기존 행은 자동으로 뒤로 이동
rs.moveToInsertRow();
// ResultSet.updateXXX(String columnLabel, XXX value) : 커서 위치의 행에 컬럼값을 변경하는 메소드
// => XXX : Java 자료형
rs.updateInt("no", 5000);
rs.updateString("name", "장길산");
rs.updateString("phone", "010-4444-4444");
rs.updateString("address", "수원시 팔달구");
// rs.updateDate("birthday", new Date(100, 5, 30));
rs.updateString("BIRHDAY", "2000-06-30 00:00:00.0");
// ResultSet.insertRow() : 커서 위치의 행을 테이블의 행으로 삽입하는 메소드
rs.insertRow();
System.out.println(rs.getRow() + "행 : 학번 = " + rs.getInt("no") + ", 이름 = " + rs.getString("name"));
ConnectionFactory.close(con, stmt, rs);
/*
//3번째 위치에 행을 삭제하여 테이블에 적용 >> DELETE
rs.absolute(3);
//ResultSet.deleteRow() : 커서 위치의 행으로 테이블의 행을 삭제하는 메소드
rs.deleteRow();
*/
//2번째 위치에 행의 이름을 [임꺽정]으로 변경하여 테이블에 적용 >> UPDATE
rs.absolute(2);
rs.updateString("name", "임꺽정");
//ResultSet.updateRow() : 커서 위치의 행으로 테이블의 행을 변경하는 메소드
rs.updateRow();
System.out.println(rs.getRow()+"행 : 학번 = "+rs.getInt("no")+", 이름 = "+rs.getString("name"));
ConnectionFactory.close(con, stmt, rs);
System.out.println("=====================================================");
}
}
📌Metadata
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
public class ResultSetMetadataApp {
public static void main(String[] args) throws SQLException{
Connection con = ConnectionFactory.getConnection();
Statement stmt = con.createStatement();
String sql = "select * from student order by no";
ResultSet rs = stmt.executeQuery(sql);
//ResultSet.getMetaData() : ResultSet 인스턴스에 저장된 검색결과에 대한 부가적인 정보를 저장한
//ResultSetMetadata인스턴스를 반환하는 메소드
ResultSetMetaData rsmd = rs.getMetaData();
//ResultSetMetaData.getColumnCount() : 검색결과에 대한 컬럼 갯수를 반환하는 메소드
int columnCount = rsmd.getColumnCount();
System.out.println("검색결과에 대한 컬럼갯수 = " + columnCount);
System.out.println("================================================");
for(int i = 1; i<= columnCount; i++) {
//ResultSetMetaData.getColumnLabel(int columnIndex) : columnIndex 위치의 컬럼명을 반환하는 메소드
String columnLabel = rsmd.getColumnLabel(i);//컬럼의 이름을 달라!
//isNullable() : 컬럼인덱스 위치의 컬럼에 대한 null허용유무를 반환하는 메소드
//=> 0(널을 허용하지 않는다) or 1(널값을 허용한다)
int isNull = rsmd.isNullable(i);
String nullResult = "null";
if(isNull == ResultSetMetaData.columnNoNulls) nullResult = "not null";
//ResultSetMetaData.getColumnTypeName(int columnIndex) : columnIndex 위치의 컬럼 자료형을 반환하는 메소드
String columnTypeName = rsmd.getColumnTypeName(i);//컬럼인덱스자리에
//ResultSetMetaData.getColumnDisplaySize(int columnIndex) : columnIndex 위치의 컬럼값에 대한 출력크기를 반환하는 메소드
int columndisplaySize = rsmd.getColumnDisplaySize(i);//컬럼인덱스 위치에 (실제크기 노노)
System.out.println(columnLabel + "," + columnCount + "," + columnTypeName + ", " + columndisplaySize);
}
ConnectionFactory.close(con, stmt, rs);
}
}
📌excute의 사용 - 쿼리문이 불확실할때사용한다.
package site.itwill.jdbc;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class ExcuteApp {
public static void main(String[] args) throws SQLException{
Connection con = ConnectionFactory.getConnection();
Statement stmt = con.createStatement();
// String sql1 = "update student set name = '홍길동' where no = 1000";
// int rows = stmt.executeUpdate(sql1);
//
// System.out.println("[결과]" + rows + "명의 학생정보를 변경 하였습니다.");
//
// String sql2 = "select * from student order by no";
// ResultSet rs = stmt.executeQuery(sql2);
//
// while(rs.next()) {
// System.out.println("학번 = " + rs.getInt("no") + "이름 = " + rs.getString("name"));
// }
// ConnectionFactory.close(con, stmt);
//=========================================================================================
int choice = 1;
String sql = "";
if(choice==1) {
sql = "update student set name = '홍길동' where no = 1000";
}else {
sql = "select * from student order by no";
}
//Statement.execute(String sql) : SQL 명령을 전달하는 메소드
//=> 전달될 sql명령이 확정적이지 않을 경우 사용하는 메소드
//=> false 반환 : dml 명령이 전달되어 실행될 경우의 반환값
//=> true반환 : dql명령이 전달되어 실행될 경우의 반환값
boolean result = stmt.execute(sql);
if(result) {
//dql명령이 전달되어 실행된 경우
//stmt.getResultSet() : 전달되어 실행된 select명령의
//검색결과를 ResultSet인스턴스로 반환하는 메소드
ResultSet rs = stmt.getResultSet();
while(rs.next()) {
System.out.println("학번 = " + rs.getInt("no") + "이름 = " + rs.getString("name"));
}
ConnectionFactory.close(con, stmt, rs);
}else {
//dml명령이 전달되어 실행된 경우
//stmt.getUpdateCount() : 전달되어 실행된 insert/update/delete명령에 대한
//조작행의 갯수를 반환하는 메소드
int rows = stmt.getUpdateCount();
System.out.println("[결과]" + rows + "명의 학생정보를 변경 하였습니다.");
ConnectionFactory.close(con, stmt);
}
}
}
'💻 수업정리 (2020) > 오라클' 카테고리의 다른 글
[7/2] DAO와 DTO 클래스, 정규표현식 사용해보기 (0) | 2020.07.02 |
---|---|
[7/1] PreparedStatement (0) | 2020.07.01 |
[6/29]JDBC연동 ( + 리플랙션에 대해서 알아두기) (0) | 2020.06.29 |
[6/26] 객체권한, 저장프로시저, 트리거 (0) | 2020.06.26 |
[6/25] 인라인뷰와 시퀀스, 권한 부여 (0) | 2020.06.25 |