본문 바로가기

카테고리 없음

JDBC -2

driver man

connection 

 

『 Connection 명령어 』

 

					String url = "jdbc:oracle:thin:@localhost:1521:xe";
					String user = "hr";
					String password = "hr";
					Class.forName("oracle.jdbc.driver.OracleDriver");
                    Connection conn = DriverManager.getConnection(url, user, password);

 

 

 

 

 

 

 

 

	} catch (ClassNotFoundException e) {

					e.printStackTrace();
				} // try~catch 문, : 프로그램의 예외처리를 실행하는 구문, try : 실행, Catch : try문의 로직 실행 중 오류 발생시,
					// 실행
				catch (SQLException e) { // SQL 커넥션에 대한 예외처리.

					e.printStackTrace();
				} finally { // db관련 연결 객체 종료, 종료하지 않을 경우 연결된 객체들이 쌓이게 되면서 DB연결에 문제 발생.
					try { if(pst != null) {
						pst.close();
					}
					if(conn != null) {
						conn.close()
					}

					} catch (SQLException e) {
						e.printStackTrace();
					}

				}// finally 는 try~catch 문과는 상관없이 무조건 실행,-> 오류뜨면 catch에서 끝나버리므로 정상종료가 안된 상태임. // 
				//db에 보낼 query문 작성, PreparedStatement 객체 이용

모든 DB는 연결을 반복하면서 관련 객체가 쌓이게 되는데, 

이는 정상적으로 연결되지 않아 예외처리가 된 DB Conn을 포함한다. 

따라서 Finally 문을 통해 pst 와 conn 이 연결중일때 각각 pst conn을 닫아주는 조건문을 추가하였다.

 

 

데이터 베이스 삽입,삭제,갱신에 대한 메서드 : executeUpdate();

데이터 베이스 조회에 대한 메서드 : executeQuery();

 

package jdbc;

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

public class jdbc_main {

