JDBC : JDBC 자바 연동과정, 정적 sql문

brave_chicken·2024년 4월 14일

잇(IT)생 챌린지

목록 보기
25/90

어플리케이션 등록 방법

advancedJava 프로젝트 우클릭 - build path - config build path
-라이브러리 - class path - add external JARs-
C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib에서 6버전 클릭해서 적용

JDBC(Java Database Connectivity)

:자바와 DBMS와 연동하기 위한 기술
(java프로그램에서 SQL문을 실행(DML,DQL(Query))하기 위해서 제공되는 API)

<오라클에 접속하기 전에 해야할일>

JVM이 인식할 수 있는 위치로 오라클 드라이버 연결
=>코드를 실행하기 위해서 JVM이 찾을 수 있는 위치
=>1.application은 Build Path에서 라이브러리로 등록
=>2.web은 lib에 복사

<JDBC 연동하기>

1. 오라클 드라이버를 로딩

  • 실행할 때 인식할 수 있도록 메모리에 올리는 작업
  • 클래스를 동적으로 메모리에 로딩하는 작업.
  • java.lang패키지의 Class라는 클래스의 forName메소드를 이용해서 오라클 드라이버의 핵심클래스를 메모리에 올리는 작업을 먼저 해야한다.
  • 핵심클래스는 드라이버클래스를 의미하며 이 드라이버 클래스는 어떤 DBMS를 쓰냐에 따라 달라진다.

[문법]
Class.forName("핵심클래스의 full path - 패키지를 포함한 클래스명");

[오라클]

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

[MySQL]

Class.forName("com.mysql.cj.jdbc.Driver");

2. DB서버에 연결

: java.sql패키지의 DriverManager클래스의 메소드를 이용해서 연결
public static Connection getConnection(String url, String user, String password) throws SQLException

1) static메소드이므로 클래스명으로 엑세스

2) 매개변수

url : DBMS에 연결하기 위해 필요한 정보가 담겨있는 문자열
(어떤 DBMS를 사용하냐에 따라 내부에서 인식될 문자열이 다른 형식으로 만들어져서 제공)

[오라클]

jdbc:oracle:thin:@ip:port:데이터베이스서비스명
jdbc:oracle:thin => 오라클에서 사용하는 프로토콜
@ip:port => DBMS가 설치되어 있는 서버의 ip와 port(1521)
데이터베이스서비스명 => 오라클 설치할 때 설정하는 서비스명, express edition버전은 xe

user: 사용자계정(scott,hr..)
pass: 계정의 패스워드 (tiger,hr..)

[mysql]

jdbc:mysql://ip:port:데이터베이스서비스명 ??
user: 사용자계정(scott,hr..)
pass: 계정의 패스워드 (tiger,hr..)

3) 리턴타입(다형성 적용되어있음)

  • java.sql.Connection을 리턴
  • DriverManager클래스의 getConnection메소드는 매개변수로 전달받은 값을 활용해서 DB서버에 연결하고 연결정보를 객체(java.sql.Connection)로 만들어서 리턴

=> 어떤 드라이버가 로딩되었냐에 따라 Connection의 다른 하위객체가 리턴
(어떤 DBMS를 사용하냐에 따라 다른 드라이버가 연결될 것이므로 해당 드라이버에 속한 파일이 리턴)
=> 이 Connection의 하위객체를 이용해서 SQL문을 실행할때 연결정보를 받아서 사용할 수 있다.

*SOLID의 S(Single responsibility principle)(단일책임의 원칙)
: 하나의 클래스는 하나의 책임만 가져야함

3.SQL문을 실행하기 위한 객체생성

Connection객체의 메소드를 이용해서 SQL문을 실행할 수 있는 객체를생성

[상속구조]
Statement ---> 정적 SQL을 실행할 때 사용(보안 취약)

PreparedStatement ---> 동적 SQL을 실행할 때 사용(secure코딩에 적합, 캐시사용)

CallableStatement ---> 각 DBMS에 특화된 SQL로 작성된 명령문을 실행(PL/SQL)

1) Statement객체를 이용

