Java-DB연동하기 + SELECT문

heeezni·2025년 5월 26일
post-thumbnail

⚙ Java-DB연동하기 (수동)

  1. Maven Repository에서 mysql-connector-java.jar 받기

  2. lib 폴더 만들어서 JAR 넣기

  3. Build Path 설정
    Project 우클릭 > Build Path > Configure Build Path > Libraries탭

    (1) Classpath에 jar 직접 추가 방법

    Classpath 항목 선택
    ➕ Add JARs... 또는 Add External JARs... 클릭
    lib/mysql-connector-java.jar 선택
    Apply and Close

    (2) User Library로 등록해서 재사용하고 싶다면? ✅

    Add LibraryUser Library 선택 → Next
    New... 클릭 → 이름 : lib
    ➕ Add JARs... 눌러서 lib/mysql-connector-java.jar 찾아 추가
    확인 → 프로젝트에 이 라이브러리 연결


Select는 ResultSet을 리턴

쿼리 실행하기

구분메서드설명
DDL, DMLexecuteUpdate()데이터 변경 계열 쿼리 실행 (리턴: 변경된 행 수 int)
SELECTexecuteQuery()데이터 조회 쿼리 실행 (리턴: ResultSet)
  • DML=insert, update, delete
  • DDL=create, drop, alter

ResultSet

SELECT 쿼리 결과를 행(Row) 단위로 저장해주는 객체
JDBC에서 executeQuery() 메서드를 실행하면 이 ResultSet을 반환해줌

ResultSet rs = null;
rs.next();

select 하기