	public static void main(String[] args) {
		Connection conn = null;
		PreparedStatement pst = null;
		ResultSet rs = null; // select 문 사용할 때 필요한 객체
		String name;
		int age;
		String gender;

		Scanner sc = new Scanner(System.in);
		boolean isPlay = true;

		while (isPlay) {
			System.out.println("[1] 회원등록 [2] 회원수정 [3] 회원조회 [4] 회원삭제 [5] 종료");
			int select = sc.nextInt();

			switch (select) {
			case 1:
				System.out.print("이름: ");
				name = sc.next();
				System.out.println("나이 :");
				age = sc.nextInt();
				System.out.println("성별: ");
				gender = sc.next();
				// 1. JDBC 드라이버를 로딩하여야 함. // 동적 로딩,
				try {
					String url = "jdbc:oracle:thin:@localhost:1521:xe";
					String user = "";
					String password = "";
					Class.forName("oracle.jdbc.driver.OracleDriver");

					// 2.DB 연결
					conn = DriverManager.getConnection(url, user, password);
					if (conn == null) {
						//System.out.println("db연결 오류");
					} else {
						//System.out.println("db 연결 성공");

					}
					// finally 는 try~catch 문과는 상관없이 무조건 실행,-> 오류뜨면 catch에서 끝나버리므로 정상종료가 안된 상태임. //
					// db에 보낼 query문 작성, PreparedStatement 객체 이용
					String sql = "insert into member values(?,?,?)"; // 넣을 sql 쿼리
					pst = conn.prepareStatement(sql);
					pst.setString(1, name); // 매개변수의 위치및 , 위에 sql문에 ? 세개가 있는데 그 위치, 1은 첫번째 물음표
					pst.setInt(2, age);
					pst.setString(3, gender);
					pst.executeUpdate();
					// executeUpdate() -> db에 수정을 하겠다. = insert, delete, update는 이 기능을 사용해야함
					// executeQuery() -> Db에 쿼리를 주겠다 = Select 사용해야함

					// 4. query 실행
				} catch (ClassNotFoundException e) {

					e.printStackTrace();
				} // try~catch 문, : 프로그램의 예외처리를 실행하는 구문, try : 실행, Catch : try문의 로직 실행 중 오류 발생시,
					// 실행
				catch (SQLException e) { // SQL 커넥션에 대한 예외처리.

					e.printStackTrace();
				} finally { // db관련 연결 객체 종료, 종료하지 않을 경우 연결된 객체들이 쌓이게 되면서 DB연결에 문제 발생.
					try {
						if (pst != null) {
							pst.close();
						}
						if (conn != null) {
							conn.close();
						}

					} catch (SQLException e) {
						e.printStackTrace();
					}

				}
				System.out.println("등록완료");
				break;
			case 2:
				//나이만 수정하는 기능을 구현하시오. *insert 기능과 마찬가지로..
				System.out.print("수정할 사람의 이름을 입력하세요: \n");
				name = sc.next();
				System.out.println("몇 살로 바꾸시겠습니까? :");
				age = sc.nextInt();
				//System.out.println("성별: ");
				//gender = sc.next();
				// 1. JDBC 드라이버를 로딩하여야 함. // 동적 로딩,
				try {
					String url = "jdbc:oracle:thin:@localhost:1521:xe";
					String user = "hr";
					String password = "hr";
					Class.forName("oracle.jdbc.driver.OracleDriver");

					// 2.DB 연결
					conn = DriverManager.getConnection(url, user, password);
					if (conn == null) {
						//System.out.println("db연결 오류");
					} else {
						//System.out.println("db 연결 성공");

					}
					// finally 는 try~catch 문과는 상관없이 무조건 실행,-> 오류뜨면 catch에서 끝나버리므로 정상종료가 안된 상태임. //
					// db에 보낼 query문 작성, PreparedStatement 객체 이용
					String sql = "update member set age=? where name = ?"; // set= ? 와 같이 쓰지 않고 set [컬럼명] = ? (?은 해당 번째의 위치하는 문장)
					pst = conn.prepareStatement(sql);
					pst.setInt(1, age);
					pst.setString(2, name);
					pst.executeUpdate();
					// executeUpdate() -> db에 수정을 하겠다. = insert, delete, update는 이 기능을 사용해야함
					// executeQuery() -> Db에 쿼리를 주겠다 = Select 사용해야함

					// 4. query 실행
				} catch (ClassNotFoundException e) {

					e.printStackTrace();
				} // try~catch 문, : 프로그램의 예외처리를 실행하는 구문, try : 실행, Catch : try문의 로직 실행 중 오류 발생시,
					// 실행
				catch (SQLException e) { // SQL 커넥션에 대한 예외처리.

					e.printStackTrace();
				} finally { // db관련 연결 객체 종료, 종료하지 않을 경우 연결된 객체들이 쌓이게 되면서 DB연결에 문제 발생.
					try {
						if (pst != null) {
							pst.close();
						}
						if (conn != null) {
							conn.close();
						}

					} catch (SQLException e) {
						e.printStackTrace();
					}

				}
				System.out.println("수정완료");
				
				break;
			case 3:
				// 1. JDBC 드라이버를 로딩하여야 함. // 동적 로딩,
				try {
					String url = "jdbc:oracle:thin:@localhost:1521:xe";
					String user = "hr";
					String password = "hr";
					Class.forName("oracle.jdbc.driver.OracleDriver");

					// 2.DB 연결
					conn = DriverManager.getConnection(url, user, password);
					if (conn == null) {
						//System.out.println("db연결 오류");
					} else {
						//System.out.println("db 연결 성공");

					}

					String sql = "select* from member";
					pst = conn.prepareStatement(sql);
					rs = pst.executeQuery(); // 사용시 ResultSet 임포트 필요., DB에 저장된 정보를 ResultSet 객체에 저장
					// rs.next() -> 다음 행으로 넘어가 데이터가 있는지 없는지를 True, False 반환

					// resultset 객체에 저장된 DB정보 가져오기
					while (rs.next()) {
						String getName = rs.getString(1);
						int getAge = rs.getInt(2);
						String getGender = rs.getString(3);

						System.out.println(getName + "/" + getAge + "/" + getGender);
					}
				} catch (ClassNotFoundException e) {

					e.printStackTrace();
				} // try~catch 문, : 프로그램의 예외처리를 실행하는 구문, try : 실행, Catch : try문의 로직 실행 중 오류 발생시,
					// 실행
				catch (SQLException e) { // SQL 커넥션에 대한 예외처리.

					e.printStackTrace();
				} finally { // db관련 연결 객체 종료, 종료하지 않을 경우 연결된 객체들이 쌓이게 되면서 DB연결에 문제 발생.
					try {
						if (pst != null) {
							pst.close();
						}
						if (conn != null) {
							conn.close();
						}

					} catch (SQLException e) {
						e.printStackTrace();
					}

				}
				
				//
				break;
			case 4:
				//나이만 수정하는 기능을 구현하시오. *insert 기능과 마찬가지로..
				System.out.print("삭제할 사람의 이름을 입력하세요: \n");
				name = sc.next();
				//System.out.println("성별: ");
				//gender = sc.next();
				// 1. JDBC 드라이버를 로딩하여야 함. // 동적 로딩,
				try {
					String url = "jdbc:oracle:thin:@localhost:1521:xe";
					String user = "hr";
					String password = "hr";
					Class.forName("oracle.jdbc.driver.OracleDriver");

					// 2.DB 연결
					conn = DriverManager.getConnection(url, user, password);
					if (conn == null) {
						//System.out.println("db연결 오류");
					} else {
						//System.out.println("db 연결 성공");

					}
					// finally 는 try~catch 문과는 상관없이 무조건 실행,-> 오류뜨면 catch에서 끝나버리므로 정상종료가 안된 상태임. //
					// db에 보낼 query문 작성, PreparedStatement 객체 이용
					String sql = "delete from member where name = ?"; // set= ? 와 같이 쓰지 않고 set [컬럼명] = ? (?은 해당 번째의 위치하는 문장)
					pst = conn.prepareStatement(sql);
					pst.setString(1, name);
					pst.executeUpdate();
					// executeUpdate() -> db에 수정을 하겠다. = insert, delete, update는 이 기능을 사용해야함
					// executeQuery() -> Db에 쿼리를 주겠다 = Select 사용해야함

					// 4. query 실행
				} catch (ClassNotFoundException e) {

					e.printStackTrace();
				} // try~catch 문, : 프로그램의 예외처리를 실행하는 구문, try : 실행, Catch : try문의 로직 실행 중 오류 발생시,
					// 실행
				catch (SQLException e) { // SQL 커넥션에 대한 예외처리.

					e.printStackTrace();
				} finally { // db관련 연결 객체 종료, 종료하지 않을 경우 연결된 객체들이 쌓이게 되면서 DB연결에 문제 발생.
					try {
						if (pst != null) {
							pst.close();
						}
						if (conn != null) {
							conn.close();
						}

					} catch (SQLException e) {
						e.printStackTrace();
					}

				}
				System.out.println("삭제완료");
				break;
			case 5:
				System.out.println("프로그램 종료");
				isPlay = false;
				break;
			default:
				break;
			} // end switch
		} // end while

	}
}

 

