ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • JDBC의 개념과 연결 방법, DB Cursor
    JAVA/JDBC 2024. 5. 31. 12:34

    ▤ 목차

      ✔ JDBC

      데이터를 가져오는데 가장 먼저 되어야하는 것 연결이다.

       

      • 각각 회사에서 만들어 놓은 클래스이다. (드라이버 각 벤더사 홈에서 다운받아야한다.)
      • 자바 패키지의 일부로 자바 프로그램과 데이터베이스와 연결하여 데이터를 주고 받게 해주는 프로그래밍 인터페이스(설명서)이다.
      • SQL 처리 관련, DB연결 관련, 데이터베이스 정보와 관련된 사항을 가진다.

       

      ⌨ 데이터 처리 관련 인터페이스

      1. Class.forName : 드라이버 찾아서 로딩
      2. DriverManager : Connection 을 활성화한다.
      3. Connection : 데이터베이스와 연결, DriverManager.getConnection()으로 얻는다.
      4. statement : SQL문을 실행한다. ( executeQuery(), executeUpdate(), execute()메소드를 이용). SQL문을 String형식으로 동적인 sql문을 자유롭게 사용할 수 있다.sql문을 실행할때마다 매번 구문을 해석해야 하는 오버헤드가 생기며 약간 다른 SQL문일지라도 SQL문을 새로 작성하여 실행하는 비효율이 발생한다.
      5. ResultSet : select에 의해 클라이언트 컴퓨터로 loading된 결과물이 나온다. SQL 요청에 응답하는 아는 인터페이스이다.

       

      💻 JDBC의 동작 흐름

       

      👏 중요

      JDBC는 Java Database Connectivity의 약자이다.

      자바와 데이터베이스(DB)를 연결해주는 통로와 같은 것을 말한다.

      자바를 이용한 DB접속과 SQL문장의 실행 그리고 그 결과로 얻어진 데이터의 핸들링을 제공하는 일종의 설명서이다.

      자바 프로그램내에서 SQL문을 실행하기 위한 자바 API인 것이다.

       

      ✔ 프로그래밍 방법

      • JAVA에서 만든 것이 아닌 각 데이터베이스 회사에서 만들었다. 때문에 각 회사마다 사용하는 인터페이스가 다르다.

      ✨ 다운받기

      https://mariadb.com/kb/en/about-mariadb-connector-j/

       

      About MariaDB Connector/J

      LGPL-licensed MariaDB client library for Java applications.

      mariadb.com

      💻 외부 .jar 파일 가져오기

      원하는 프로젝트에서 우클릭을 한 후 Build path를 누른다.

       

       

      사용할 Class를 확인해보자.

       

      👏 중요

       

      ⌨ BD 로딩

      public class DbTest1 {
      	private Connection conn;
      	private Statement stmt;
      	private ResultSet rs;
      	
      	public DbTest1() {
      		// 1. Driver file loading 
      		try {
      			//Unhandled exception type ClassNotFoundException >예외처리
      			Class.forName("org.mariadb.jdbc.Driver");
      			//mysql
      			//Class.forName("com.mysql.jdbc.Driver");
      			//oracle
      			//Class.forName("oracle.jdbc.driver.OracleDriver"); 
      			
      		} catch (Exception e) {
      			System.out.println("로딩 실패: "+e);
      			return;
      		}
      		System.out.println("go");
      	}
      	
      	public static void main(String[] args) {
      		new DbTest1();
      
      	}
      
      }

      > 콘솔창에 go가 찍힌다면 잘 연결된것이다.

       

      💻 DB server와 연결한다.

      [형식]

      String url="jdbc:mariadb://localhost:port번호/DB명";

      [코드]

      
      		
      		// 2. DB server와 연결
      		try {
      			//String url="jdbc:mariadb://localhost:port번호/DB명";
      			String url="jdbc:mariadb://localhost:3306/test";
      			conn = DriverManager.getConnection(url,"root","123"); //url, db user명, 비밀번호
                  //실제로는 사용자명, 비밀번호는 파일로 암호화 시킨다.
      		} catch (Exception e) {
      			System.out.println("연결 실패: "+e.getMessage());
      		}
      	
      }

       

      👏 DB에 SQL문장 실행

      		try {
      			//sangdata 테이블 자료 읽기
      			stmt = conn.createStatement(); //connection 객체 생성
      			
      			rs = stmt.executeQuery("select * from sangdata"); //SQL문장
      			rs.next(); // cursor(레코드 포인터) 이동 (처음에는 데이터 상단에 존재한다.)
      			System.out.println(rs.getString("sang")); // getString(칼럼명)
      			
      		} catch (Exception e) {
      			System.out.println("처리 실패: "+e.getMessage());
      		}

       

      🫥 DB CURSOR POINT

      커서란, SQL문을 처리한 결과 집합을 가리키는 일종의 포인터이다.

      C에서 나오는 포인터 개념과 유사하다.

      데이터베이스 커서는 데이터의 특정 위치를 가리킬때 사용된다.

      방대한 양의 데이터에서 특정 행(row)를 가리킬때 커서가 사용된다.

      resultSet API를 읽어보면 가장 초반에 cursor는 첫 데이터 위쪽에 위치하고 있음을 알 수 있다.

      즉, 처음에 데이터 상단에 존재한다. 포인터를 내려주는 메서드가 .next()이다.

       .next() 를 사용하면 다음 데이터의 존재 유무를 알 수 있다.

      반환값은 ture 혹은 false를 갖는다.

       

      ✔.getString("칼럼명")

      ✏️ 칼럼은 순서가 있기에 숫자로 가져올 수 있다.

      try {
      	stmt = conn.createStatement();
          rs = stmt.executeQuery("select code as 코드 ,sang as 상품 ,su as 수량 ,dan as 단가 from sangdata");
          while(rs.next()){
      		String code = rs.getString(1); //수량
      		String sangName = rs.getString(2); // 상품
      		int su = rs.getInt(3); //수량
      		int dan = rs.getInt(4); //단가
      		System.out.println(code + " " + sangName + " "+su +" " + dan );
      	}
          
      } catch (Exception e) {
      		System.out.println("처리 실패: "+e.getMessage());
      } finally{
      	try {
      		if (rs != null) rs.close(); //Unhandled exception type SQLException
      		if (stmt != null) stmt.close();
      		if (conn != null) conn.close();
      	} catch (Exception e2) {
      		// TODO: handle exception
      	}
      }

      ✏️별명을 부여했다면 별명으로 가져와야한다.

      try {
      	stmt = conn.createStatement();
          rs = stmt.executeQuery("select code as 코드 ,sang as 상품 ,su as 수량 ,dan as 단가 from sangdata");
          while(rs.next()){
      		String code = rs.getString("코드"); //수량
      		String sangName = rs.getString("상품"); // 단가
      		int su = rs.getInt("수량"); //수량
      		int dan = rs.getInt("단가"); //단가
      		System.out.println(code + " " + sangName + " "+su +" " + dan );
      	}
          
      } catch (Exception e) {
      		System.out.println("처리 실패: "+e.getMessage());
      } finally{
      	try {
      		if (rs != null) rs.close(); //Unhandled exception type SQLException
      		if (stmt != null) stmt.close();
      		if (conn != null) conn.close();
      	} catch (Exception e2) {
      		// TODO: handle exception
      	}
      }

      만약 이렇게 가져오지 않는다면

      Unknown label 'code'. Possible value [상품명, dan, 코드, su, sangdata.dan, sangdata.코드, sangdata.su, sangdata.상품명

      위와 같 에러를 발생시킨다.

      😊정리

      Curser는 집합에 있는 각 레코드들을 한 번에 하나씩 지시할 수 있게 하는 역할을 수행한다.

       

       

      https://ittrue.tistory.com/250#google_vignette

       

      [Java] JDBC란 무엇인가? - Java Database Connectivity

      JDBC란? JDBC(Java Database Connectivity)는 Java 기반 애플리케이션의 데이터를 데이터베이스에 저장 및 업데이트하거나, 데이터베이스에 저장된 데이터를 Java에서 사용할 수 있도록 하는 자바 API이다. JDB

      ittrue.tistory.com

       

    Designed by Tistory.