Connection객체가 갖고있는 createStatement메소드를 이용해서 생성
[형식]
Statement stmt = con.createStatement()

=>어떤 DBMS를 사용하냐에 따라 다른 Statement객체가 만들어짐

2) PreparedStatement객체를 이용

  • Connection객체가 갖고있는 prepareStatement메소드를 이용해서 생성
  • 캐시사용

[sql실행]
<1> 쿼리문장을 분석
<2> 컴파일
<3> 실행

Statement는 SQL을 실행하는 과정에서 매번 3단계의 내용을 처리하고 있지만 prepareStatement는 한번만 작업하고 캐시에서 꺼내서 사용

  • prepareStatement객체가 sql문을 실행하는 방식은 SQL문을 미리 파싱해놓고 외부에서 입력받아야 하는 값들은 실행할때 전달받아서 sql문이 실행될 수 있도록 처리

(1) sql문을 미리 파싱할 수 있도록 외부에서 입력받아서 처리해야 하는 부분만 ?로 대체해서 sql문을 정의

String sql = "select * from member where id=? and pass=?"
=> ?에는 필드가 올 수 없고 무조건 값만 연결될 수 있다.(컬럼명은 ?로 처리못함)
=> 순수한 값만 올 수 있고 기호는 ?에 같이 연결해서 사용할 수 없다('?'는 인식못함)

(2) prepareStatement객체를 생성할 때 sql문을 매개변수로 넘긴다.

=> Connection의 prepareStatement 메소드를 호출할때 sql을 넘겨 sql문을 미리 파싱해놓도록 작업한다.
[형식]
PrepareStatement ptmt = con.prepareStatement(sql)

(3) ?에 대한 값을 셋팅

=> ?는 외부에서 입력받는 값을 셋팅해야하므로 메소드를 이용해서 설정
=> ?를 셋팅해야 하므로 setXX메소드가 많이 있다.
=> setXXX의 메소드와 오라클 타입은 ResultSet과 동일
ptmt.setXXXX(1, "jang") => 첫번째 ?에 "jang"을 대입하기
1=> ?의 순서

4. SQL실행

1) Statement객체사용

(1) executeUpdate : insert, update, delete 명령문을 실행

  • 매개변수로 전달된 sql문을 실행
  • 결과로 몇개의 row가 반영됐는지 리턴
    int result(몇개 행이 삽입,수정,삭제됐는지 리턴) = stmt.executeUpdate(sql문)

(2) executeQuery : select 명령문을 실행

  • 실행한 후 조회된 테이블을 기턴, DBMS에서 조회된 테이블을 자바에서 사용할 수 있도록 만들어놓은 객체가 ResultSet
  • 어떤 DBMS를 쓰냐에 따라 다른 하위객체가 리턴

2) PrepareStatement객체사용

  • sql문을 미리 PrepareStatement객체를 만들면서 전달했으므로 메소드를 호출할때는 sql문을 전달하지 않는다.

(1) executeUpdate : insert, update, delete 명령문을 실행

int result = ptmt.executeUpdate()

(2) executeQuery : select 명령문을 실행

ResultSet rs = ptmt.executeQuery()

5. 결과처리

1) insert, delete, update

  • 모두 int를 리턴하므로 동일한 방법으로 처리

2) select

  • 결과가 2차원표로 보이는 테이블에 리턴, 테이블에 저장된 데이터를 자바에서 사용할 수 있도록 만들어진 객체

  • ResultSet에 저장된 데이터를 읽기 위해서 ResultSet의 메소드를 이용해서 작업

  • 레코드를 읽기 위해서 포지션이 바뀌도록 next()메소드를 호출
    => next() 메소드:다음 레코드로 포지션을 이동(Cursor를 맞춘다~표현)

  • 한번에 하나의 컬럼만을 읽을수있다

  • 레코드 갯수만큼 반복작업을 수행해야한다

  • 한 레코드의 컬럼을 읽기 위해서 ResultSet에 getXXXX메소드(오라클 컬럼의 타입에 따라 선택)가 지원된다.

    오라클타입이 varchar2 / char : java의 String
    getString(컬럼명)
    getString(컬럼index)
    -> 원본데이터의 컬럼순서가 아니라 조회된 테이블의 컬럼순서
    -> (index는 1부터 시작)
    오라클타입이 number이면 java의 int : getInt(컬럼명)
    오라클타입이 date이면 java의 java.sql.Date : gerDate(컬럼명)

  • 반복작업
    while(rs.next()){->true/false를 리턴(레코드있으면 true, 없으면 false를 리턴)
    //레코드의 각 컬럼을 읽기
    }