이렇게 나오면 문장이 너무 길어지기 때문에 메서드화를 실행하였다.

 

우클릭 - Refactor - Extract method 를 통해 메서드를 정의한다

 

이것은 코드를 짧게 줄이는데에 효율적으로 사용될 수 있다.

 

package jdbc;

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

public class jdbc_main {
	static Connection conn = null;
	static PreparedStatement pst = null;
	static ResultSet rs = null; // select 문 사용할 때 필요한 객체 // static 영역으로 빼줘서 모든 메서드가 접근 가능하게,(공유하게)
	
	public static void main(String[] args) {
		
		
		String name;
		int age;
		String gender;

		Scanner sc = new Scanner(System.in);
		boolean isPlay = true;

		
		while (isPlay) {
			System.out.println("[1] 회원등록 [2] 회원수정 [3] 회원조회 [4] 회원삭제 [5] 종료");
			int select = sc.nextInt();

			switch (select) {
			
			
			
			
			case 1:
				System.out.print("이름: ");
				name = sc.next();
				System.out.println("나이 :");
				age = sc.nextInt();
				System.out.println("성별: ");
				gender = sc.next();
				// 1. JDBC 드라이버를 로딩하여야 함. // 동적 로딩,
				insertMember(name, age, gender);
				System.out.println("등록완료");
				break;
				
				
				
				
			case 2:
				//나이만 수정하는 기능을 구현하시오. *insert 기능과 마찬가지로..
				System.out.print("수정할 사람의 이름을 입력하세요: \n");
				name = sc.next();
				System.out.println("몇 살로 바꾸시겠습니까? :");
				age = sc.nextInt();
				//System.out.println("성별: ");
				//gender = sc.next();
				// 1. JDBC 드라이버를 로딩하여야 함. // 동적 로딩,
				updateMember(name, age);
				System.out.println("수정완료");
				
				break;
				
				
				
				
			case 3:
				// 1. JDBC 드라이버를 로딩하여야 함. // 동적 로딩,
				selectMember();
				
				//
				break;
				
				
				
				
			case 4:
				//나이만 수정하는 기능을 구현하시오. *insert 기능과 마찬가지로..
				System.out.print("삭제할 사람의 이름을 입력하세요: \n");
				name = sc.next();
				//System.out.println("성별: ");
				//gender = sc.next();
				// 1. JDBC 드라이버를 로딩하여야 함. // 동적 로딩,
				deleteMember(name);
				System.out.println("삭제완료");
				break;
				
				
				
				
			case 5:
				System.out.println("프로그램 종료");
				isPlay = false;
				break;
			default:
				break;
			} // end switch
		} // end while

	}