// DB 접속 성공 후
    String sql = "SELECT * FROM emp"; // emp 테이블 전체 조회
    pstmt = con.prepareStatement(sql); // 쿼리 준비

    rs = pstmt.executeQuery(); // SELECT문 실행 → 결과 집합(ResultSet) 반환

    // ResultSet 초기 커서 위치는 첫 번째 행 "이전"
    while(rs.next()) {  // 커서를 한 줄씩 아래로 이동하며 반복

        // 현재 커서가 가리키는 행에서 각 컬럼 값 추출
        String ename = rs.getString("ename");    
        int sal = rs.getInt("sal");             
        String job = rs.getString("job");       
        String hiredate = rs.getString("hiredate");

        // 결과 출력
        System.out.println("ename = " + ename 
                         + ", sal = " + sal 
                         + ", job = " + job 
                         + ", hiredate = " + hiredate);

MySQL에서 유저 생성하기

mysql -h localhost -u root -p

show databases;
use mysql;

-- 각 유저 테이벌의 정보 알아보기
desc user;
--user 테이블 : MySQL에서 모든 사용자 계정과 권한을 
--			   저장/관리하는 핵심 시스템 테이블

-- 등록된 유저와 접속 허용 정보 확인
select user, host from user;

-- 유저 만들기
create user 'java'(유저명)@'%'(접속정보)identified by '****'(비밀번호);
(%: ip로 접속 가능)

-- 권한 부여
grant all privileges on dev.(접속 db명)* to 'java'@'%' with grant option;

-- 권한 갱신
flush privileges;

Oracle에서 user 생성하기


MySQL - emp 테이블 JTable로 출력하기

MySQL의 emp 테이블 데이터를 조회하여 JTable에 출력해보자!

package db;

import java.sql.*;
import javax.swing.*;

public class EmpLoad extends JFrame {

    JTable table;               // DB 결과를 보여줄 표 컴포넌트
    JScrollPane scroll;         // 표에 스크롤 기능 추가
    String[][] data = null;     // 몇 건인지 알 수 없으므로 null
    String[] columns = {
        "empno", "ename", "job", "mgr", "hiredate", "sal", "comm", "deptno"
    };
     
    //✅ DB에서 emp 테이블 데이터를 조회하고, 2차원 배열 data에 저장
    public void loadData() {
        String url = "jdbc:mysql://localhost:3306/dev"; //⭐암기
        String user = "java";                           
        String pwd = "****";                           

        Connection con = null;             // DB 접속 정보 객체
        PreparedStatement pstmt = null;    // SQL 실행 객체
        ResultSet rs = null;               // 표 데이터를 표현한 객체

        try {
            // 1. JDBC 드라이버 로드
            Class.forName("com.mysql.cj.jdbc.Driver");
            System.out.println("Driver Load Success!!");

            // 2. DB 연결
            con = DriverManager.getConnection(url, user, pwd);
            if (con != null) {
                System.out.println("DB 접속 성공!");

                // 3. SQL 준비 및 실행
                String sql = "SELECT * FROM emp ORDER BY empno ASC";
                pstmt = con.prepareStatement(sql,
                    ResultSet.TYPE_SCROLL_INSENSITIVE, // 커서 자유 이동 가능
                    ResultSet.CONCUR_READ_ONLY          // 읽기 전용
                );
                rs = pstmt.executeQuery(); // select문은 ResultSet으로 결과를 받음

                // 4. 레코드 수 파악
                rs.last(); // 레코드의 마지막 행으로 강제이동
                int total = rs.getRow(); // 총 레코드 수
                System.out.println("▶ 총 레코드 수: "+total);

                // 5. 배열 크기 결정
                data = new String[total][8];

                // 6. 커서 초기화 후, 반복문으로 데이터 추출
                rs.beforeFirst(); // 커서를 처음 이전 위치로 이동
                int i = 0;
                while (rs.next()) {
                    data[i][0] = rs.getString("empno");
                    data[i][1] = rs.getString("ename");
                    data[i][2] = rs.getString("job");
                    data[i][3] = rs.getString("mgr");
                    data[i][4] = rs.getString("hiredate");
                    data[i][5] = rs.getString("sal");
                    data[i][6] = rs.getString("comm");
                    data[i][7] = rs.getString("deptno");
                    i++;
                }
            }

        } catch (ClassNotFoundException e) {
            System.err.println("❌ 드라이버 클래스를 찾을 수 없습니다.");
            e.printStackTrace();
        } catch (SQLException e) {
            System.err.println("❌ SQL 오류 발생");
            e.printStackTrace();
        } finally {
            // 7. 자원 해제 (역순으로 닫기)
            try {if(rs!=null)rs.close();} catch (SQLException e){e.printStackTrace();}
            try {if(pstmt!=null)pstmt.close();} catch (SQLException e){e.printStackTrace();}
            try {if(con!=null)con.close();} catch (SQLException e){e.printStackTrace();}
        }
    }

    //✅ 생성자: 데이터 로드 및 GUI 구성
    public EmpLoad() {
        loadData(); 
        // DB로부터 사원 정보 로드한 후에 테이블에 정보 출력!

        // JTable 구성
        table = new JTable(data, columns);
        scroll = new JScrollPane(table); // 스크롤 추가

        add(scroll);
        
        setSize(800, 600);
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    }
    public static void main(String[] args) {
        new EmpLoad();
    }
}

주요개념

1️⃣ 커서 이동을 자유롭게 하기 위한 설정

PreparedStatement pstmt = con.prepareStatement(sql,
    ResultSet.TYPE_SCROLL_INSENSITIVE,
    ResultSet.CONCUR_READ_ONLY
);
  • TYPE_SCROLL_INSENSITIVE :
    커서를 앞뒤, 임의 위치로 자유롭게 이동 가능
    DB 내용이 바뀌어도 반영되지 않음
    (SELECT가 실행된 순간에 조회된 데이터만 갖고 작업)

  • CONCUR_READ_ONLY :
    결과 집합을 읽기 전용으로 사용. 수정 불가 (데이터 보호)

▶ 이 설정이 필요한 이유:
rs.last() 로 커서를 마지막 행으로 이동하여 전체 레코드 수 파악

rs.last(); // 레코드의 마지막 행으로 강제이동
int total = rs.getRow(); // 총 레코드 수
data=new String[total][8];

rs.beforeFirst() 로 다시 커서를 맨 앞으로 돌려서 데이터 반복 처리

last( ) 와 beforeLast( ) 메서드의 차이

  • last()는 실제 마지막 데이터에 커서를 위치시킴
    → 바로 읽을 수 있음
  • beforeLast()는 마지막 직전의 위치에 커서를 둠
    next() 호출해야 데이터 접근 가능

2️⃣ JTable

Java Swing에서 표 형식의 데이터를 시각적으로 표현하는 GUI 컴포넌트
DB 결과나 배열 데이터를 테이블 형태로 출력할 수 있게 해줌.

new JTable(data, columns) 2차원 배열과 열 제목을 받아 테이블 생성

//데이터에 사용될 이차원 배열
String[][] data = {
    {"101", "Alice", "개발자"},
    {"102", "Bob", "디자이너"},
};

//컬럼에 사용될 일차원 배열
String[] columns = {"사번", "이름", "직무"};

JTable table = new JTable(data, columns);

JScrollPane scroll = new JScrollPane(table);
frame.add(scroll); 

JScrollPane(스크롤)을 설정하는 이유 :
데이터가 많을 때 화면에 다 안 보이기 때문

profile
아이들의 가능성을 믿었던 마음 그대로, 이제는 나의 가능성을 믿고 나아가는 중입니다.🌱

0개의 댓글