6. 자원반납 -> 반드시 해줘야하는 작업

  • 클라이언트가 점유해서 사용하던 자원을 반납해야한다.
  • Connection, Statement, ResultSet까지 모든 자원을 반납
    (insert,update,delete는 Connection과 Statement만 close하면 됨.)
    (select는 resultSet으로 결과를 반환하니 Connection과 Statement, resultSet까지 close)
  • close메소드를 이용해서 처리
  • 만들어진 순서가 아니라 가장 마지막에 생성된 객체부터 반납

기타

  • ORA-00001: unique constraint -> 프라이머리키 위배..
  • sqlplus만 오토커밋이 아님. 자바에서 하는건 다 오토커밋임!!

실습

연습을 위한 sql문

  • member 테이블 만들기
SQL> create table member(
  2             id varchar2(20) primary key,
  3             pass varchar2(20),
  4             name varchar2(20),
  5             addr varchar2(20),
  6             regdate date,
  7             point number(10),
  8             info varchar2(20));

Table created.

SQL> insert into member values ('bts1','1234','슈가','대구',sysdate,10000,'래퍼');

1 row created.

SQL> commit;

Commit complete.

SQL> select * from member;

ID                                       PASS                                     NAME                                     ADDR                                     REGDATE       POINT INFO
---------------------------------------- ---------------------------------------- ---------------------------------------- ---------------------------------------- -------- ---------- ----------------------------------------
bts1                                     1234                                     슈가                                     대구                                     24/04/12      10000 래퍼
bts2                                     1234                                     RM                                       일산                                     24/04/12      10000 리더

Statement(정적SQL)

ConnectionTest / 드라이버 로딩 & DB서버 연결