	private static void deleteMember(String name) {
		try {
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "hr";
			String password = "hr";
			Class.forName("oracle.jdbc.driver.OracleDriver");

			// 2.DB 연결
			conn = DriverManager.getConnection(url, user, password);
			if (conn == null) {
				//System.out.println("db연결 오류");
			} else {
				//System.out.println("db 연결 성공");

			}
			// finally 는 try~catch 문과는 상관없이 무조건 실행,-> 오류뜨면 catch에서 끝나버리므로 정상종료가 안된 상태임. //
			// db에 보낼 query문 작성, PreparedStatement 객체 이용
			String sql = "delete from member where name = ?"; // set= ? 와 같이 쓰지 않고 set [컬럼명] = ? (?은 해당 번째의 위치하는 문장)
			pst = conn.prepareStatement(sql);
			pst.setString(1, name);
			pst.executeUpdate();
			// executeUpdate() -> db에 수정을 하겠다. = insert, delete, update는 이 기능을 사용해야함
			// executeQuery() -> Db에 쿼리를 주겠다 = Select 사용해야함

			// 4. query 실행
		} catch (ClassNotFoundException e) {

			e.printStackTrace();
		} // try~catch 문, : 프로그램의 예외처리를 실행하는 구문, try : 실행, Catch : try문의 로직 실행 중 오류 발생시,
			// 실행
		catch (SQLException e) { // SQL 커넥션에 대한 예외처리.

			e.printStackTrace();
		} finally { // db관련 연결 객체 종료, 종료하지 않을 경우 연결된 객체들이 쌓이게 되면서 DB연결에 문제 발생.
			try {
				if (pst != null) {
					pst.close();
				}
				if (conn != null) {
					conn.close();
				}

			} catch (SQLException e) {
				e.printStackTrace();
			}

		}
	}

	private static void selectMember() {
		try {
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "hr";
			String password = "hr";
			Class.forName("oracle.jdbc.driver.OracleDriver");

			// 2.DB 연결
			conn = DriverManager.getConnection(url, user, password);
			if (conn == null) {
				//System.out.println("db연결 오류");
			} else {
				//System.out.println("db 연결 성공");

			}

			String sql = "select* from member";
			pst = conn.prepareStatement(sql);
			rs = pst.executeQuery(); // 사용시 ResultSet 임포트 필요., DB에 저장된 정보를 ResultSet 객체에 저장
			// rs.next() -> 다음 행으로 넘어가 데이터가 있는지 없는지를 True, False 반환

			// resultset 객체에 저장된 DB정보 가져오기
			while (rs.next()) {
				String getName = rs.getString(1);
				int getAge = rs.getInt(2);
				String getGender = rs.getString(3);

				System.out.println(getName + "/" + getAge + "/" + getGender);
			}
		} catch (ClassNotFoundException e) {

			e.printStackTrace();
		} // try~catch 문, : 프로그램의 예외처리를 실행하는 구문, try : 실행, Catch : try문의 로직 실행 중 오류 발생시,
			// 실행
		catch (SQLException e) { // SQL 커넥션에 대한 예외처리.

			e.printStackTrace();
		} finally { // db관련 연결 객체 종료, 종료하지 않을 경우 연결된 객체들이 쌓이게 되면서 DB연결에 문제 발생.
			try {
				if (pst != null) {
					pst.close();
				}
				if (conn != null) {
					conn.close();
				}

			} catch (SQLException e) {
				e.printStackTrace();
			}

		}
	}

