KB IT’s Your Life 4기 - Java JDBC 21일차


JDBC

JDBC란?

자바는 DB와 연결해서 데이터 입출력 작업을 할 수 있도록 JDBC라이브러리(java.sql 패키지)를 제공한다.

  • JDBC는 데이터베이스관리시스템의 종류와 상관없이 동일하게 사용할 수 있는 클래스와 인터페이스로 구성된다.
  • DBMS 종류: 오라클, MySQL, MariaDB, SQLServer

JDBC Driver란?

JDBC인터페이스를 구현한 것으로 DBMS마다 별도로 다운로드 받아 사용한다.

  • DriverManager 클래스: JDBC Driver를 관리하며 DB와 연결해서 Connection 구현 객체 생성.
  • Connection 클래스 : 연결만하는 역할
  • Statement 인터페이스 : 텍스트 형태로. SQL의 DDL,DML문 실행시 사용
  • PreparedStatement : 바이너리 형태로 대부분 Statement말고 이걸 사용. SQL의 DDL,DML문 실행시 사용
  • CallableStatement: DB에 저장된 프로시저와 함수 호출
  • ResultSet: DB에서 가져온 데이터 읽음

JDBC 코딩 순서

  1. 사용하려는 DBMS의 jdbc 드라이버 파일을 classpath에 등록
  2. import java.sql.*
  3. 드라이버로딩 : Class.forName(“드라이버 클래스 전체 이름”)
  4. DBMS 연결 : DriverManager.getConnection(“jdbc프로토콜”, “ID”, “비번”)
  5. Statement 생성 : SQL 전송 및 결과 수신 -> statement(해킹 가능성 존재, 성능상 좀 떨어짐, 잘 안씀) / preparedStatement(많이 씀) / callableStatement 3가지 방식이 있음
  6. SQL 전송, 결과 수신 : DML전송하면 적용된 행의 개수가 반환 -> insert, update, delete select 전송하면 ResultSet 반환. -> 결과없음, 값1, 1개열, 1개행, 여러행 여러열
  7. 결과처리 : 값 추출
  8. 자원닫기 : 사용의 역순 -> ResultSet.close(), Statement.close(), Connection.close()

JDBC 구현

image

image

image

image

package day_0801;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class JDBCInsertExam {
	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		// 1. Jdbc Driver 로딩
		Class.forName("oracle.jdbc.driver.OracleDriver"); // oracle.jdbc.driver 패키지명 OracleDriver 클래스명 -> 동적로딩
		System.out.println("Jdbc Driver 로딩 성공");
		String url = "jdbc:oracle:thin:@127.0.0.1:1521/XE";
		String user = "hr";
		String password = "HR";
		// 2. DBMS 연결
		Connection con = DriverManager.getConnection(url, user, password);
		System.out.println("DBMS 로그인 성공");
		// 3. SQL 작성
		String sql = "INSERT INTO MEMBERS(id, name, password, status)";
		sql += "VALUES('user03','유저3','333','N')";
		// 4. Statement 생성
		PreparedStatement pstmt = con.prepareStatement(sql);
		// 5. 데이터 설정
		// 6. sql 전송 및 결과 수신
		//    DML 전송 : executeUpdate() : int
		//    SELECT 전송 : executeQuery() : ResultSet
		int count = pstmt.executeUpdate();
		System.out.println(count + "행 입력완료");
		// 7. 자원 반환
		pstmt.close();
		con.close();
	}
}

동적 value 넣기

package day_0801;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class JDBCInsertExam2 {
	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		// 1. Jdbc Driver 로딩
		Class.forName("oracle.jdbc.driver.OracleDriver"); // oracle.jdbc.driver 패키지명 OracleDriver 클래스명 -> 동적로딩
		System.out.println("Jdbc Driver 로딩 성공");
		String url = "jdbc:oracle:thin:@127.0.0.1:1521/XE";
		String user = "hr";
		String password = "HR";
		// 2. DBMS 연결
		Connection con = DriverManager.getConnection(url, user, password);
		System.out.println("DBMS 로그인 성공");
		// 3. SQL 작성
		String sql = "INSERT INTO MEMBERS(id, name, password, status)";
		sql += "VALUES(?,?,?,?)";
		// 4. Statement 생성
		PreparedStatement pstmt = con.prepareStatement(sql);
		// 5. 데이터 설정
		pstmt.setString(1, "user05");
		pstmt.setString(2, "유저5");
		pstmt.setString(3, "555");
		pstmt.setString(4, "N");
		// 6. sql 전송 및 결과 수신
		// DML 전송 : executeUpdate() : int
		// SELECT 전송 : executeQuery() : ResultSet
		int count = pstmt.executeUpdate();
		System.out.println(count + "행 입력완료");
		// 7. 자원 반환
		pstmt.close();
		con.close();
	}
}

data 수정 UPDATE

