ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JAVA JDBC과 API
    back-end&DB/Java 2023. 5. 24. 13:38
    728x90

    - JDBC

    Java DataBase Connectivity

    java에서 dataBase에 접속할 수 있도록 하는 API

     

    - API

    Application Programming Interface

    프로그램들과 데이터베이스 그리고 기능들의 상호 통신 방법을 규정하고 도와주는 매개체

     

    1. SQL 세팅

     

    select 로그인(회원 조회)
    insert 회원 가입
    update 회원정보수정
    delete 회원삭제

    1.1 테이블 생성


    JDBC_memver(id, pw, name, age)
    id : pk, age 숫자형, 나머지 문자형

    CREATE TABLE JDBC_member(
        id varchar2(10) primary key,
        pw varchar2(10),
        name varchar2(10),
        age number(5)
    );


    1.2 test 계정(test/test/test/0) 만들기


    회원가입

    insert into JDBC_member values('test','test','test',0);

     

    test 계정 로그인(회원 조회)

    select * from JDBC_member where id = 'test';

     

    test계정 정보수정 pw를 test2로 변경

    update JDBC_member set pw = 'test2' where id = 'test';

     

    test계정 삭제

    DELETE from JDBC_member where id = 'test';

     

    2. JAVA 세팅

     

    회원의 정보 입력받기

    package JDBC;
    
    import java.util.Scanner;
    
    public class Ex01_insert {
    	public static void main(String[] args) {
        
    		Scanner sc = new Scanner(System.in);
    		
    		System.out.println("== 회원가입 ==");
    		System.out.print("ID를 입력 >> ");
    		String id = sc.next();
    		System.out.print("PW를 입력 >> ");
    		String pw = sc.next();
    		System.out.print("NAME를 입력 >> ");
    		String name = sc.next();
    		System.out.print("AGE를 입력 >> ");
    		int age = sc.nextInt();

     

    - JDBC 연결순서

     

    2.1 Oracle 연결에 필요한 외부 lib import

    C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib
    프로젝트 오른쪽 마우스 - build path - configure build path - Add External JARS..
    해당경로에서 ojdbc6.jar 선택 

    2.2 ojdbc6.jar에서 Java와 DB의 연결통로를 만들어줄 JDBC Driver 실행

    try ~ catch문 > 예외처리
    try : 일단  코드가 실행 되는 영역, 에러가 없을 때는 try 밖인 here부분의 코드 실행
    catch : 실행해서 에러가 났을 때 들어오는 영역

    try {
    			Class.forName("oracle.jdbc.driver.OracleDriver");
      
      			// 3 ~ 6까지 대입
      			
      
    		} catch (Exception e) {
    			// catch : try 에서 실행해서 에러가 났을 때 들어오는 영역
    			// Exception(변수명 e) : 어떤 오류가 났는지 알고 있는 객체
    			e.printStackTrace(); // 어떤 오류인지 출력
    		}

     

    2.3 DB에 접속 하기 위한 보안키

    String dburl = "jdbc:oracle:thin:@localhost:1521:xe";
    String dbuser = "hr";
    String dbpw = "hr";

     

    2.4 DriverManager 통해서 DB 접속
    접속 성공 시 Connection 객체로 반환
    접속 실패 시 null로 반환

    		Connection conn = DriverManager.getConnection(dburl, dbuser, dbpw);	
    		if (conn == null) System.out.println("접속실패");
    		else System.out.println("접속성공");

     

    2.5 SQL문장 정리
    SQL 문장에 ; 사용 X
    값을 입력 할때 변하는 값들은 ?로 대체
    변수를 직접 사용하지 않는 이유 > 변수 사용시 하드파싱을 하게 되고 성능이 떨어진다

    String sql = "insert into JDBC_member values(?,?,?,?)";

     

    prepareStatement : SQL 문장이 실행 가능한지 판단하는 역할(오타, 문법에러 등)

    실행 가능하면 PreparedStatement 객체로 반환, psmt 변수에 담아주기

    import java.sql.PreparedStatement;
    //~~중략
    PreparedStatement psmt = conn.prepareStatement(sql);

    실행이 가능하면 ?에 사용자가 입력한 값 채워주기
    psmt.set자료형(?의 순서, 넣을 값)

    		psmt.setString(1, id);
    		psmt.setString(2, pw);
    		psmt.setString(3, name);
    		psmt.setInt(4, age);

     

    7. 객체 종료

    전역 변수로 null값 지정

    finally은 무조건 실행되는 문장

    if문으로 null이 아닐 경우에만 close 실행

    // 전역 변수 선언
    		Connection conn = null;
    		PreparedStatement psmt = null;
    
    // 중략
    
    finally {
    	try {
    		if (psmt != null) psmt.close();
    		if (conn != null) conn.close();
    		} catch (SQLException e) {
    		e.printStackTrace();
    	}
    }

     

    8. java 전체 코드

    package JDBC;
    
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.SQLException;
    import java.util.Scanner;
    
    public class Ex01_insert {
    	public static void main(String[] args) {
    
    		// JDBC(Java Database Connectivity) : Java에서 Database에 접속할 수 있게 도와주는 API
    		// API = 프로그램끼리 상호작용 할 수 있게 도와주는 매개체
    		// API가 필요한 이유? DBMS의 종류는 다양한데, 각 DB마다 JAva에서 접근하는 코드가 다르면 불편하기 때문에
    		// Interface로 규격화 해서 사용하는 것!
    
    		// 회원가입 = 회원테이블에 회원의 정보를 저장하는 기능 > insert명령어
    
    		// 회원의 정보 입력받기
    		Scanner sc = new Scanner(System.in);
    
    		System.out.println("== 회원가입 ==");
    		System.out.print("ID를 입력 >> ");
    		String id = sc.next();
    		System.out.print("PW를 입력 >> ");
    		String pw = sc.next();
    		System.out.print("NAME를 입력 >> ");
    		String name = sc.next();
    		System.out.print("AGE를 입력 >> ");
    		int age = sc.nextInt();
    
    		// 전역 변수 선언
    		Connection conn = null;
    		PreparedStatement psmt = null;
    
    		// JDBC 연결순서
    		// 1. Oracle 연결에 필요한 외부 lib import
    		// C:\oraclexe\app\oracle\product\11.2.0\server\jdbc\lib
    		// 프로젝트 오른쪽 마우스 - build path - configure build path - Add External JARS..
    		// - 해당경로에서 ojdbc6.jar 선택
    
    		// 2. ojdbc6.jar에서 Java와 DB의 연결통로를 만들어줄 JDBC Driver 실행
    
    		// try ~ catch문 > 예외처리
    		// try : 일단 코드가 실행 되는 영역, 에러가 없을 때는 try 밖인 here부분의 코드 실행
    		// catch : 실행해서 에러가 났을 때 들어오는 영역
    		try {
    			Class.forName("oracle.jdbc.driver.OracleDriver");
    
    			// 3. DB에 접속 하기 위한 보안키
    			String dburl = "jdbc:oracle:thin:@localhost:1521:xe";
    			String dbuser = "hr";
    			String dbpw = "hr";
    
    			// 4. DriverManager 통해서 DB 접속
    			// 접속 성공 시 Connection 객체로 반환
    			// 접속 실패 시 null로 반환
    			conn = DriverManager.getConnection(dburl, dbuser, dbpw);
    
    			if (conn == null)
    				System.out.println("접속실패");
    			else
    				System.out.println("접속성공");
    
    			// SQL 연결 끝
    
    			// 5. SQL문장 정리
    			// SQL 문장에 ; 사용 X
    			// 값을 입력 할때 변하는 값들은 ?로 대체
    			// 변수를 직접 사용하지 않는 이유 > 변수 사용시 하드파싱을 하게 되고 성능이 떨어진다
    			String sql = "insert into JDBC_member values(?,?,?,?)";
    
    			// prepareStatement : SQL 문장이 실행 가능한지 판단하는 역할(오타, 문법에러 등)
    			psmt = conn.prepareStatement(sql);
    
    			// 실행이 가능하면 ?에 사용자가 입력한 값 채워주기
    			// psmt.set자료형(?의 순서, 넣을 값)
    			psmt.setString(1, id);
    			psmt.setString(2, pw);
    			psmt.setString(3, name);
    			psmt.setInt(4, age);
    
    			// SQL 문장 명령 준비 끝
    
    			// 6. SQL 실행
    			// executeUpdate : DB에 변화 있을 때 실행 하는 메소드
    			// : int로 반환, int > 실행된 행의 개수(ex. 1행 이(가) 삽입되었습니다.)
    			int row = psmt.executeUpdate();
    
    			// SQL 문장 실행 끝
    
    			if (row > 0)
    				System.out.println("회원가입 성공");
    			else
    				System.out.println("회원가입 실패");
    
    		} catch (Exception e) {
    			// catch : try 에서 실행해서 에러가 났을 때 들어오는 영역
    			// Exception(변수명 e) : 어떤 오류가 났는지 알고 있는 객체
    			e.printStackTrace(); // 어떤 오류인지 출력
    		} finally {
    			try {
    
    				if (psmt != null)
    					psmt.close();
    				if (conn != null)
    					conn.close();
    				sc.close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    		}
    	}
    }

     

    3. select 가능한 코드 만들기

    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 Ex02_select {
    	public static void main(String[] args) {
    
    		// 로그인 = 회원 테이블에 사용자 정보가 있는지 없는지 확인하는 기능
    		// 로그인 정보 입력 받기
    		Scanner sc = new Scanner(System.in);
    		System.out.println("== 로그인 ==");
    		System.out.print("ID를 입력 >> ");
    		String id = sc.next();
    		System.out.print("PW를 입력 >> ");
    		String pw = sc.next();
    		
    		Connection conn = null;
    		PreparedStatement psmt = null;
    		ResultSet  rs = null;
    		
    		String login_id = null;
    		String login_pw = null;
    		String login_name = null;
    		int login_age = 0;
    		
    		// DB접속
    
    		try {
    			// 1. OracleDriver Class 불러오기 > 통로
    			Class.forName("oracle.jdbc.driver.OracleDriver");
    
    			// 2. 보안키
    			String dburl = "jdbc:oracle:thin:@localhost:1521:xe";
    			String dbuser = "hr";
    			String dbpw = "hr";
    
    			// 3. DriverManager통해서 접속 유지 확인 > Connection 객체로 반환
    			conn = DriverManager.getConnection(dburl, dbuser, dbpw);
    			if (conn != null)
    				System.out.println("접속성공");
    			else
    				System.out.println("접속실패");
    
    			// 4. SQL 준비
    			 String sql = "select * from JDBC_member where id = ? and pw = ?";
    
    			// 실행 가능한 sql 문장인지 판단
    			psmt = conn.prepareStatement(sql);
    
    			// ?에 값 채우기
    			psmt.setString(1, id);
    			psmt.setString(2, pw);
    
    			// 5. SQL 실행
    			// executeQuery : select문장을 실행할 때 사용하는 메소드
    			//				: ResultSet으로 조회 결과를 반환 > 테이블 형태
    			 rs = psmt.executeQuery();
    			
    			// rs의 처음 커서 : 컬럼
    			// rs.next() : 커서를 다음 행으로 이동 > 결과값은 boolean
    			// 해당 행에 값이 있는지 없는지를 결과값으로 반환
    			// 결과값이 있을 떄는 get자료형("컬럼명") 메소드 사용해서 값 가져오기
    			  if(rs.next()) {
    		            login_id = rs.getString("id");
    		            login_pw = rs.getString("pw");
    		            login_name = rs.getString("name");
    		            login_age = rs.getInt("age");
    		         }
    
    			
    		} catch (Exception e) {
    			e.printStackTrace();
    		} finally {
    			try {
    				if (rs != null)
    					rs.close();
    				if (psmt != null)
    					psmt.close();
    				if (conn != null)
    					conn.close();
    				sc.close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    		}
    		
    		if (login_id != null) {
    			System.out.println(login_id+"님의 이름은 "+login_name+login_pw + login_age+"입니다.");
    		}else {
    			System.out.println("아이디 비밀번호를 다시 입력하세요.");
    		}		
    	}
    }
    728x90

    'back-end&DB > Java' 카테고리의 다른 글

    servlet 인코딩 방식  (0) 2023.06.13
    JAVA 제네릭스와 제네릭클래스  (0) 2023.05.27
    JAVA 추상과 인터페이스  (0) 2023.05.22
    JAVA MVC패턴  (0) 2023.05.22
    JAVA 상속과 오버라이딩(Overriding)  (0) 2023.05.19
Designed by Tistory.