	private static void updateMember(String name, int age) {
		try {
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "hr";
			String password = "hr";
			Class.forName("oracle.jdbc.driver.OracleDriver");

			// 2.DB 연결
			conn = DriverManager.getConnection(url, user, password);
			if (conn == null) {
				//System.out.println("db연결 오류");
			} else {
				//System.out.println("db 연결 성공");

			}
			// finally 는 try~catch 문과는 상관없이 무조건 실행,-> 오류뜨면 catch에서 끝나버리므로 정상종료가 안된 상태임. //
			// db에 보낼 query문 작성, PreparedStatement 객체 이용
			String sql = "update member set age=? where name = ?"; // set= ? 와 같이 쓰지 않고 set [컬럼명] = ? (?은 해당 번째의 위치하는 문장)
			pst = conn.prepareStatement(sql);
			pst.setInt(1, age);
			pst.setString(2, name);
			pst.executeUpdate();
			// executeUpdate() -> db에 수정을 하겠다. = insert, delete, update는 이 기능을 사용해야함
			// executeQuery() -> Db에 쿼리를 주겠다 = Select 사용해야함

			// 4. query 실행
		} catch (ClassNotFoundException e) {

			e.printStackTrace();
		} // try~catch 문, : 프로그램의 예외처리를 실행하는 구문, try : 실행, Catch : try문의 로직 실행 중 오류 발생시,
			// 실행
		catch (SQLException e) { // SQL 커넥션에 대한 예외처리.

			e.printStackTrace();
		} finally { // db관련 연결 객체 종료, 종료하지 않을 경우 연결된 객체들이 쌓이게 되면서 DB연결에 문제 발생.
			try {
				if (pst != null) {
					pst.close();
				}
				if (conn != null) {
					conn.close();
				}

			} catch (SQLException e) {
				e.printStackTrace();
			}

		}
	}

	private static void insertMember(String name, int age, String gender) {
		try {
			String url = "jdbc:oracle:thin:@localhost:1521:xe";
			String user = "hr";
			String password = "hr";
			Class.forName("oracle.jdbc.driver.OracleDriver");

			// 2.DB 연결
			conn = DriverManager.getConnection(url, user, password);
			if (conn == null) {
				//System.out.println("db연결 오류");
			} else {
				//System.out.println("db 연결 성공");

			}
			// finally 는 try~catch 문과는 상관없이 무조건 실행,-> 오류뜨면 catch에서 끝나버리므로 정상종료가 안된 상태임. //
			// db에 보낼 query문 작성, PreparedStatement 객체 이용
			String sql = "insert into member values(?,?,?)"; // 넣을 sql 쿼리
			pst = conn.prepareStatement(sql);
			pst.setString(1, name); // 매개변수의 위치및 , 위에 sql문에 ? 세개가 있는데 그 위치, 1은 첫번째 물음표
			pst.setInt(2, age);
			pst.setString(3, gender);
			pst.executeUpdate();
			// executeUpdate() -> db에 수정을 하겠다. = insert, delete, update는 이 기능을 사용해야함
			// executeQuery() -> Db에 쿼리를 주겠다 = Select 사용해야함

			// 4. query 실행
		} catch (ClassNotFoundException e) {

			e.printStackTrace();
		} // try~catch 문, : 프로그램의 예외처리를 실행하는 구문, try : 실행, Catch : try문의 로직 실행 중 오류 발생시,
			// 실행
		catch (SQLException e) { // SQL 커넥션에 대한 예외처리.

			e.printStackTrace();
		} finally { // db관련 연결 객체 종료, 종료하지 않을 경우 연결된 객체들이 쌓이게 되면서 DB연결에 문제 발생.
			try {
				if (pst != null) {
					pst.close();
				}
				if (conn != null) {
					conn.close();
				}

			} catch (SQLException e) {
				e.printStackTrace();
			}

		}
	}
}

 

static 영역에 커넥션 prepared, Resultset을 null로 초기화 주었다, Static영역이기에

다른 메서드와 해당 값을 공유할 수 있다.

 

 

마지막으로 DAO 클래스를 생성해 기능을 분리하여 넣은 후

메인 메서드에서 DAO 객체를 선언하여  사용할 수 있도록 하였다.