빌드처리꼭해줌 (프로젝트 만들때)
프리페리어스 중요함.
SelectEmpApp
package xyz.itwill.jdbc;
// EMP 테이블에 저장된 모든 사원정보의 사원번호,사원이름,급여를 급여로 내림차순 정렬되도록
// 검색하여 출력하는 JDBC 프로그램 작성
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class SelectEmpApp {
public static void main(String[] args) {
Connection con = null;
Statement stmt = null;
ResultSet rs = 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);
stmt = con.createStatement();
String sql = "select empno,ename,sal from emp order by sal desc";
rs = stmt.executeQuery(sql);
while(rs.next()) {
System.out.println("사원번호 = " + rs.getString("empno") + ", 사원이름 = "
+ rs.getString("ename")+", 급여 = " + rs.getInt("sal"));
}
} catch (ClassNotFoundException e) {
System.out.println("[에러]OracleDriver 클래스를 찾을 수 없습니다.");
} catch (SQLException e) {
System.out.println("[에러]JDBC 관련 오류 = " + e.getMessage());
} finally {
try {
if(rs != null) rs.close();
if(stmt != null) stmt.close();
if(con != null) con.close();
} catch (SQLException e) {}
}
}
}
사원번호 = 7839, 사원이름 = KING, 급여 = 5000
사원번호 = 7902, 사원이름 = FORD, 급여 = 3000
사원번호 = 7788, 사원이름 = SCOTT, 급여 = 3000
사원번호 = 7566, 사원이름 = JONES, 급여 = 2975
사원번호 = 7698, 사원이름 = BLAKE, 급여 = 2850
사원번호 = 7782, 사원이름 = CLARK, 급여 = 2450
사원번호 = 7499, 사원이름 = ALLEN, 급여 = 1600
사원번호 = 7844, 사원이름 = TURNER, 급여 = 1500
사원번호 = 7934, 사원이름 = MILLER, 급여 = 1300
사원번호 = 7521, 사원이름 = WARD, 급여 = 1250
사원번호 = 7654, 사원이름 = MARTIN, 급여 = 1250
사원번호 = 7876, 사원이름 = ADAMS, 급여 = 1100
사원번호 = 7900, 사원이름 = JAMES, 급여 = 950
사원번호 = 7369, 사원이름 = SMITH, 급여 = 800
DeleteStudentApp
package xyz.itwill.jdbc;
// STUDENT 테이블에 저장된 학생정보 중 학번이 [3000]인 학생 정보를 삭제하는 JDBC 프로그램 작성
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class DeleteStudentApp {
public static void main(String[] args) {
Connection con = null;
Statement stmt = 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);
stmt = con.createStatement();
String sql="delete from student where no=3000";
int rows = stmt.executeUpdate(sql);
if(rows > 0) {
System.out.println("[메세지]" + rows + "명의 학생정보를 삭제 하였습니다.");
} else {
System.out.println("[메세지]삭제할 학번의 학생정보를 찾을 수 없습니다.");
}
} catch (ClassNotFoundException e) {
System.out.println("[에러]OracleDriver 클래스를 찾을 수 없습니다.");
} catch (SQLException e) {
System.out.println("[에러]JDBC 관련 오류 = " + e.getMessage());
} finally {
try {
if(stmt != null) stmt.close();
if(con != null) con.close();
} catch (SQLException e) {}
}
}
}
[메세지]1명의 학생정보를 삭제 하였습니다.
ConnectionFactory
package xyz.itwill.jdbc;
// Connection 객체를 생성하여 반환하거나 JDBC 관련 객체를 매개변수로 전달받아 제거하는 기능을 메소드로 제공하는 클래스
// > JDBC 프로그램 작성에 필요한 공통적인 기능을 메소드로 제공
// > 코드의 중복성을 최소화 시켜 프로그램의 생산성이 높이고 유지보수의 효율성 증가
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class ConnectionFactory {
// Connection 객체를 생성하여 반환하는 메소드
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;
}
// JDBC 관련 객체를 매개변수로 전달받아 제거하는 메소드
public static void close(Connection con) {
try {
if(con != null) con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close(Connection con, Statement stmt) {
try {
if(stmt != null) stmt.close();
if(con != null) con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void close(Connection con, Statement stmt, ResultSet rs) {
try {
if(rs != null) rs.close();
if(stmt != null) stmt.close();
if(con != null) con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
ConnectionFactoryApp
package xyz.itwill.jdbc;
// DEPY 테이블에 저장된 모든 부서정보를 검색하여 출력하는 JDBC 프로그램 작성
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
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 deptno,dname,loc from dept order by deptno";
rs = stmt.executeQuery(sql);
while(rs.next()) {
System.out.println("부서번호 = " + rs.getInt("deptno") + ", 부서이름 = "
+ rs.getString("dname") + ", 부서위치 = " + rs.getString("loc"));
}
} catch (SQLException e) {
System.out.println("[에러]JDBC 관련 오류 = " + e.getMessage());
} finally {
ConnectionFactory.close(con, stmt, rs);
}
}
}
부서번호 = 10, 부서이름 = ACCOUNTING, 부서위치 = NEW YORK
부서번호 = 20, 부서이름 = RESEARCH, 부서위치 = DALLAS
부서번호 = 30, 부서이름 = SALES, 부서위치 = CHICAGO
부서번호 = 40, 부서이름 = OPERATIONS, 부서위치 = BOSTON
ExecuteApp
package xyz.itwill.jdbc;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class ExecuteApp {
public static void main(String[] args) throws SQLException {
Connection con = ConnectionFactory.getConnection();
Statement stmt = con.createStatement();
String sql1 = "update student set name = '임걱정' where no = 2000";
int rows = stmt.executeUpdate(sql1);
System.out.println("[메세지]" + rows + "명의 학생정보를 변경 하였습니다.");
System.out.println("---------------------------------------------------------");
String sql12 = "select * from student order by no";
ResultSet rs = stmt.executeQuery(sql12);
while (rs.next())
System.out.println("학번 = " + rs.getInt("no") + ", 이름 = " + rs.getString("name"));
}
[메세지]0명의 학생정보를 변경 하였습니다.
---------------------------------------------------------
학번 = 1000, 이름 = 홍길동
System.out.println("---------------------------------------------------------");
Connection con = ConnerctionFactory.getConnection();
Connection con = ConnectionFactory.getConnection();
Statement stmt = con.createStatement();
int choice = 2;
String sql = "";
if(choice == 1) {
sql = "update student set name='임꺽정' where no=2000";
} else {
sql = "select * from student order by no";
}
// Statement.execute(String sql) : SQL 명령을 전달하여 실행하는 메소드 - boolean 반환
// > false 반환 : DML 명령 또는 DDL 명령을 전달하여 실행된 경우의 반환값
// > true 반환 : SELECT 명령을 전달하여 실행된 경우의 반환값
// > 전달되어 실행될 SQL 명령이 명확하지 않은 경우 사용하는 메소드
boolean result = stmt.execute(sql);
if(result) { // SELECT 명령이 전달되어 실행된 경우
// Statement.getResultSet() : Statement 객체로 전달되어 실행된 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 명령 또는 DDL 명령이 전달되어 실행된 경우
// Statement.getUpdateCount() : Statement 객체로 전달되어 실행된 DML 명령 또는
// DDL 명령의 처리결과를 정수값(int)로 반환하는 메소드
int rows = stmt.getUpdateCount();
System.out.println("[메세지]" + rows + "명의 학생정보를 변경 하였습니다.");
ConnectionFactory.close(con, stmt);
}
}
}
학번 = 1000, 이름 = 홍길동
ResultSetMetaDataApp
package xyz.itwill.jdbc;
import java.sql.*;
public class ResultSetMetaDataApp {
public static void main(String[] args) throws SQLException { // 예외처리를 직접하지않고 메소드 호출한곳으로 넘겨줌 (근데 원래 이렇게하는게아님)
// 예외 객체가 반환되면 메소드를 호출한 곳에서는 그 예외 객체를 처리(catch)해줘야 함
// https://codevang.tistory.com/143
Connection con = ConnectionFactory.getConnection();
Statement stmt = con.createStatement();
String sql = "select * from student order by no";
ResultSet rs = stmt.executeQuery (sql); // ResultSet 안에 검색결과를 저장함
while (rs.next()) {
System.out.println("학번 = " + rs.getInt("no") + ",이름 = " + rs.getString("name"));
}
학번 = 1000,이름 = 홍길동
학번 = 2000,이름 = 임꺽정
학번 = 3000,이름 = 전우치
Connection con = ConnectionFactory.getConnection();
Statement stmt = con.createStatement();
String sql = "select * from student order by no";
ResultSet rs = stmt.executeQuery (sql); // ResultSet 안에 검색결과를 저장함
while (rs.next()) {
System.out.println("학번 = " + rs.getInt("no") + ",이름 = " + rs.getString("name"));
}
// ResultSet.getMetaData() : 검색행 (ResultSet 객체) 에 대한 부가적인 정보가 저장된 ResultSetMetaData 객체를 반환하는 메소드
ResultSetMetaData rsmd = rs.getMetaData();
// ResultSetMetaData.getColumnCount() : 검색행의 컬럼 갯수를 반환하는 메소드
int columnCount = rsmd.getColumnCount();
System.out.println("검색행의 컬럼 갯수 = " + columnCount);
검색행의 컬럼 갯수 = 5
for(int i = 1; i <= columnCount; i++) { // 검색대상의 갯수만큼 반복 처리
// ResultSetMetaData.getColumnLabel(int columnIndex) : 첨자 위치(columnIndex)의 검색대상의 이름(컬럼명)을 반환하는 메소드
String columnLabel = rsmd.getColumnLabel(i);
// ResultSetMetaData.isNullable(int columnIndex) : 첨자 위치(columnIndex)의 컬럼에 대한 NULL 허용 유무값(0 또는 1)을 반환하는 메소드
int isNull = rsmd.isNullable(i);
String nullResult = "NULL";
// ResultSetMetaData.columnNoNulls : NULL를 허용하지 않는 상수 - 정수값 : 0
if(isNull == ResultSetMetaData.columnNoNulls) {
nullResult = "NOT NULL";
}
// ResultSetMetaData.isNullable(int columnIndex) : 첨자 위치(columnIndex)의 컬럼에 대한 오라클 자료형을 반환하는 메소드
String columnTypeName = rsmd.getColumnTypeName(i);
// ResultSetMetaData.getColumnDisplaySize(int columnIndex) : 첨자 위치(columnIndex)의 컬럼에 대한 출력크기를 반환하는 메소드
int columnDisplaySize = rsmd.getColumnDisplaySize(i);
System.out.println("컬럼의 이름= " + columnLabel);
System.out.println("NULL 허용 유무 = " + nullResult);
System.out.println("컬럼의 자료형 = " + columnTypeName);
System.out.println("컬럼의 출력크기 = " + columnDisplaySize);
System.out.println("---------------------------------------------------------");
}
ConnectionFactory.close(con, stmt, rs);
}
}
컬럼의 이름= NO
NULL 허용 유무 = NOT NULL
컬럼의 자료형 = NUMBER
컬럼의 출력크기 = 5
---------------------------------------------------------
컬럼의 이름= NAME
NULL 허용 유무 = NULL
컬럼의 자료형 = VARCHAR2
컬럼의 출력크기 = 50
---------------------------------------------------------
컬럼의 이름= PHONE
NULL 허용 유무 = NULL
컬럼의 자료형 = VARCHAR2
컬럼의 출력크기 = 20
---------------------------------------------------------
컬럼의 이름= ADDRESS
NULL 허용 유무 = NULL
컬럼의 자료형 = VARCHAR2
컬럼의 출력크기 = 100
---------------------------------------------------------
컬럼의 이름= BIRTHDAY
NULL 허용 유무 = NULL
컬럼의 자료형 = DATE
컬럼의 출력크기 = 7
---------------------------------------------------------
ResultSetCursorApp
public class ResultSetCursorApp {
※ [1행 : 학번 = 1000, 이름 = 홍길동] 만 나온다면 InsertStudentApp 가서 학생정보 여러개 넣기
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class ResultSetCursorApp {
public static void main(String[] args) throws SQLException {
Connection con = ConnectionFactory.getConnection();
// Connection.createStatement() : 현재 접속중인 DBMS 서버에 SQL 명령을 전달하기 위한 Statement 객체를 반환하는 메소드
Statement stmt = con.createStatement();
String sql = "select * from student order by no";
// Statement.executeQuery(String sql) : SELECT 명령을 전달하여 실행하고 검색된 모든 행이 저장된 ResultSet 객체를 반환하는 메소드
// > ResultSet 객체에 저장된 모든 검색행을 행단위로 처리하기 위한 내부적으로 커서(Cursor)를 이용 - ResultSet 커서
// > ResultSet 커서는 다음행으로만 이동 가능하여 커서 위치의 처리행 대한 조작 불가능
ResultSet rs = stmt.executeQuery(sql);
// ResultSet.next() : ResultSet 커서를 다음행으로 이동하는 메소드
// > 이동된 커서 위치에 처리행이 없는 경우 [false]를 반환하고 처리행이 있는 경우 [true] 반환
while(rs.next()) {
// ResultSet.getRow() : ResultSet 커서가 위치한 처리행의 행번호(RowIndex)를 반환하는 메소드
// ResultSet.getXXX(String columnLabel) : ResultSet 커서가 위치한 처리행의 컬럼값을 반환하는 메소드
System.out.println(rs.getRow()+"행 : 학번 = "+rs.getInt("no")+", 이름 = "+rs.getString("name"));
}
1행 : 학번 = 1000, 이름 = 홍길동
2행 : 학번 = 2000, 이름 = 임꺽정
3행 : 학번 = 3000, 이름 = 전우치
// Connection.createStatement(int resultSetType, int resultSetConcurrency)
// > 현재 접속중인 DBMS 서버에 SQL 명령을 전달하기 위한 Statement 객체를 반환하는 메소드
// > 매개변수에 전달되는 값에 따라 Statement 객체에 의해 생성되는 ResultSet 객체의
//커서에 대한 이동 설정 및 커서가 위치한 처리행의 조작 설정 가능
// resultSetType : ResultSet 커서의 이동 관련 속성값(ResultSet 인터페이스의 상수) 전달
// > ResultSet.TYPE_FORWARD_ONLY : ResultSet 커서를 다음행으로만 이동 가능 - 기본
// > ResultSet.TYPE_SCROLL_INSENSITIVE : ResultSet 커서를 자유롭게 이동 가능 - 데이타베이스 변경 미반영
// > ResultSet.TYPE_SCROLL_SENSITIVE : ResultSet 커서를 자유롭게 이동 가능 - 데이타베이스 변경 반영
// resultSetConcurrency : ResultSet 커서가 위치한 처리행의 조작 관련 속성값(ResultSet 인터페이스의 상수) 전달
// > ResultSet.CONCUR_READ_ONLY : ResultSet 커서가 위치한 처리행 조작 불가능 - 기본
// > ResultSet.CONCUR_UPDATABLE : ResultSet 커서가 위치한 처리행 조작 가능
stmt = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
sql = "select * from student order by no";
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"));
1행 : 학번 = 1000, 이름 = 홍길동
3행 : 학번 = 3000, 이름 = 전우치
2행 : 학번 = 2000, 이름 = 임꺽정
// 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"));
}
3행 : 학번 = 3000, 이름 = 전우치
2행 : 학번 = 2000, 이름 = 임꺽정
1행 : 학번 = 1000, 이름 = 홍길동
// ResultSet.beforeFirst() : ResultSet 커서를 BOF(Before Of File)로 이동하는 메소드
rs.beforeFirst();
while(rs.next()) {
System.out.println(rs.getRow() + "행 : 학번 = " + rs.getInt("no") + ", 이름 = " + rs.getString("name"));
}
1행 : 학번 = 1000, 이름 = 홍길동
2행 : 학번 = 2000, 이름 = 임꺽정
3행 : 학번 = 3000, 이름 = 전우치
stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
// ResultSet 커서가 위치한 처리행을 조작하기 위해서는 SELECT 명령의 검색대상에 [*] 사용 불가능
sql = "select no,name,phone,address,birthday from student order by no";
rs = stmt.executeQuery(sql);
/*
rs.absolute(2);
// ResultSet.updateXXX(String columnLabel, XXX value) : ResultSet 객체에서 ResultSet 커서가 위치한 처리행의 컬럼값을 변경하는 메소드
// > XXX는 컬럼값을 변경하기 위해 전달받기 위한 Java 자료형
rs.updateString("name", "임걱정");
// ResultSet.updateRow() : ResultSet 객체에서 ResultSet 커서가 위치되어 변경된
// 컬럼값이 저장된 행을 실제 테이블에 적용하여 변경 처리하는 메소드
rs.updateRow();
*/
/*
rs.absolute(3);
// ResultSet.moveToInsertRow() : ResultSet 객체에서 ResultSet 커서가 위치한 다음행에
//새로운 행을 삽입하고 기존행은 다음행으로 차례대로 이동 처리하는 메소드
rs.moveToInsertRow();
// 새롭게 삽입된 행의 컬럼값을 변경
rs.updateInt("no", 4000);
rs.updateString("name", "일지매");
rs.updateString("phone", "010-6715-9081");
rs.updateString("address", "서울시 종로구");
rs.updateString("birthday", "2000-12-31");
// esultSet.insertRow() : ResultSet 객체에서 삽입된 행을 실제 테이블에 적용하여 삽입 처리하는 메소드
rs.insertRow();
*/
// rs.absolute(4);
// R esultSet.deleteRow() : ResultSet 객체에서 ResultSet 커서가 위치한 처리행을 삭제하고 실제 테이블에 적용하여 삭제 처리하는 메소드
// rs.deleteRow();
rs.beforeFirst();
while(rs.next()) {
System.out.println(rs.getRow() + "행 : 학번 = " + rs.getInt("no") + ", 이름 = " + rs.getString("name"));
}
System.out.println("-------------------------------------------------------");
ConnectionFactory.close(con, stmt, rs);
}
}
1행 : 학번 = 1000, 이름 = 홍길동
2행 : 학번 = 2000, 이름 = 임꺽정
3행 : 학번 = 3000, 이름 = 전우치
StatementApp (출력문으로 검색해서 찾아내는 프로그램)
package xyz.itwill.jdbc;
// Statement 객체 : 현재 접속중인 DBMS 서버에 SQL 명령을 전달하여 실행하기 위한 기능을 제공하는 객체
// 장점 : 하나의 Statement 객체를 사용하여 다수의 SQL 명령을 전달하여 실행 가능
// 단점 : SQL 명령에 Java 변수값을 포함할 경우 문자열 결합 기능 사용
// > 문자열 결합을 이용할 경우 가독성 및 유지보수의 효율성 감소
// > InSQL 해킹 기술(값 대신 부분적인 SQL 명령을 포함시키는 해킹 기술)에 취약
// 장점 : 하나의 Statement 객체를 사용하여 다수의 SQL 명령을 전달하여 실행 가능
// 단점 : SQL 명령에 Java 변수값을 포함할 경우 문자열 결합 기능 사용
// > 문자열 결합을 이용할 경우 가독성 및 유지보수의 효율성 감소
// > InSQL 해킹 기술(값 대신 부분적인 SQL 명령을 포함시키는 해킹 기술)에 취약
키보드로 학생 정보를 입력받아 SYUDENT 테이블에 삽입하고
STUDENT 테이블에 저장된 모든 학생정보를 검색하여 출력하는 JDBC 프로그램 ▽
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
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());
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+"')";
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")
+", 전화번호 = " + rs.getString("phone") + ", 주소 = " + rs.getString("address")
+", 생년월일 = " + rs.getString("birthday").substring(0, 10));
}
System.out.println("==============================================================");
ConnectionFactory.close(con, stmt, rs);
<<학생정보 입력>>
학번 입력 >> 2500
이름 입력 >> 정우성
전화번호 입력 >> 01099990000
주소 입력 >> 산왕공고
생년월일 입력 >> 900930
------------------------------------------------------
[결과]1명의 학생정보를 삽입 하였습니다.
------------------------------------------------------
<<학생정보 출력>>
학번 = 1000, 이름 = 홍길동, 전화번호 = 010-1234-5678, 주소 = 서울시 강남구, 생년월일 = 2000-01-01
학번 = 2000, 이름 = 임꺽정, 전화번호 = 010-5754-1241, 주소 = 서울시 종로구, 생년월일 = 2000-05-05
학번 = 2500, 이름 = 정우성, 전화번호 = 01099990000, 주소 = 산왕공고, 생년월일 = 1990-09-30
학번 = 3000, 이름 = 전우치, 전화번호 = 010-8742-2101, 주소 = 서울시 도봉구, 생년월일 = 1999-12-25
==============================================================
키보드로 이름을 입력받아 STUDENT 테이블에 저장된 학생정보 중
해당 이름의 학생정보를 검색하여 출력하는 JDBC 프로그램 작성 ▽
// 키보드로 이름을 입력받아 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")
+", 전화번호 = " + rs.getString("phone")+", 주소 = " + rs.getString("address")
+", 생년월일 = " + rs.getString("birthday").substring(0, 10));
} while(rs.next());
} else {
System.out.println("검색된 학생정보가 없습니다.");
}
System.out.println("------------------------------------------------------");
ConnectionFactory.close(con, stmt, rs);
}
}
<<학생정보 검색>>
이름 입력 >> 정우성
------------------------------------------------------
<< 검색결과 >>
학번 = 2500, 이름 = 정우성, 전화번호 = 01099990000, 주소 = 산왕공고, 생년월일 = 1990-09-30
------------------------------------------------------
*PreparedStatementApp (중요함)
package xyz.itwill.jdbc;
// PreparedStatement 객체 : 현재 접속중인 DBMS 서버에 SQL 명령을 전달하여 실행하기 위한 기능을 제공하는 객체
// 장점 : InParameter를 사용하여 SQL 명령에 Java 변수값을 문자값으로 포함하여 사용 가능
// > InParameter를 사용하여 가독성이 향상되고 유지보수의 효율성 증가
// > InSQL 해킹 기술을 무효화 처리 - InParameter로 전달받은 사용자 입력값은 SQL 명령에서 무조건 문자값으로 처리
// 단점 : 하나의 PreparedStatement는 저장된 하나의 SQL 명령만 전달하여 실행 가능
// 장점 : InParameter를 사용하여 SQL 명령에 Java 변수값을 문자값으로 포함하여 사용 가능
// > InParameter를 사용하여 가독성이 향상되고 유지보수의 효율성 증가
// > InSQL 해킹 기술을 무효화 처리 - InParameter로 전달받은 사용자 입력값은 SQL 명령에서 무조건 문자값으로 처리
// 단점 : 하나의 PreparedStatement는 저장된 하나의 SQL 명령만 전달하여 실행 가능
키보드로 학생 정보를 입력받아 SYUDENT 테이블에 삽입하고
STUDENT 테이블에 저장된 모든 학생정보를 검색하여 출력하는 JDBC 프로그램 ▽
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
// PreparedStatement 객체 : 현재 접속중인 DBMS 서버에 SQL 명령을 전달하여 실행하기 위한 기능을 제공하는 객체
// 장점 : InParameter를 사용하여 SQL 명령에 Java 변수값을 문자값으로 포함하여 사용 가능
// > InParameter를 사용하여 가독성이 향상되고 유지보수의 효율성 증가
// > InSQL 해킹 기술을 무효화 처리 - InParameter로 전달받은 사용자 입력값은 SQL 명령에서 무조건 문자값으로 처리
// 단점 : 하나의 PreparedStatement는 저장된 하나의 SQL 명령만 전달하여 실행 가능
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();
// Connection.prepareStatement(String sql) : Connection 객체로부터 SQL 명령이 저장된 PreparedStatement 객체를 반환하는 메소드
// > PreparedStatement 객체에 저장되는 SQL 명령에는 ?(InParameter) 기호 사용
// InParameter : Java 변수값을 제공받아 SQL 명령의 문자값으로 표현하기 위한 기호
String sql1 = "insert into student values(?,?,?,?,?)"; // 불완전한 SQL 명령
PreparedStatement pstmt = con.prepareStatement(sql1);
// PreparedStatement.setXXX(int parameterIndex, XXX value)
// > PreparedStatement 객체에 저장된 SQL 명령의 InParameter에 Java 변수값을 전달하는 메소드
// > XXX : InParameter에 전달하기 위한 값에 대한 Java 자료형
// > parameterIndex : InParameter의 위치값(첨자) - 1부터 1씩 증가되는 정수값
// > 반드시 모든 InParameter에 Java 변수값을 전달받아 완전한 SQL 명령 완성
pstmt.setInt(1, no);
pstmt.setString(2, name);
pstmt.setString(3, phone);
pstmt.setString(4, address);
pstmt.setString(5, birthday);
// PreparedStatement.executeUpdate() : PreparedStatement 객체에 저장된 DML 명령을
// 전달하여 실행하고 조작행을 갯수를 정수값(int)로 반환하는 메소드
int rows = pstmt.executeUpdate();
System.out.println("[결과]" + rows + "명의 학생정보를 삽입 하였습니다.");
System.out.println("==============================================================");
// STUDENT 테이블에 저장된 모든 학생정보를 검색하여 출력 처리
String sql2 = "select * from student order by no";
pstmt = con.prepareStatement(sql2);
// PreparedStatement.executeUpdate() : PreparedStatement 객체에 저장된 SELECT 명령을
// 전달하여 실행하고 모든 검색행이 저장된 ResultSet 객체를 반환하는 메소드
ResultSet rs = pstmt.executeQuery();
System.out.println("<<학생정보 출력>>");
while(rs.next()) {
System.out.println("학번 = " + rs.getInt("no") + ", 이름 = " + rs.getString("name")
+ ", 전화번호 = " + rs.getString("phone") + ", 주소 = " + rs.getString("address")
+ ", 생년월일 = " + rs.getString("birthday").substring(0, 10));
}
System.out.println("==============================================================");
ConnectionFactory.close(con, pstmt, rs);
<<학생정보 입력>>
학번 입력 >> 2500
이름 입력 >> 정대만
전화번호 입력 >> 01014140000
주소 입력 >> 북산고
생년월일 입력 >> 900414
==============================================================
[결과]1명의 학생정보를 삽입 하였습니다.
==============================================================
<<학생정보 출력>>
학번 = 1000, 이름 = 홍길동, 전화번호 = 010-1234-5678, 주소 = 서울시 강남구, 생년월일 = 2000-01-01
학번 = 1500, 이름 = 정우성, 전화번호 = 01099990000, 주소 = 산왕공고, 생년월일 = 1990-09-09
학번 = 2000, 이름 = 임꺽정, 전화번호 = 010-5754-1241, 주소 = 서울시 종로구, 생년월일 = 2000-05-05
학번 = 2500, 이름 = 정대만, 전화번호 = 01014140000, 주소 = 북산고, 생년월일 = 1990-04-14
==============================================================
키보드로 이름을 입력받아 STUDENT 테이블에 저장된 학생정보 중,
해당 이름의 학생정보를 검색하여 출력하는 JDBC프로그램 ▽
// 키보드로 이름을 입력받아 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")
+", 전화번호 = " + rs.getString("phone") + ", 주소 = " + rs.getString("address")
+", 생년월일 = " + rs.getString("birthday").substring(0, 10));
} while(rs.next());
} else {
System.out.println("검색된 학생정보가 없습니다.");
}
System.out.println("==============================================================");
ConnectionFactory.close(con, pstmt, rs);
}
}
<<학생정보 검색>>
이름 입력 >> 정대만
----------------------------------------------
<<검색결과>>
학번 = 2500, 이름 = 정대만, 전화번호 = 01014140000, 주소 = 북산고, 생년월일 = 1990-04-14
==============================================================
SqlMinusApp
package xyz.itwill.jdbc;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
// 키보드로 SQL 명령을 입력받아 DBMS 서버에 전달하여 실행하고 실행결과를 출력하는 JDBC 프로그램 작성
// > 키보드로 INSERT,UPDATE,DELETE,SELECT 명령만 입력받아 실행되도록 작성
// > SQL 명령은 [exit] 명령을 입력하기 전까지 반복적으로 입력받아 실행 - 대소문자 미구분
// > 입력받은 SQL 명령이 잘못된 경우 에러 메세지 출력
public class SqlMinusApp {
public static void main(String[] args) throws Exception {
// 키보드로 SQL 명령을 입력받기 위한 입력스트림 생성
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
Connection con = ConnectionFactory.getConnection();
Statement stmt = con.createStatement();
ResultSet rs = null;
System.out.println("SQLMinus 프로그램을 실행합니다.(종료 : exit)");
while(true) {
// 키보드로 SQL 명령을 입력받아 저장
System.out.print("SQL> ");
// 키보드로 입력받은 문자열의 앞과 뒤에 존재하는 모든 공백을 제거한 후 변수에 저장
String sql = in.readLine().trim();
// 키보드 입력값이 없는 경우 반복문을 처음부터 다시 실행
if(sql == null || sql.equals("")) continue;
// 키보드 입력값이 [exit]인 경우 반복문 종료 - 프로그램 종료
if(sql.equalsIgnoreCase("exit")) break;
// 입력받은 SQL 명령을 전달하여 실행하고 실행결과를 반환받아 출력
}
ConnectionFactory.close(con, stmt, rs);
System.out.println("SQLMinus 프로그램을 종료합니다.");
}
}
SQLMinus 프로그램을 실행합니다.(종료 : exit)
SQL> exit
SQLMinus 프로그램을 종료합니다.