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 객체를 선언하여 사용할 수 있도록 하였다.