ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 데이터를 입력받아 DB에 접근하기 - PreparedStatement를 활용
    JAVA/DataBase 2020. 10. 22. 23:11

    아래의 글을 먼저 읽고 오자.

    designatedroom87.tistory.com/213?category=897688

     

    데이터를 입력받아 DB에 접근하기

    우선 테이블을 하나 만들도록 한다. 테이블에 저장할 데이터는 번호(정수), 이름(String), 전화번호(String),메모(String) 이다. create table Phonebook(no NUMBER(3), name varchar2(20), phonenum varch..

    designatedroom87.tistory.com

     

    SelectPhonebook.java

    소스 코드

    더보기
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    public class SelectPhonebook {
    	public static void main(String[] args) throws ClassNotFoundException, SQLException {
    		//1.ojdbc6.jar 드라이버를 라이브러리로 포함(bulid path)
    		//2.드라이버 로딩
    		Class.forName("oracle.jdbc.driver.OracleDriver");
    		Connection conn=DriverManager.getConnection(
    		"jdbc:oracle:thin:@localhost:1521:xe","hr","1234");
    		//url,id,password
    		
    		if(conn==null) {System.out.println("DB접속에 실패");}
    		System.out.println("DB접속 성공");
    		
    		ResultSet rs=null;
    		
    		String sql="select * from phonebook where no=?";
    		PreparedStatement pstmt=conn.prepareStatement(sql);
    		
    		//	물음표를 채우기
    		pstmt.setInt(1, 2);
    		
    		rs=pstmt.executeQuery();
    		
    		//결과를 가지고 출력하는 방법 알아보기
    		while(rs.next()) {
    			int no=rs.getInt("no");
    			String name=rs.getString("name");
    			String phonenum=rs.getString("phonenum");
    			String memo=rs.getString("memo");
    			
    			System.out.printf("%d %s %s %s\n",no, name, phonenum ,memo);
    		}
    		rs.close();
    		pstmt.close();
    		conn.close();
    	}
    }

     

     

     

    InsertPhonebook.java

    소스 코드

    더보기

     

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import java.util.Scanner;
    
    public class InsertPhonebook {
    	public static void main(String[] args) throws ClassNotFoundException, SQLException {
    		
    		Class.forName("oracle.jdbc.driver.OracleDriver");
    		Connection conn=DriverManager.getConnection(
    		"jdbc:oracle:thin:@localhost:1521:xe","hr","1234");
    		
    		if(conn==null) 	{System.out.println("DB접속에 실패");}
    		else			{System.out.println("DB접속 성공");}
    		
    		int no;
    		String name,phonenum,memo;
    		Scanner input=new Scanner(System.in);
    		System.out.println("번호 이름 전화번호 메모 입력(2 홍길동 010-1111-1111 없음)");
    		no=input.nextInt();
    		name=input.next();
    		phonenum=input.next();
    		memo=input.next();
    		
    		String sql="insert into Phonebook(no,name,phonenum,memo) values(?,?,?,?)";
    		
    		//	미리 문장을 만들어 놓는다.
    		PreparedStatement pstmt=conn.prepareStatement(sql);//SQL문을 넣어준다.
    		
    		//	물음표를 채워 넣는다.
    		pstmt.setInt(1, no);
    		pstmt.setNString(2, name);
    		pstmt.setNString(3, phonenum);
    		pstmt.setNString(4, memo);
    		
    		//	완성된 문장을 실행. 이 때, SQL문장은 필요없다.
    		int result=pstmt.executeUpdate();
    		System.out.println(result+"개가 입력되었습니다.");
    		
    		input.close();
    		pstmt.close();
    		conn.close();
    	}
    }

     

     

     

    UpdatePhonebook.java

    소스 코드

    더보기
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import java.util.Scanner;
    
    public class UpdatePhonebook {
    	public static void main(String[] args) throws ClassNotFoundException, SQLException {
    		
    		Class.forName("oracle.jdbc.driver.OracleDriver");
    		Connection conn=DriverManager.getConnection(
    		"jdbc:oracle:thin:@localhost:1521:xe","hr","1234");
    		//url,id,password
    		
    		if(conn==null) {System.out.println("DB접속에 실패");}
    		System.out.println("DB접속 성공");
    		
    		String search_name;
    		String phonenum;
    		
    		Scanner input=new Scanner(System.in);
    		System.out.println("이름과 전화번호를 입력해 변경하세요.");
    		search_name=input.next();
    		phonenum=input.next();
    		
    		String sql="update Phonebook set phonenum=? where name=?";
    		PreparedStatement pstmt=conn.prepareStatement(sql);
    		
    		pstmt.setNString(1, phonenum);
    		pstmt.setNString(2, search_name);
    		
    		int result=pstmt.executeUpdate();
    		System.out.println(result+"개가 수정되었습니다.");
    		
    		input.close();
    		pstmt.close();
    		conn.close();
    	}
    }

     

     

     

    DeletePhonebook.java

    소스 코드

    더보기
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import java.util.Scanner;
    
    public class DeletePhonebook {
    	public static void main(String[] args) throws ClassNotFoundException, SQLException 
    	{
    		Class.forName("oracle.jdbc.driver.OracleDriver");
    		Connection conn=DriverManager.getConnection(
    		"jdbc:oracle:thin:@localhost:1521:xe","hr","1234");
    		//url,id,password
    		
    		if(conn==null) {System.out.println("DB접속에 실패");}
    		System.out.println("DB접속 성공");
    	
    		String name;
    				
    		Scanner input=new Scanner(System.in);
    		System.out.println("이름 입력해 삭제 하세요.");
    		name=input.next();
    				
    		String sql="delete from Phonebook where name=?";
    		PreparedStatement pstmt=conn.prepareStatement(sql);
    		
    		pstmt.setNString(1, name);
    		
    		int result=pstmt.executeUpdate();
    		System.out.println(result+"개가 삭제되었습니다.");
    		
    		input.close();
    		pstmt.close();
    		conn.close();
    	}
    }

     

     

     

     

    그리고, 여기까지만 끝내기에는 아쉽다.

    그 이유는 위의 각 SQL문이 서로 따로따로 만들어져 있어서 이들을 하나로 통합한 프로그램을 만들어 보자.

    즉, 1을 입력하면 데이터를 저장하고, 2를 입력하면 데이터를 출력하고, 3을 입력하면 데이터를 수정하는

    그런 프로그램이다.

    위의 각 질의에 대해 처리 하는 클래스를 데이터 베이스 접속 처리(DAO : Data Access Object) 라 한다.

    이 클래스의 이름을 MessagePhoneBookService 클래스라고 한다.

    그리고 select 쿼리에서는 데이터들을 담아 와야 하기 때문에 이 데이터를 담을 자료구조를 선택해야 하는데

    ArrayList를 사용하도록 한다.

    그리고 데이터들은 하나 클래스로 표현을 하도록 하자. 클래스의 이름은 PhoneBook 이라 하자.

    그리고 실제 main함수가 있는 클래스는 PhoneBookUI 클래스이다.

    만약 작업을 다른 새로운 프로젝트로 하려면 , Build Path에서 다시 지정을 해줘야 한다.

    이는 아래의 부분을 참고하자. Build Path 부분부터 보면 된다.

    designatedroom87.tistory.com/204

     

    DB와 자바를 연결하기

    자바에서 오라클과 연동해보자. oracle db 11버전을 쓰고 있으며, 아래에 다음과 같은 db가 존재한다. 먼저, jdbc driver 11g 를 다운받는다. 우리가 쓰는 오라클 버전과 일치하는 것으로 받아야 한다. 그

    designatedroom87.tistory.com

     

    PhoneBook.java

     

    MessagePhoneBookService.java

    이 부분은 길다. 우선 이 클래스 내에는 함수 4개가 정의되엉 있다.

    Select, Insert, Delete, Update 에 대한 함수들이다.

    위의 기능을 그대로 가지고 온 것이라고 생각해도 된다.

    각 함수별로 이 클래스를 보도록 하자.

     

    PhoneBookUI.java

     

    MessagePhoneBookService.java

    MessagePhoneBookService.java
    0.00MB

     

    PhoneBook.java

    PhoneBook.java
    0.00MB

     

    PhoneBookUI.java

    PhoneBookUI.java
    0.00MB

     

     

     

     

     

    PhoneBookUI.java를 보면, 너무 길다는 생각을 할 것이다.

    이를 좀 나눌 방법이 없는지 찾아보자.

    기존의 PhoneBookUI.java에서 switch ~ case 문을 통해 출력, 삭제, 수정, 입력하는 부분을 따로 떼어내고

    메뉴를 보여주고 메뉴에 대해 선택을 받는 함수를 메소드를 갖는 클래스를 PhoneBookUI 클래스라 하고

    매인 함수를 정의한 클래스를 PhoneBookMain이라고 하자.

    즉, 다음과 같이 나눌 수 있다.

     

    PhoneBookMain.java

     

     

     

    PhoneBookUI.java

     

    그리고, MessagePhoneBookService,java에서 4개의 메소드들을 보면

    아래의 부분이 공통적으로 있다는 사실을 알 수 있다.

    그리고 위의 문장이 의미하는 바는 DB에 접속한다는 내용이다.

    즉, DB에 각 SQL문이 실행될 때마다 이 연결 작업을 계속함을 알 수 있다.

    이는 비 효율적인 작업이며 MessagePhoneBookService 클래스가 인스턴스화가 된 이후에

    DB에 접속한 상태를 유지하는 것이 효율적이다.

    그리고 소멸자를 통해서 이 conn 객체를 close 하자.

    conn 객체를 지역 변수로 선언했던 것을 이제는 MessagePhoneBookService 클래스 내에 필드로 두자.

    MessagePhoneBookService 클래스는 다음과 같다.

     

    MessagePhoneBookService.java

    소스 파일

    MessagePhoneBookService.java
    0.00MB
    PhoneBook.java
    0.00MB
    PhoneBookMain.java
    0.00MB
    PhoneBookUI.java
    0.00MB

     

    댓글

Designed by Tistory.