package day_0801;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class JDBCUpdateExam {
	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		// 1. Jdbc Driver 로딩
		Class.forName("oracle.jdbc.driver.OracleDriver"); // oracle.jdbc.driver 패키지명 OracleDriver 클래스명 -> 동적로딩
		System.out.println("Jdbc Driver 로딩 성공");
		String url = "jdbc:oracle:thin:@127.0.0.1:1521/XE";
		String user = "hr";
		String password = "HR";
		// 2. DBMS 연결
		Connection con = DriverManager.getConnection(url, user, password);
		System.out.println("DBMS 로그인 성공");
		// 3. SQL 작성
		String sql = "UPDATE MEMBERS set status = ?";
		sql += "WHERE id = ?";
		// 4. Statement 생성
		PreparedStatement pstmt = con.prepareStatement(sql);
		// 5. 데이터 설정
		pstmt.setString(1, "Y");
		pstmt.setString(2, "user05");
		// 6. sql 전송 및 결과 수신
		// DML 전송 : executeUpdate() : int
		// SELECT 전송 : executeQuery() : ResultSet
		int count = pstmt.executeUpdate();
		System.out.println(count + "행 수정완료");
		// 7. 자원 반환
		pstmt.close();
		con.close();
	}
}
	

데이터 삭제 delete


package day_0801;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

public class JDBCDeleteExam {
	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		// 1. Jdbc Driver 로딩
		Class.forName("oracle.jdbc.driver.OracleDriver"); // oracle.jdbc.driver 패키지명 OracleDriver 클래스명 -> 동적로딩
		System.out.println("Jdbc Driver 로딩 성공");
		String url = "jdbc:oracle:thin:@127.0.0.1:1521/XE";
		String user = "hr";
		String password = "HR";
		// 2. DBMS 연결
		Connection con = DriverManager.getConnection(url, user, password);
		System.out.println("DBMS 로그인 성공");
		// 3. SQL 작성
		String sql = "DELETE MEMBERS ";
		sql += "WHERE id = ?";
		// 4. Statement 생성
		PreparedStatement pstmt = con.prepareStatement(sql);
		// 5. 데이터 설정
		pstmt.setString(1, "user05");
		// 6. sql 전송 및 결과 수신
		// DML 전송 : executeUpdate() : int
		// SELECT 전송 : executeQuery() : ResultSet
		int count = pstmt.executeUpdate();
		System.out.println(count + "행 삭제완료");
		// 7. 자원 반환
		pstmt.close();
		con.close();
	}
}

ResultSet

String sql = "select count(*) from members"; -> 무조건 숫자 1개가 반환
String sql = "select count(*) from members where id=?"; -> id가 PK이면 0개 또는 1개 행 반환
String sql = "select id from members"; => 1개 열이 반환. 행 개수는 0~N개
String sql = "select * from members"; => N개 열, N개 행이 반환. 
package day_0801;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class JDBCSelectExam {
	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		// 1. Jdbc Driver 로딩
		Class.forName("oracle.jdbc.driver.OracleDriver"); // oracle.jdbc.driver 패키지명 OracleDriver 클래스명 -> 동적로딩
		System.out.println("Jdbc Driver 로딩 성공");
		String url = "jdbc:oracle:thin:@127.0.0.1:1521/XE";
		String user = "hr";
		String password = "HR";
		// 2. DBMS 연결
		Connection con = DriverManager.getConnection(url, user, password);
		System.out.println("DBMS 로그인 성공");
		// 3. SQL 작성
		String sql = "SELECT count(*) FROM MEMBERS ORDER BY id ";
		// 4. Statement 생성
		PreparedStatement pstmt = con.prepareStatement(sql);
		// 5. 데이터 설정
		// 6. sql 전송 및 결과 수신
		// DML 전송 : executeUpdate() : int
		// SELECT 전송 : executeQuery() : ResultSet
		ResultSet rs = pstmt.executeQuery();
			rs.next();
			int count = rs.getInt(1); //1대신, "count(*)"써도 됨.
		// 7. 자원 반환
		pstmt.close();
		con.close();
		System.out.println("count = " + count );
	}
}

모든 데이터 가져오기

package day_0801;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class JDBCSelectExam3 {
	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		// 1. Jdbc Driver 로딩
		Class.forName("oracle.jdbc.driver.OracleDriver"); // oracle.jdbc.driver 패키지명 OracleDriver 클래스명 -> 동적로딩
		System.out.println("Jdbc Driver 로딩 성공");
		String url = "jdbc:oracle:thin:@127.0.0.1:1521/XE";
		String user = "hr";
		String passwd = "HR";
		// 2. DBMS 연결
		Connection con = DriverManager.getConnection(url, user, passwd);
		System.out.println("DBMS 로그인 성공");
		// 3. SQL 작성
		String sql = "SELECT * FROM MEMBERS ORDER BY id ";
		// 4. Statement 생성
		PreparedStatement pstmt = con.prepareStatement(sql);
		// 5. 데이터 설정
		// 6. sql 전송 및 결과 수신
		// DML 전송 : executeUpdate() : int
		// SELECT 전송 : executeQuery() : ResultSet
		ResultSet rs = pstmt.executeQuery();
			while(rs.next()) {
				String id = rs.getString("id");
				String name = rs.getString("name");
				String password = rs.getString("password");
				String status = rs.getString("status");
				System.out.println(id + ", " + name +", "+ password + "," +status);
			};
			int count = rs.getInt(1);
		// 7. 자원 반환
		pstmt.close();
		con.close();
		System.out.println("count = " + count );
	}
}

