Java와 SQL 연결하기 - insert into, delete, update, select, Class.forname, Connection, PreparedStatement, ResultSet

2019. 4. 9. 17:40JAVA

-------------------------------------java와 sql 연결하기-------------------------------------

1. 자바와 sql을 연결할려면 jdbc driver(jdbc api)를 설치해야한다.
                (오라클을 설치하면 자동적으로 같이 설치된다.)

2. 연결할 자바 프로젝트에 Build Path -> config Build Path -> Add External JARs 로 아래경로의 jar을 추가한다.
                ※. C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib\ojdbc6.jar







/////////////////////////////////insert into

JDBC 코딩 절차
                1. JDBC 드라이버 메모리에 로딩

                                Class.ForName("완전한 클래스이름");
                                * Class.forName() 메소드응 지정된 클래스이름의 클래스 (설계도)를 
                                   JVM 메모리의 설계도 영역에 로딩시킨다.
   


                                * 드라이버 레지스트리에 Oracle JDBC Driver를 등록시키는 정적코드 블록이
                                   자동으로 실행된다.

                                // JDBC 드라이버 로딩                 
                                Class.forName("oracfle.jdbc.OracleDriver");

                                1). OracleDriver.class 파일이 설계도 영역에 로딩된다.
                                2). OracleDriver.class의 정적코드 블록이 자동으로 실행된다.
                                3). JVM의 드라이버레지스트리에 오라클 JDBC 드라이버를 등록한다.



                2. Database와 연결을 유지하는 Conection객체 획득하기

                                String url = "jdbc:oracle:thin:@localhost:1521:xe";
                                                //-드라이버의이름-:-드라이버의 위치-
                                String user = "hr";
                                String password = "zxcv1234";
                                Connection connection = DriverManager.getConnection(url, user, password);
                                * url : 연결할 Database를 식별하기 위한 url
                                                "jdbc:oracle:thin" -> 드라이버 레지스트리에 등록된 Oracle JDBC Driver의 명칭
                                                "localhost" -> Database가 설치된 PC
                                                "1521" -> Database가 점유하고 있는 포트번호
                                                "xe" -> Database의 식별자 
                                * DriverManager는 드라이버 레지스트리를 관리하는 기능을 지원하는 클래스다.
                                * DriverManager의 getConnection() 메소드를 사용하면 지정된 URL이 가르키는 Database와
                                  연결을 유지하는 Connection객체가 획득된다.
   



                3. 실행할 SQL을 Database로 전송/실행하는 PrepareStatement 객체 획득하기

                                // 3. 실행할 쿼리 정의
                                String sql = "insert into user_contacts"
                                    +"(user_no, user_name, user_phone, user_create_date)"
                                    +"values"
                                    +"(?, ?, ?, sysdate)"; // 값이 무엇이 들어갈지 몰라 ?를 쓰고 값에만 ?를 쓸수있다.
                                
                                // 4. 쿼리를 데이터베이스로 전송하는 PreparedStatement객체 획득하기
                                PreparedStatement pstmt = connection.prepareStatement(sql);
                
                                // 5. PreparedStatment의 setXXX (인덱스, 값) 메소드를 사용해서 ?와 치환될 값 설정하기
                                pstmt.setInt(1, 100);
                                pstmt.setString(2, "홍길동");
                                pstmt.setString(3, "010-1111-1111");

                                * PreperedStatment는 쿼리와 값을 데이터베이스로 전송한다.
                                * PreperedStatment가 사용하는 쿼리에 ?가 있으면 setXXX(순서, 값)를 사용해서 
                                   ?와 치환될 값을 설정해야 한다.


예시) 보기


                4. 쿼리 실행하기

                                // 6. 쿼리 실행
                                int rowCount = pstmt.executeUpdate();
                                System.out.println(rowCount + "개의 행이 추가되었습니다.");

                                * int executeUpdate() 메소드는 INSER, UPDATE, DELETE 구문을 실행할 때 사용한다.
                                * executeUpdate() 메소드가 반환하는 값은 추가된 행의 갯수, 삭제된 행의 갯수 

                                혹은 변경된 행의 갯수다.



                5. 자원(Connection, PreparedStatement) 해제하기

                                // 7. 자원해제
                                pstmt.close();
                                connection.close();
                                // 꼭 해제해줘야함





                JAVA와 SQL 연결하여 쿼리실행 - 전체 코딩





                Scanner 입출력을 만든다음 아래처럼 설정하면 입력값이 들어간다.


                Scanner sc = new Scanner(System.in);

                System.out.println("주소록 등록 프로그램");

                System.out.print("순번 입력 > ");
                int no = sc.nextInt();
                System.out.print("이름 입력 > ");
                String name = sc.next();
                System.out.print("연락처 입력 > ");
                String phone = sc.next();

 

 

 









