JDBC란?

jungnoeun·2021년 7월 21일
3

bc

목록 보기
5/7

JDBC

  • Java Database Connectivity
  • 자바언어와 DB를 연결해주는 통로와 같은 것.
  • 자바를 이용한 DB접속과 SQL문장의 실행, 그리고 실행 결과로 얻어진 데이터의 핸들링을 제공하는 방법과 절차에 관한 규약.
  • 자바 프로그램내에서 SQL문을 실행하기 위한 자바 API.
  • SQL과 프로그래밍 언어의 통합 접근 중 한 형태




필요한 이유

  • db 학습시 SQL이용해서 db에다 직접 값을 넣거나 조회하는 등의 일을 수행했음.
  • 하지만 우리가 웹을 동작,수행시킬 때마다 매번 그럴 수는 없음.
  • 그래서 프로그램이 이 일을 대신할 수 있게 만들어줘야 하는데 이때 사용하는 것이 JDBC이다.

  • JAVA는 표준 인터페이스인 JDBC API를 제공한다. 그래서 사용하기 편하다. 인터페이스가 이미 정의되어 있기 때문에, 어떤 db벤더든 간에 다 똑같은 방법으로 사용하면 된다.
  • DB벤더, 또는 기타 써드파티에서는 JDBC 인터페이스를 구현한 드라이버(driver)를 제공한다. 그래서 사용자들은 이런 드라이버를 이용하면 된다.









JDBC를 이용한 프로그래밍 방법

JDBC 클래스의 생성관계

  • 드라이버 로딩시 DriverManager라는 객체가 갖고 있는 메서드를 이용해서 드라이버를 로딩한다. 그래서 DriverManager 객체를 이용해서 Connection 인스턴스를 얻어내고, Connection 인스턴스를 통해서 Statement 객체를 얻어내고, Statement객체를 통해 ResultSet을 얻어낸다. 그래서 닫을때는 열때와 반대순서로 닫아주어야 한다.









0.환경구성

  • JDK 설치
  • JDBC 드라이버 설치
    - Maven에 다음과 같은 의존성을 추가한다. MySQL사이트에서 다운로드한다. 즉, Maven에서 이용할때는 이런 의존성을 추가해주면 된다.
    <dependency>
      <groupld>mysql</groupld>
      <artifactld>mysql-connector-java</artifactls>
      <version>5.1.45<version>
    <dependency>



JDBC를 사용하겠다는 것은 DB를 사용하겠다는 것임.








1. IMPORT

import java.sql.*;
  • 자바코드에서 나랑 다른 패키지에 있는 클래스를 사용하기 위해서 반드시 import해줘야 한다.









2. 드라이버 로드

Class.forName("com.mysql.jdbc.Driver");
  • 이는 드라이버를 로드하는 코드인데 각각 DB벤더에서 제공하는 객체이다. jdbc.Driver패키지명.클래스명이다. 해당 객체를 Class라는 클래스가 갖고 있는 forName이라는 메소드를 이용하면 해당 객체가 메모리에 올라간다.









3. Connection 얻기

String dburl = "jdbc:mysql://localhost/dbName";
Connection con = DriverManager.getConnection(dburl,ID,PWD);
  • connection 객체를 얻어낼때 사용하는 객체가 DriverManager라는 객체이다. 그래서 DriverManager가 갖고 있는 getConnection을 이용하면 어떤 URL에 접속할거냐(DB가 있는 IP주소), 즉 DB가 있는 URL이다. 그리고 DB의 user, password를 입력해주면 연결할 수 있다.
    이때 dburl을 정하는 방식도 DB에 따라 다른데, 각각 DB벤더에서 알려준다.
  • connection 객체 생성 = DB에 접속하겠다. connection객체는 db가 접속됐을 때 얻어내줄 수 있는 객체이다. connection 객체라곤 하지만 connection은 인터페이스이고, 이 객체는 각각의 벤더가 구현하고 있는 객체여야 한다. 그러려면 벤터가 제공해주는 라이브버리를 사용할 수 있어야 하는데 이것을 사용할 수 있게 해주는 것이 로딩하는 것이다. 즉 드라이버를 로드하는 것이다. 그래서 로드먼저 해야 한다.

예제

public static Connection getConnection() throws Exception{
	//오라클 사용시 정의되는 URL 형식
	String url = "jdbc:oracle:thin:@117.16.46.111:1521:xe"; 
	String user = "smu"; //DB의 user
	String password = "smu";//DB의 password
	Connection conn = null;
    //오라클 벤더가 제공하고 있는 클래스 이름
	Class.forName("oracle.jdbc.driver.OracleDriver"); 
	conn = DriverManager.getConnection(url, user, password);
	return conn;
}









4. Statement 생성 및 질의수행


//Statement 생성
Statement stmt = con.createStatement();

//질의 수행
ResultSet rs = stmt.executeQuery("select no from user");
  • 명령생성으로 실제 쿼리(select,insert..등)를 사용하면 된다. 이런 쿼리를 사용하기 위해서는 반드시 Statement 객체를 얻어야 한다.

//any SQL
stmt.execute("query");

//Select
stmt.executeQuery("query");

//Insert,Update,Delete
stmt.executeUpdate("query");
  • Statement 객체에 쿼리문을 작성하고 실행해달라는 메서드(execute)를 사용한다. 해당 메서드는 실행할 쿼리가 Select냐 Insert냐 Update냐 Delete냐 에 따라서 메서드가 달라진다.
  • 그리고 statement객체를 이용해서 ResultSet을 얻어낼 수 있다.

  • statement객체가 하는 일은 select..하고 만드는 것이다. 즉, 쿼리문을 생성하고 수행하도록 도와주는 것이다. 이 statement도 인터페이스이고, 실제로 db벤더가 무엇이냐에 따라서 이 statement객체를 구현한 객체가 리턴이 될 것이다.









5. ResultSet으로 결과 받기

ResultSet rs = stmt.executeQuery("select no from user");
while(rs.next()) //레코드상에서 다음것이 있는 동안에 
  System.out.println(rs.getInt("no")); 
  //가리키고 있는 거에서 칼럼명이 no인애 값을 하나 꺼내와라
  • 현재 ResultSet은 DB쪽에 있고, 이 DB ResultSet에 레퍼런스(rs)를 얻어온 것이고, 이를 가지고 실행해야 한다.
  • 클라이언트가 우리 프로그램이라고 했을 때, 실행해달라 했을때 결과를 준다 했는데 이 결과셋은 DB가 가지고 있는 것이고 이 결과값을 가리킬 수 있는 레퍼런스 변수만 온다.
  • 즉, ResultSet에서 시작해서 하나씩 꺼내온다.
  • 그런 다음에 데이터베이스가 준 결과값을 가지고 결과를 꺼내올 수 있는데, 만약 SQL문에 결과물이 있으면 ResultSet객체를 생성한다. 그래서 쿼리문이 뭐냐에 따라 조금 다르게 실행된다.





6. Close

rs.close();
stmt.close();
con.close();
  • 그리고 모든 객체를 닫아야 한다. 단, 닫는 순서가 반드시 거꾸로여야 한다.
  • 가장 마지막에 열린 ResultSet(rs)를 가장 먼저 닫아줘야 한다.





  • 프레임워크는 반복되는 코드를 알아서 실행시켜준다.
profile
개발자

0개의 댓글