public class ConnectionTest {
	public static void main(String[] args) {
		String url="jdbc:oracle:thin:@192.168.0.4:1521:xe";
		String user="scott";
		String password="tiger";
		try {
//			1. 오라클 드라이버 로딩
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("드라이버로딩성공!!");
//			2.DB서버 연결
			Connection con = DriverManager.getConnection(url, user, password);
			//상위타입으로 선언했지만(con) 실제 실행되는 것은 상속받은 하위클래스의 Connection객체가 리턴
			System.out.println("연결성공!!"+con);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

InsertTest / Statement(정적SQL)를 이용해서 insert문 실행하기

public class InsertTest {
	public static void main(String[] args) {
		String url="jdbc:oracle:thin:@192.168.0.4:1521:xe";
		String user="scott";
		String password="tiger";
		String sql="insert into member values('test','1234','test','광주',sysdate,10000,'목소리')";
		try {
//			1.드라이버로딩
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("드라이버로딩성공!!");
//			2. 연결하기
			Connection con = DriverManager.getConnection(url, user, password);
			System.out.println("연결성공!!"+con);
//			3.SQL문을 실행하기 위한 객체를 만들기
			Statement stmt = con.createStatement();
			System.out.println("Statement객체 생성완료!!"+stmt);
//			4.SQL문 실행하기
			int result = stmt.executeUpdate(sql);
//			5. 결과처리
			System.out.println(result+"개 행 삽입성공!!");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch(SQLException e) {
			e.printStackTrace();
		}
	}
}

SelectTest / Statement(정적SQL)로 select문 실행

public class SelectTest {
	public static void main(String[] args) {
		String url = "jdbc:oracle:thin:@192.168.0.4:1521:xe";
		String user = "scott";
		String password = "tiger";
		String sql = "select * from member";
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			
			Connection con = DriverManager.getConnection(url, user, password);
			
			Statement stmt = con.createStatement();
			
			//모든 select문은 동일하게 작업
			ResultSet rs = stmt.executeQuery(sql);
			System.out.println(rs);
			//결과처리 - 조회된 모든 레코드를 읽기
            //while한번실행되는게 레코드하나읽는것
			while(rs.next()) {
				System.out.print(rs.getString("id")+"\t");
				System.out.print(rs.getString("pass")+"\t");
				System.out.print(rs.getString("name")+"\t");
				System.out.print(rs.getString(4)+"\t");
				System.out.print(rs.getDate(5)+"\t");
				System.out.print(rs.getInt("point")+"\t");
				System.out.println(rs.getString(7));
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

CloseTest / 자원반납

public class CloseTest {
	public static void main(String[] args) {
		String url = "jdbc:oracle:thin:@192.168.0.4:1521:xe";
		String user = "scott";
		String password = "tiger";
		String sql = "select * from member";
		
		Connection con = null;
		Statement stmt = null;
		ResultSet rs = null;
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			
			con = DriverManager.getConnection(url, user, password);
			
			stmt = con.createStatement();
			
			//모든 select문은 동일하게 작업
			rs = stmt.executeQuery(sql);
			System.out.println(rs);
			//결과처리 - 조회된 모든 레코드를 읽기
			while(rs.next()) {//while한번실행되는게 레코드하나읽는것
				System.out.print(rs.getString("id")+"\t");
				System.out.print(rs.getString("pass")+"\t");
				System.out.print(rs.getString("name")+"\t");
				System.out.print(rs.getString(4)+"\t");
				System.out.print(rs.getDate(5)+"\t");
				System.out.print(rs.getInt("point")+"\t");
				System.out.println(rs.getString(7));
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			//ResultSet -> Statement -> Connection순서로 반납
			try {
				if(rs!=null) rs.close();
				if(stmt!=null) stmt.close();
				if(con!=null) con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			
		}
	}
}

미션1. UppdateTest / Statement(정적 SQL)를 이용해서 update문 실행하기

  • 하나하나 모두 입력해서 테스트
  • addr이 서울시인 모든 레코드의 addr을 서울 특별시로 변경하기
public class UppdateTest {
	public static void main(String[] args) {
		String url = "jdbc:oracle:thin:@192.168.0.4:1521:xe";
		String user = "scott";
		String password = "tiger";
		String sql = "update member ";//띄어쓰기해줘야 set인식할수있음 
		sql = sql+"set addr='서울특별시' ";
		sql = sql+"where addr='서울시'";
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			
			Connection con = DriverManager.getConnection(url, user, password);
			
			Statement stmt = con.createStatement();
			
			stmt.executeUpdate(sql);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

미션2. DeleteTest / Statement(정적 SQL)를 이용해서 delete문 실행하기

  • UpdateTest.java를 rename해서 sql문만 변경하고 테스트해보기
  • id가 test인 레코드를 삭제
public class DeleteTest {
	public static void main(String[] args) {
		String url = "jdbc:oracle:thin:@192.168.0.4:1521:xe";
		String user = "scott";
		String password = "tiger";
		StringBuffer sql = new StringBuffer();
//string은 하나하나객체로 만들어지니, 
//문자열 조작이 빈번해지면 stringbuffer를 쓰기(한번만생성됨, 효율위해)!! 
		sql.append("delete member ");
		sql.append("where id='test'");
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			
			Connection con =DriverManager.getConnection(url, user, password);
			
			Statement stmt = con.createStatement();
			
			stmt.executeUpdate(sql.toString());
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}
SQL> select * from member;

ID                                       PASS                                     NAME                                     ADDR                                     REGDATE       POINT INFO
---------------------------------------- ---------------------------------------- ---------------------------------------- ---------------------------------------- -------- ---------- ---------------------------------------
### bts1                                     1234                                     슈가                                     대구                                     24/04/12      10000 래퍼
bts2                                     1234                                     RM                                       일산                                     24/04/12      10000 리더
bts3                                     1234                                     진                                       서울특별시                               24/04/12      10000 멋져
bts4                                     1234                                     뷔                                       서울특별시                               24/04/12      10000 서진이네
bts5                                     1234                                     지민                                     광주                                     24/04/12      10000 목소리
test                                     1234                                     test                                     광주                                     24/04/12      10000 목소리

6 rows selected.

delete 후

SQL> select * from member;

ID                                       PASS                                     NAME                                     ADDR                                     REGDATE       POINT INFO
---------------------------------------- ---------------------------------------- ---------------------------------------- ---------------------------------------- -------- ---------- ---------------------------------------
bts1                                     1234                                     슈가                                     대구                                     24/04/12      10000 래퍼
bts2                                     1234                                     RM                                       일산                                     24/04/12      10000 리더
bts3                                     1234                                     진                                       서울특별시                               24/04/12      10000 멋져
bts4                                     1234                                     뷔                                       서울특별시                               24/04/12      10000 서진이네
bts5                                     1234                                     지민                                     광주                                     24/04/12      10000 목소리

미션.3 LoginTest / tatement(정적 SQL)를 이용해서 select문 실행 활용

id와 pass가 일치하면
___님 로그인성공 메세지 출력
일치하지않으면
로그인실패

public class LoginTest {
	public static void main(String[] args) {
		String sql = "select * from where member id ='bts1' and pass='1234'";//로그인성공
//		String sql = "select * from where member id ='bts11' and pass='1234'";//로그인실패
		String url = "jdbc:oracle:thin:@192.168.0.4:1521:xe";
		String user = "scott";
		String password = "tiger";
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			
			Connection con = DriverManager.getConnection(url, user, password);
			
			Statement stmt = con.createStatement();
			
			//모든 select문은 동일하게 작업
			ResultSet rs = stmt.executeQuery(sql);
			System.out.println(rs);
			//결과처리 - 조회된 모든 레코드를 읽기
			if(rs.next()) {
				System.out.print(rs.getString("name")+"님 로그인 성공");
			}else {
				System.out.print("로그인 실패");
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

PreparedStatement(동적 SQL)

PreparedInsertTest / PreparedStatement(동적SQL)를 이용해서 insert문 실행하기

public class PreparedInsertTest {
	public static void main(String[] args) {
		PreparedInsertTest obj = new PreparedInsertTest();
		Scanner key = new Scanner(System.in);
		System.out.print("아이디:");
		String id = key.next();
		
		System.out.print("패스워드:");
		String pass = key.next();
		
		System.out.print("성명:");
		String name = key.next();
		
		System.out.print("주소:");
		String addr = key.next();
		
		System.out.print("기타정보:");
		String info = key.next();
		
		obj.insert(id, pass, name, addr, info);
	}
	public void insert(String id, String pass, String name, String addr, String info) {
		String url="jdbc:oracle:thin:@192.168.0.4:1521:xe";
		String user="scott";
		String password="tiger";
		String sql="insert into member values('"+id+"','"+pass+"','"+name+"','"+addr+"',sysdate,10000,'"+info+"')";
//		큰따옴표가 들어가는 이유는 String이라서 큰따옴표로 묶어주느라
		try {
//			1.드라이버로딩
			Class.forName("oracle.jdbc.driver.OracleDriver");
			System.out.println("드라이버로딩성공!!");
//			2. 연결하기
			Connection con = DriverManager.getConnection(url, user, password);
			System.out.println("연결성공!!"+con);
//			3.SQL문을 실행하기 위한 객체를 만들기
			Statement stmt = con.createStatement();
			System.out.println("Statement객체 생성완료!!"+stmt);
//			4.SQL문 실행하기
			int result = stmt.executeUpdate(sql);
//			5. 결과처리
			System.out.println(result+"개 행 삽입성공!!");
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch(SQLException e) {
			e.printStackTrace();
		}
	}
}

PreparedUppdateTest / PreparedStatement(동적 SQL)를 이용해서 update문 실행하기

public class PreparedUppdateTest {
	public static void main(String[] args) {
		PreparedUppdateTest obj = new PreparedUppdateTest();
		Scanner key = new Scanner(System.in);
		
		System.out.print("기존 주소:");
		String bad = key.next();
		
		System.out.print("변경할 주소:");
		String aad = key.next();
		
		obj.update(bad, aad);
	}
	public void update(String bad, String aad) {
		String url = "jdbc:oracle:thin:@192.168.0.4:1521:xe";
		String user = "scott";
		String password = "tiger";
		String sql = "update member "+ "set addr='"+aad+"' where addr="+"'"+bad+"'";
		
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			
			Connection con =DriverManager.getConnection(url, user, password);
			
			Statement stmt = con.createStatement();
			
			stmt.executeUpdate(sql);
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

PreparedDeleteTest /PreparedStatement(동적 SQL)를 이용해서 delete문 실행하기

public class PreparedDeleteTest {
	public static void main(String[] args) {
		PreparedDeleteTest obj = new PreparedDeleteTest();
		
		Scanner key = new Scanner(System.in);
		System.out.println("삭제할 아이디:");
		String did = key.next();
		
		obj.delete(did);
	}
	public void delete(String did) {
		String url = "jdbc:oracle:thin:@192.168.0.4:1521:xe";
		String user = "scott";
		String password = "tiger";
		StringBuffer sql = new StringBuffer();//string은 하나하나객체로 만들어지니, 문자열 조작이 빈번해지면 stringbuffer를 쓰기(한번만생성됨, 효율위해)!! 
		sql.append("delete member ");
		sql.append("where id='"+did+"'");
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			
			Connection con =DriverManager.getConnection(url, user, password);
			
			Statement stmt = con.createStatement();
			
			stmt.executeUpdate(sql.toString());
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

PreparedSelectTest / PreparedStatement로 select

public class PreparedSelectTest {
	public static void main(String[] args) {
		PreparedSelectTest obj = new PreparedSelectTest();
		
		obj.select();
	}
	public void select() {
		String url = "jdbc:oracle:thin:@192.168.0.4:1521:xe";
		String user = "scott";
		String password = "tiger";
		String sql = "select * from member";
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			
			Connection con = DriverManager.getConnection(url, user, password);
			
			Statement stmt = con.createStatement();
			
			//모든 select문은 동일하게 작업
			ResultSet rs = stmt.executeQuery(sql);
			System.out.println(rs);
			//결과처리 - 조회된 모든 레코드를 읽기
			while(rs.next()) {//while한번실행되는게 레코드하나읽는것
				System.out.print(rs.getString("id")+"\t");
				System.out.print(rs.getString("pass")+"\t");
				System.out.print(rs.getString("name")+"\t");
				System.out.print(rs.getString(4)+"\t");
				System.out.print(rs.getDate(5)+"\t");
				System.out.print(rs.getInt("point")+"\t");
				System.out.println(rs.getString(7));
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

PreparedLoginTest

public class PreparedLoginTest {
	public static void main(String[] args) {
		PreparedLoginTest obj = new PreparedLoginTest();
		
		Scanner key = new Scanner(System.in);
		System.out.print("아이디:");
		String id = key.nextLine();
		
		System.out.print("패스워드:");
		String pass = key.nextLine();
		
		obj.login(id, pass);
	}
	public void login(String id,String pass) {
		String sql = "select * from member where id ='"+id+"' and pass='"+pass+"'";
		String url = "jdbc:oracle:thin:@192.168.0.4:1521:xe";
		String user = "scott";
		String password = "tiger";
		
		Connection con = null;
		Statement stmt = null;
		ResultSet rs = null;
		try {
			Class.forName("oracle.jdbc.driver.OracleDriver");
			con = DriverManager.getConnection(url, user, password);
			stmt = con.createStatement();
			rs = stmt.executeQuery(sql);
			
			if(rs.next()) {
				System.out.print(rs.getString("name")+"님 로그인 성공");
			}else {
				System.out.print("님 로그인 실패");//이거질문하기
			}
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			try {
				if(rs!=null) rs.close();
				if(stmt!=null) stmt.close();
				if(con!=null) con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}

본 포스팅은 멀티캠퍼스의 멀티잇 백엔드 개발(Java)의 교육을 수강하고 작성되었습니다.

0개의 댓글