-
데이터를 입력받아 DB에 접근하기 - PreparedStatement를 활용JAVA/DataBase 2020. 10. 22. 23:11
아래의 글을 먼저 읽고 오자.
designatedroom87.tistory.com/213?category=897688
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
PhoneBook.java
MessagePhoneBookService.java
이 부분은 길다. 우선 이 클래스 내에는 함수 4개가 정의되엉 있다.
Select, Insert, Delete, Update 에 대한 함수들이다.
위의 기능을 그대로 가지고 온 것이라고 생각해도 된다.
각 함수별로 이 클래스를 보도록 하자.
PhoneBookUI.java
MessagePhoneBookService.java
PhoneBook.java
PhoneBookUI.java
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
소스 파일
'JAVA > DataBase' 카테고리의 다른 글
SQL 문을 하나로 통합해서 DB에 연결하기 (0) 2020.10.23 데이터를 입력받아 DB에 접근하기 (0) 2020.10.20 SQL의 Delete구문을 이용하기 (0) 2020.10.20 SQL의 Update구문을 이용하기 (0) 2020.10.20 SQL의 Insert구문을 이용해서 데이터 저장하기 (0) 2020.10.19