본문 바로가기

3월 ~ 5월) 자바/jdbc

33Day - SelectEmpApp / DeleteStudentApp / ConnectionFactory & ConnectionFactoryApp / ExecuteApp / ResultSetMetaDataApp / ResultSetCursorApp / StatementApp / PreparedStatementApp / SqlMinusApp

빌드처리꼭해줌 (프로젝트 만들때)

프리페리어스 중요함.

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 명령을 포함시키는 해킹 기술)에 취약

키보드로 학생 정보를 입력받아  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 명령만 전달하여 실행 가능

 

키보드로 학생 정보를 입력받아  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 프로그램을 종료합니다.