////////////////////////////////////////delete

delete는 insert into와 거의 같지만 String sql 문의 sql문이  다르다.
또한 삭제이기 때문에 .setString 및 .setInt를 안써도 된다.


                   import java.sql.Connection;
                   import java.sql.DriverManager;
                   import java.sql.PreparedStatement;

                   public class DeleteDemo {

                           public static void main(String[] args) throws Exception {
                                String sql ="delete from user_contacts where user_name = ?";
                                Class.forName("oracle.jdbc.OracleDriver");

                                // 또한 DriverManager도 한번에 다 작성이 가능하다.
                                                                                        Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "hr", "zxcv1234");

                                PreparedStatement pstmt = connection.prepareStatement(sql);
                                pstmt.setString(1, "김유신");
                                int rowCount = pstmt.executeUpdate();
                                System.out.println(rowCount + "개의 행이 삭제되었습니다.");
                
                                pstmt.close();
                                connection.close();


                                                }
                                }





///////////////////////////////////////update

update 또한 insert into와 다 똑같고 String sql만 다르게 작성하면 된다.



                import java.sql.Connection;
                import java.sql.DriverManager;
                import java.sql.PreparedStatement;
                import java.util.Scanner;

                public class UpdateDemo {

                                public static void main(String[] args) throws Exception {
                                                String sql = "update user_contacts "
                                                                                     + "set "
                                                                                     + "user_name = ?, "
                                                                                     + "user_phone = ? "
                                                                                     + "where user_no = ? ";
                                                Scanner sc = new Scanner(System.in);

                                System.out.print("수정할 사용자 번호 입력 > ");
                                int no = sc.nextInt();
                                System.out.print("수정할 사용자 이름 입력 > ");
                                String name = sc.next();
                                System.out.print("수정할 사용자 연락처 입력 > ");
                                String phone = sc.next();

                                Class.forName("oracle.jdbc.OracleDriver");

                                Connection connection = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "hr", "zxcv1234");
                                PreparedStatement pstmt = connection.prepareStatement(sql);

                                pstmt.setString(1, name);
                                pstmt.setString(2, phone);
                                pstmt.setInt(3, no);

                                int rowCount = pstmt.executeUpdate();
                                System.out.println(rowCount + "개의 행이 변경되었습니다.");

                                pstmt.close();
                                connection.close();
                }
}







///////////////////////////////select

select문을 java에서 실행할경우 특징
 - 기존 insert, delete, update대 사용된 executeUpdate()를 select경우 executeQuery()로 쓴다.
 - ResultSet 메소드를 사용해서 커서를 이동하는데 next() 를 이용하여 이동한다.
   또한 커서위치에서만 데이터를 조회할 수 있다.
   





import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class SelectDemo {

                public static void main(String[] args) throws Exception {
                                String sql = "select * from user_contacts";

                                Class.forName("oracle.jdbc.OracleDriver");
                                Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:xe", "hr", "zxcv1234");
                                PreparedStatement pstmt = conn.prepareStatement(sql);



                                // 기존 insert, delete, update대 사용된 executeUpdate()를 select경우 executeQuery()로 쓴다.
                                ResultSet rs = pstmt.executeQuery();

                                //ResultSet 메소드를 사용해서 커서를 이동하는데 next() 를 이용하여 이동한다.
                                //  또한 커서위치에서만 데이터를 조회할 수 있다.
                                //  데이터가 있으면 true 없으면 false로 나옴
                                // System.out.println(rs.next());  //true
                                // System.out.println(rs.next());  //true
                                // System.out.println(rs.next());  //true
                                // System.out.println(rs.next());  //false

                                // 데이터가 있을경우 계속 출력
                                while(rs.next()) {
                                                int no = rs.getInt("user_no");
                                                String name = rs.getString("user_name");
                                                String phone = rs.getString("user_phone");

                                                System.out.println(no+", "+name+", "+phone);
                                }
                                rs.close();
                                pstmt.close();
                                conn.close();
                }
}