자료파일로 만들어서 배포하면 실행 가능 (콘솔 프로그램은 실행 불가능,연결 프로그램 : java.exe )
Statement 객체 : SQL 명령을 현재 접속중인 DBMS 서버에 전달하여 실행하는 기능을 제공하는 객체
Connection.createStatement( ) : Statement 객체를 생성하여 반환하는 메소드
Statement.executeUpdate(String sql) : DML 명령 또는 DDL명령을 전달하여 실행하기 위한 메소드
Statement.executeQuery(String sql) : SELECT 명령을 전달하여 실행하기 위한 메소드
검색결과를 테이블 형식의 객체로 저장하여 표현한 객체
ResultSet 객체에 저장된 검색행을 행단위로 처리하기 위해 내부적인 커서 제공
ResultSet.next() : ResultSet 커서를 다음행으로 이동하는 메소드 - boolean
ResultSet.getXXX(int Index) 또는 ResultSet.getXXX(String Label) : ResultSet 커서가 위치한 처리행의 컬럼값을 반환하는 메소드
ResultSet.getRow() : ResultSet 커서가 위치한 처리행의 행번호(RowIndex)를 반환하는 메소드
ResultSet.getXXX(string columnLabel) : ResultSet 커서가 위치한 처리행의 컬럼값을 반환하는 메소드
: ResultSet 커서의 이동 관련 속성값(ResultSet 인터페이스의 상수)을 전달하여 설정
: ResultSet 커서 위치의 처리행의 조작 관련 속성값(ResultSet 인터페이스의 상수)을 전달하여 설정
public class ResultSetCursorApp {
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);
//SELECT 명령을 전달하여 실행하고 검색결과를 ResultSet 객체로 반환하는 메소드
// → ResultSet 객체는 내부적으로 커서(Cursor)를 사용하여 행단위로 처리
// → ResultSet 커서는 다음행으로만 이동 가능하며 커서 위치의 행에 대한 조작 불가능
while(rs.next()) {
//rs.getRow : ResultSet 커서가 위치한 처리행의 행번호를 반환
//rs.getXXX(columnLabel) : ResultSet 커서가 위치한 처리행의 컬럼값을 반환
System.out.println(rs.getRow()+"행 : 학번 = "
+rs.getInt("no")+", 이름 = "+rs.getString("name"));
}
ConnectionFactory.close(con, stmt, rs);
System.out.println("=================================================");
con=ConnectionFactory.getConnection();
stmt=con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
sql="select * from student order by no";
//ResultSet 커서는 ResultSet 객체의 BOF(Before Of File)영역에 위치
rs=stmt.executeQuery(sql);
//ResultSet.first() : ResultSet 커서를 첫번째 행으로 이동하는 메소드
rs.first();
System.out.println(rs.getRow()+"행 : 학번 = "+rs.getInt("no")+
", 이름 = "+rs.getString("name"));
//ResultSet.last() : ResultSet 커서를 마지막 행으로 이동하는 메소드
rs.last();
System.out.println(rs.getRow()+"행 : 학번 = "+rs.getInt("no")+
", 이름 = "+rs.getString("name"));
//ResultSet.absolute(int rowIndex) : ResultSet 커서를 원하는 위치의 행으로 이동
rs.absolute(2);
System.out.println(rs.getRow()+"행 : 학번 = "+rs.getInt("no")+
", 이름 = "+rs.getString("name"));
System.out.println("=================================================");
//ResultSet.beforeFirst() : ResultSet 커서를 BOF(Before Of File) 영역으로 이동
rs.beforeFirst();
while(rs.next()) {
System.out.println(rs.getRow()+"행 : 학번 = "+rs.getInt("no")+
", 이름 = "+rs.getString("name"));
}
System.out.println("=================================================");
//ResultSet.afterLast() : ResultSet 커서를 EOF(End Of File) 영역으로 이동
rs.afterLast();
//ResultSet.previous() : ResultSet 커서를 이전행으로 이동하는 메소드
while(rs.previous()) {
System.out.println(rs.getRow()+"행 : 학번 = "+rs.getInt("no")+
", 이름 = "+rs.getString("name"));
}
ConnectionFactory.close(con, stmt, rs);
System.out.println("=================================================");
con=ConnectionFactory.getConnection();
stmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
sql="select no,name,phone,address,birthday from student order by no";
rs=stmt.executeQuery(sql);
rs.absolute(2);
//ResultSet.updateXXX(String columnLabel, XXX columnValue)
// → ResultSet 커서가 위치한 처리행의 컬럼값을 변경하는 메소드
// → XXX : Java 자료형
rs.updateString("name", "임걱정");
//ResultSet.updateRow() : 변경행을 ResultSet 객체에 적용하는 메소드
// → 실제 테이블의 행에 대한 컬럼값 변경 처리
rs.updateRow();
rs.absolute(3);
//ResultSet.moveToInsertRow() : ResultSet 커서 위치에 새로운 행을 삽입하는 메소드
// → 삽입행 다음에 존재하는 기존행은 자동으로 다음행으로 이동
rs.moveToInsertRow();
//삽입행의 컬럼값 변경
rs.updateInt("no", 4000);
rs.updateString("name", "일지매");
rs.updateString("phone", "010-1321-2411");
rs.updateString("address", "부산시 사하구");
rs.updateString("birthday", "2000-12-31");
//ResultSet.insertRow() : 삽입행을 ResultSet 객체에 적용하는 메소드
// → 실제 테이블의 행에 대한 삽입 처리
rs.insertRow();
rs.absolute(4);
//ResultSet.deleteRow() : ResultSet 커서가 위치한 처리행을 삭제하여
//ResultSet 객체에 적용하는 메소드 → 실제 테이블의 행에 대한 삭제 처리
rs.deleteRow();
ConnectionFactory.close(con, stmt, rs);
System.out.println("=================================================");
}
}
Statement 객체 : 현재 접속중인 DBMS 서버에 SQL 명령을 전달하여 실행하기 위한 기능을 제공하는 객체
장점 : 하나의 Statement 객체를 이용하여 다수의 SQL 명령을 전달하여 실행 가능
단점 :
public class StatementApp {
public static void main(String[] args) throws Exception {
//키보드로 학생정보를 입력받아 STUDENT 테이블에 삽입하고
//STUDENT 테이블에 저장된 모든 학생정보를 검색하여 출력하는 JDBC 프로그램 작성
//키보드로 학생정보를 입력받기 위한 입력스트림 생성
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
//키보드로 학생정보를 입력받아 저장
System.out.println("<<학생정보 입력>>");
System.out.print("학번 입력 >> ");
int no=Integer.parseInt(in.readLine());
//키보드로 입력한 값을 integer 클래스의 정수값으로 형변환하여 no에저장
System.out.print("이름 입력 >> ");
String name=in.readLine();
System.out.print("전화번호 입력 >> ");
String phone=in.readLine();
System.out.print("주소 입력 >> ");
String address=in.readLine();
System.out.print("생년월일 입력 >> ");
String birthday=in.readLine();
System.out.println("====================================================");
//입력된 학생정보를 STUDENT 테이블의 행으로 삽입 처리
Connection con=ConnectionFactory.getConnection();
Statement stmt=con.createStatement();
String sql1="insert into student values("+no+",'"+name+"','"+phone+"',
'"+address+"','"+birthday+"')";
//자바 변수 "no"를 +를 이용해 결합, 오라클 문자값은 ' ' 안에 있어야 함
//변수"name" 을 +를 이용해 결합 후 오라클 문자로 표시하기 위해 ' ' 안에 넣어줌
int rows=stmt.executeUpdate(sql1);
System.out.println("[결과]"+rows+"명의 학생정보를 삽입 하였습니다.");
System.out.println("=====================================================");
//STUDENT 테이블에 저장된 모든 학생정보를 검색하여 출력
String sql2="select * from student order by no";
ResultSet rs=stmt.executeQuery(sql2);
System.out.println("<<학생정보 출력>>");
while(rs.next()) {
System.out.println("학번 = "+rs.getInt("no")+",
이름 = "+rs.getString("name"));
}
ConnectionFactory.close(con, stmt, rs);
System.out.println("=====================================================");
//키보드로 이름을 입력받아 STUDENT 테이블에 저장된 학생정보 중 해당 이름의 학생정보를
//검색하여 출력하는 JDBC 프로그램 작성
//키보드로 학생정보를 입력받기 위한 입력스트림 생성
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
//키보드로 이름을 입력받아 저장
System.out.println("<<학생정보 검색>>");
System.out.print("이름 입력 >> ");
String name=in.readLine();
System.out.println("=====================================================");
//STUDENT 테이블에 저장된 학생정보 중 해당 이름의 학생정보를 검색하여 출력
Connection con=ConnectionFactory.getConnection();
Statement stmt=con.createStatement();
String sql="select * from student where name='"+name+"' order by no";
ResultSet rs=stmt.executeQuery(sql);
System.out.println("<<검색결과>>");
if(rs.next()) {
do {
System.out.println("학번 = "+rs.getInt("no")+",
이름 = "+rs.getString("name"));
} while(rs.next());
} else {
System.out.println("검색된 학생정보가 없습니다.");
}
ConnectionFactory.close(con, stmt, rs);
System.out.println("=====================================================");
}
}
Connection.prepareStatement(String sql) : Connection 객체로부터 SQL 명령이 저장된 PreparedStatement 객체를 반환하는 메소드
PreparedStatement 객체에 저장된 SQL 명령에서는 ?(InParameter) 기호 사용
PreparedStatement.setXXX(int parameterIndex, XXX value)
: PreparedStatement 객체에 저장된 SQL 명령의 InParameter에 Java 변수값을 전달하는 메소드
public class PreparedStatementApp {
public static void main(String[] args) throws Exception {
//키보드로 학생정보를 입력받아 STUDENT 테이블에 삽입하고 STUDENT 테이블에 저장된 모든
//학생정보를 검색하여 출력하는 JDBC 프로그램 작성
//키보드로 학생정보를 입력받기 위한 입력스트림 생성
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
//키보드로 학생정보를 입력받아 저장
System.out.println("<<학생정보 입력>>");
System.out.print("학번 입력 >> ");
int no=Integer.parseInt(in.readLine());
System.out.print("이름 입력 >> ");
String name=in.readLine();
System.out.print("전화번호 입력 >> ");
String phone=in.readLine();
System.out.print("주소 입력 >> ");
String address=in.readLine();
System.out.print("생년월일 입력 >> ");
String birthday=in.readLine();
System.out.println("=====================================================");
//입력된 학생정보를 STUDENT 테이블의 행으로 삽입 처리
Connection con=ConnectionFactory.getConnection();
String sql1="insert into student values(?,?,?,?,?)";
PreparedStatement pstmt=con.prepareStatement(sql1);
pstmt.setInt(1, no);
pstmt.setString(2, name);
pstmt.setString(3, phone);
pstmt.setString(4, address);
pstmt.setString(5, birthday);
//PreparedStatement.executeUpdate()
//: DML 명령 또는 DDL 명령을 전달하여 실행하는 메소드
// => 조작행의 갯수를 정수값으로 반환
int rows=pstmt.executeUpdate();
System.out.println("[결과]"+rows+"명의 학생정보를 삽입 하였습니다.");
ptstmt.colose();
System.out.println("====================================================");
//STUDENT 테이블에 저장된 모든 학생정보를 검색하여 출력
String sql2="select * from student order by no";
pstmt=con.prepareStatement(sql2);
//PreparedStatement.executeQuery() : SELECT 명령을 전달하여 실행하는 메소드
// => 모든 검색행이 저장된 ResultSet 객체 반환
ResultSet rs=pstmt.executeQuery();
System.out.println("<<학생정보 출력>>");
while(rs.next()) {
System.out.println("학번="+rs.getInt("no")+",이름="+rs.getString("name"));
}
ConnectionFactory.close(con, pstmt, rs);
System.out.println("====================================================");
//키보드로 이름을 입력받아 STUDENT 테이블에 저장된 학생정보 중 해당 이름의 학생정보를
//검색하여 출력하는 JDBC 프로그램 작성
//키보드로 학생정보를 입력받기 위한 입력스트림 생성
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
//키보드로 이름을 입력받아 저장
System.out.println("<<학생정보 검색>>");
System.out.print("이름 입력 >> ");
String name=in.readLine();
System.out.println("====================================================");
//STUDENT 테이블에 저장된 학생정보 중 해당 이름의 학생정보를 검색하여 출력
Connection con=ConnectionFactory.getConnection();
String sql="select * from student where name=? order by no";
PreparedStatement pstmt=con.prepareStatement(sql);
pstmt.setString(1, name);
ResultSet rs=pstmt.executeQuery();
System.out.println("<<검색결과>>");
if(rs.next()) {
do {
System.out.println("학번="+rs.getInt("no")+",이름="+rs.getString("name"));
} while(rs.next());
} else {
System.out.println("검색된 학생정보가 없습니다.");
}
ConnectionFactory.close(con, pstmt, rs);
System.out.println("====================================================");
}
}
JDBC 프로그램에서 하나의 PreparedStatement 객체를 사용하여 다수의 행을 삽입,변경,삭제 처리를 하기 위해 일괄처리(Batch)영역에 SQL 명령을 저장하여 한번에 전달하여 실행 기능 제공
PreparedStatement.addBatch() : PreparedStatement 객체에 이용하여 SQL 명령을 일괄처리 영역에 추가하는 메소드
PreparedStatement.executeBatch() : 일괄처리 영역에 저장된 SQL 명령을 전달하여 실행하는 메소드 (조작행의 갯수을 int 배열로 반환)
public class AddBatchApp {
public static void main(String[] args) throws Exception {
Connection con=ConnectionFactory.getConnection();
String sql="insert into student values(?,?,?,?,?)";
PreparedStatement pstmt=con.prepareStatement(sql);
pstmt.setInt(1, 4000);
pstmt.setString(2, "일지매");
pstmt.setString(3, "010-2317-9741");
pstmt.setString(4, "서울시 종로구");
pstmt.setString(5, "1999-08-15");
//PreparedStatement.addBatch()
// : PreparedStatement 객체에 이용하여 SQL 명령을 일괄처리 영역에 추가하는 메소드
pstmt.addBatch();
pstmt.setInt(1, 5000);
pstmt.setString(2, "장길산");
pstmt.setString(3, "010-4879-6765");
pstmt.setString(4, "서울시 도봉구");
pstmt.setString(5, "1997-05-05");
pstmt.addBatch();
//PreparedStatement.executeBatch()
// : 일괄처리 영역에 저장된 SQL 명령을 전달하여 실행하는 메소드
// => 조작행의 갯수을 int 배열로 반환
int[] result=pstmt.executeBatch();
System.out.println("[메세지]"+result.length+"개의 행을 삽입 하였습니다.");
ConnectionFactory.close(con, pstmt);
}
}
Connection.prepareCall(String sql) : 저장 프로시저를 호출하는 명령을 전달하여 실행하기 위한 CallableStatement 객체를 반환하는 메소드
저장 프로시저에서 사용한 InParameter에는 반드시 setXXX() 메소드로 값을 전달하거나 registerOutParameter() 메소드를 이용하여 값을 제공받아 사용
CallableStatement.setXXX(int parameterIndex, XXX value)
: 저장 프로시저의 IN 모드의 매개변수에 Java 변수값을 전달하기 위한 메소드
CallableStatement.registerOutParameter(int parameterIndex, int sqlType)
: 저장 프로시저의 OUT 모드의 매개변수에 저장된 값을 제공받기 위한 메소드
CallableStatement.execute() : 저장 프로시저 호출 명령을 전달하여 실행하는 메소드
CallableStatement.getXXX(int parameterIndex)
: 저장 프로시저의 OUT 모드의 매개변수로 제공받은 값을 반환하는 메소드
//키보드로 학번을 입력받아 STUDENT 테이블에 저장된 학생정보 중 해당 학번의 학생정보를 삭제하는
//JDBC 프로그램 작성 (저장 프로시저를 호출하여 학생정보 삭제 처리)
public class CallableStatementApp {
public static void main(String[] args) throws Exception {
//키보드로 학번을 입력받기 위한 입력스트림 생성
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
System.out.println("<<학생정보 삭제>>");
System.out.print("학번 입력 >> ");
int no=Integer.parseInt(in.readLine());
System.out.println("================================================");
Connection con=ConnectionFactory.getConnection();
/* oracle 서버에 학생정보를 삭제하는 저장 프로시저 생성
CREATE OR REPLACE PROCEDURE DELETE_STUDENT
(VNO IN STUDENT.NO%TYPE, VNAME OUT STUDENT.NAME%TYPE) IS
BEGIN
SELECT NAME INTO VNAME FROM STUDENT WHERE NO=VNO;
IF SQL%FOUND THEN
DELETE FROM STUDENT WHERE NO=VNO;
COMMIT;
END IF;
EXCEPTION
WHEN OTHERS THEN
VNAME := NULL;
END;
/
*/
String sql="{call delete_student(?,?)}";//저장프로시저 호출
CallableStatement cstmt=con.prepareCall(sql);
//CallableStatement.setXXX(int parameterIndex, XXX value)
// => 저장 프로시저의 IN 모드의 매개변수에 Java 변수값을 전달하기 위한 메소드
cstmt.setInt(1, no);
//CallableStatement.registerOutParameter(int parameterIndex, int sqlType)
// => 저장 프로시저의 OUT 모드의 매개변수에 저장된 값을 제공받기 위한 메소드
// => sqlType : SQL 자료형 - Types 클래스의 상수(Constant) 사용
cstmt.registerOutParameter(2, Types.NVARCHAR);
//CallableStatement.execute() : 저장 프로시저 호출 명령을 전달하여 실행하는 메소드
cstmt.execute();
//CallableStatement.getXXX(int parameterIndex)
// => 저장 프로시저의 OUT 모드의 매개변수로 제공받은 값을 반환하는 메소드
String name=cstmt.getString(2);
if(name==null) {
System.out.println("[메세지]해당 학번의 학생정보를 찾을 수 없습니다.");
} else {
System.out.println("[메세지]"+name+"님을 삭제 하였습니다.");
}
ConnectionFactory.close(con, cstmt);
}
}