[Java] JDBC

JDBC

-  자바에서 데이터베이스에 접속할 수 있도록 하는 자바 API이다.

-  JDBC는 데이터베이스에서 자료를  CRUD하는 방법을 제공한다.

-  JDBC는 실제 데이터베이스와 연결해주기만 할 뿐 실질적인 기능은 데이터베이스가 갖고 있다.

-  따라서 JDBC를 통해 데이터베이스와 Java프로젝트를 연결한 뒤 데이터베이스 드라이버를 로드해야 사용자가 데이터베이스에 정보를 저장할 수 있는 기반을 마련했다고 할 수 있다.

 

JDBC 기본 코드 - Select 작업

import java.sql.*;

public class JDBC{
	public static void main (String[] args){
        Connection conn = null; // DB 서버와 연결하는 객체
        Statement stmt = null; // SQL을 실행하는 객체 - DB와 소통하는 통로
        ResultSet rs = null; // 실행 결과를 받아오는 객체 - select 쿼리에 사용
        String url = "jdbc:mysql://123.123.123.133:3306/jdbc"; // Ip,Port,DB이름
        String id = "phb"; // 생성한 계정이름
        String pw = "qwer1234"; // 계정의 비밀번호
        try {
        	Class.forName("com.mysql.jdbc.driver"); // 드라이버 로딩
        	conn = DriverManager.getConnection(url, id, pw); // DB 접속
            stmt = conn.createStatement(); // SQL을 실행 , DB와 소통하는 통로
            
            // select 쿼리 실행시..
            String sql = "SELECT * FROM signup WHERE sname='"+sname+"' AND sage = '"+sage+"'";
            rs = stmt.executeQuery(sql);
			}
			
            while(rs.next()) // 한 건 씩 처리 , 있으면 1 없으면 0 // boolean 타입
            {
                out.println(rs.getString("sname")); // 접속하려는 DB마다 다르다
                out.println(rs.getInt("sage")); // 컬럼 타입 및 컬럼 이름 
            }

        } catch (SQLException ex) {
            System.out.println("SQLException: " + ex.getMessage());
            System.out.println("SQLState: " + ex.getSQLState());
            System.out.println("VendorError: " + ex.getErrorCode());
        }
        finally { // 스트림은 열어준 순서의 역순으로 닫아주면 된다.
            try {
                if(rs != null)
                    rs.close();

                if (stmt != null)
                    stmt.close();

                if (conn != null)
                    conn.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
   	}
}

 

JDBC 기본 코드 - Insert 작업

import java.sql.*;

public class JDBC{
	public static void main (String[] args){
        Connection conn = null; // DB 서버와 연결하는 객체
        Statement stmt = null; // SQL을 실행하는 객체 - DB와 소통하는 통로
        ResultSet rs = null; // 실행 결과를 받아오는 객체 - select 쿼리에 사용
        String url = "jdbc:mysql://123.123.123.133:3306/jdbc"; // Ip,Port,DB이름
        String id = "phb"; // 생성한 계정이름
        String pw = "qwer1234"; // 계정의 비밀번호
        try {
        	Class.forName("com.mysql.jdbc.driver"); // 드라이버 로딩
        	conn = DriverManager.getConnection(url, id, pw); // DB 접속
            stmt = conn.createStatement(); // SQL을 실행 , DB와 소통하는 통로
            
            // Insert 쿼리 실행시..
            String sql =  "INSERT INTO signup (sid, spw) VALUES ('" + sid + "' , '" + spw + "')";
            // String sql1 = String.format("INSERT INTO signup (sid, spw) VALUES('%s', '%s')", sid, spw);
            Integer result = stmt.executeUpdate(sql); // insert 작업
			
            PrintWriter out = response.getWriter();
            if (result > 0) {
                System.out.println("정상적으로 insert 됐다");
                out.println("login success");
            } else {
                System.out.println("insert 안됨");
                out.println("login failed");
            }

        } catch (SQLException ex) {
            System.out.println("SQLException: " + ex.getMessage());
            System.out.println("SQLState: " + ex.getSQLState());
            System.out.println("VendorError: " + ex.getErrorCode());
        }
        finally { // 스트림은 열어준 순서의 역순으로 닫아주면 된다.
            try {
                if (stmt != null)
                    stmt.close();

                if (conn != null)
                    conn.close();
            } catch (SQLException e) {
                throw new RuntimeException(e);
            }
        }
   	}
}

 

Select 작업과 Insert 작업의 차이점

Select Insert
rs = stmt.executeQuery(sql);  Integer result = stmt.executeUpdate(sql); 
Resultset 스트림을 직접적으로 사용한다. Resultset 스트림을 직접적으로 사용하지 않는다.
-> 스트림을 닫아줘야한다. -> 스트림을 닫아주지 않아도 된다.

 

Stream을 닫아주는 이유

이들 객체를 사용할 때는 적절한 시점에서 close() 메서드를 호출하여 자원을 명시적으로 해제해주어야 한다.

이는 메모리 누수를 방지하고 프로그램의 성능을 유지하기 위한 중요한 절차이다.