image

package day_0801;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class JDBCSelectExam3 {
	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		// 1. Jdbc Driver 로딩
		Class.forName("oracle.jdbc.driver.OracleDriver"); // oracle.jdbc.driver 패키지명 OracleDriver 클래스명 -> 동적로딩
		System.out.println("Jdbc Driver 로딩 성공");
		String url = "jdbc:oracle:thin:@127.0.0.1:1521/XE";
		String user = "hr";
		String passwd = "HR";
		// 2. DBMS 연결
		Connection con = DriverManager.getConnection(url, user, passwd);
		System.out.println("DBMS 로그인 성공");
		// 3. SQL 작성
		String sql = "SELECT * FROM MEMBERS ORDER BY id ";
		// 4. Statement 생성
		PreparedStatement pstmt = con.prepareStatement(sql);
		// 5. 데이터 설정
		// 6. sql 전송 및 결과 수신
		// DML 전송 : executeUpdate() : int
		// SELECT 전송 : executeQuery() : ResultSet
		ResultSet rs = pstmt.executeQuery();
			while(rs.next()) {
				String id = rs.getString("id");
				String name = rs.getString("name");
				String password = rs.getString("password");
				String status = rs.getString("status");
				System.out.println(id + ", " + name +", "+ password + "," +status);
			};
			int count = rs.getInt(1);
		// 7. 자원 반환
		pstmt.close();
		con.close();
		System.out.println("count = " + count );
	}
}

image

DTO에 저장해서 이력을 모두 출력

package day_0801;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import day_0801.dto.LoginDto;

public class test5 {
    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1. Jdbc Driver 로딩
                Class.forName("oracle.jdbc.driver.OracleDriver");
                System.out.println("Jdbc Driver 로딩 성공");
                String url="jdbc:oracle:thin:@127.0.0.1:1521/XE";
                String user="hr";
                String password="HR";
                //2. DBMS 연결
                Connection con = DriverManager.getConnection(url, user, password);
                System.out.println("DBMS 로그인 성공");
                //3. SQL 작성
                String sql = "SELECT * FROM LOGIN, members "; //빈칸필수
                sql += "where login.member_id = members.id";
                //4. Statement 생성
                PreparedStatement pstmt = con.prepareStatement(sql);
                //5. 데이터 설정
                //6. SQL 전송, 결과수신
                //    DML 전송: executeUpdate() : int
                //    SELECT전송: excuteQuery() : ResultSet
                ArrayList<LoginDto> loginList = new ArrayList<LoginDto>();
                ResultSet rs = pstmt.executeQuery();
                while(rs.next()) {//조회결과가 있다
                    String member_id = rs.getString("member_id");
                    String login_date = rs.getString("login_date");
                    String login_time = rs.getString("login_time");
                    String logout_date = rs.getString("logout_date");
                    String logout_time = rs.getString("logout_time");
                    String name = rs.getString("name");
                    LoginDto dto = new LoginDto(member_id, login_date, login_time, logout_date, logout_time, name); //
                    loginList.add(dto);
                };
                //7. 자원반환
                pstmt.close();
                con.close();
                System.out.println(loginList);
    }
}

public class LoginDto {
    private String member_id, login_date, login_time, logout_date, logout_time, name;
    public LoginDto() {
    }
    public LoginDto(String member_id, String login_date, String login_time, String logout_date, String logout_time, String name) {
        super();
        this.member_id = member_id;
        this.login_date = login_date;
        this.login_time = login_time;
        this.logout_date = logout_date;
        this.logout_time = logout_time;
        this.name = name;
    }
    public String getMember_id() {
        return member_id;
    }
    public void setMember_id(String member_id) {
        this.member_id = member_id;
    }
    public String getLogin_date() {
        return login_date;
    }
    public void setLogin_date(String login_date) {
        this.login_date = login_date;
    }
    public String getLogin_time() {
        return login_time;
    }
    public void setLogin_time(String login_time) {
        this.login_time = login_time;
    }
    public String getLogout_date() {
        return logout_date;
    }
    public void setLogout_date(String logout_date) {
        this.logout_date = logout_date;
    }
    public String getLogout_time() {
        return logout_time;
    }
    public void setLogout_time(String logout_time) {
        this.logout_time = logout_time;
    }    
    public String getname() {
        return name;
    }
    public void setname(String name) {
        this.name = name;
    }
    @Override
    public String toString() {
        return "member_id=" + member_id + ", login_date=" + login_date + ", login_time=" + login_time
                + ", logout_date=" + logout_date + ", logout_time=" + logout_time +", name="+name;
    }
    
}